From f363505de6feaeb34df1022eaafbb275cab42dd2 Mon Sep 17 00:00:00 2001 From: Jason Porter <84735036+jsonporter@users.noreply.github.com> Date: Mon, 26 Feb 2024 09:19:54 -0800 Subject: [PATCH] Console refresh (#843) * Console refresh Signed-off-by: Jason Porter * linting Signed-off-by: Jason Porter * Fixed jest config Signed-off-by: Jason Porter * Updated README Signed-off-by: Jason Porter * Fixed package vulnerabilities Signed-off-by: Jason Porter * Upgrading protobufjs Signed-off-by: Jason Porter * Trying protobuf fix again Signed-off-by: Jason Porter * Trying protobuf fix again+1 Signed-off-by: Jason Porter * now fixing semver Signed-off-by: Jason Porter * Updated README, removed unused env vars Signed-off-by: Jason Porter --------- Signed-off-by: Jason Porter --- .dockerignore | 44 +- .eslintignore | 25 +- .eslintrc.js | 163 +- .gitignore | 75 +- .husky/commit-msg | 7 - .husky/pre-commit | 2 - .prettierrc.yml | 26 +- .releaserc.js | 8 +- .storybook/main.js | 15 +- .storybook/preview.js | 2 +- .tool-versions | 2 +- .vscode/extensions.json | 22 +- .vscode/launch.json | 16 - .vscode/settings.json | 64 +- Dockerfile | 25 +- Makefile | 44 +- README.md | 172 +- commitlint.config.js | 5 +- jest.config.js | 47 +- package-lock.json | 34852 ---------------- package.json | 231 +- packages/common/LICENSE | 202 - packages/common/README.md | 5 - packages/common/jest.config.js | 7 + packages/common/package.json | 66 +- .../common/src/Errors/NotAuthorizedError.ts | 8 + packages/common/src/Errors/NotFoundError.ts | 7 + packages/common/src/Errors/ParameterError.ts | 7 + packages/common/src/Errors/ValueError.ts | 10 + .../common/src/Utils/decodeProtoResponse.ts | 6 + .../Utils/getInputDefintionForLiteralType.ts | 48 + packages/common/src/config/index.ts | 50 - .../src/constants/index.ts} | 7 +- .../common/src/constants/tableConstants.ts | 2 + packages/common/src/environment/index.ts | 64 +- packages/common/src/flyteidl/admin.ts | 6 + packages/common/src/flyteidl/core.ts | 6 + packages/common/src/flyteidl/coreTypes.ts | 88 + packages/common/src/flyteidl/event.ts | 6 + packages/common/src/flyteidl/protobuf.ts | 8 + packages/common/src/flyteidl/protobufTypes.ts | 12 + packages/common/src/flyteidl/service.ts | 6 + packages/common/src/index.ts | 3 - packages/common/src/routes/index.ts | 52 +- .../{console => common}/src/tsd/globals.d.ts | 0 .../common}/src/tsd/index.d.ts | 4 +- .../src/types/adminEntityTypes.ts} | 15 +- packages/common/tsconfig.build.es.json | 7 - packages/common/tsconfig.build.json | 9 +- packages/common/tsconfig.json | 7 - packages/common/tsconfig.test.json | 3 - packages/components/LICENSE | 202 - packages/components/README.md | 5 - packages/components/jest.config.js | 14 - packages/components/package.json | 60 - .../src/AppInfo/__mocks__/appInfo.mock.ts | 12 - .../AppInfo/__stories__/appInfo.stories.tsx | 56 - packages/components/src/AppInfo/index.tsx | 79 - packages/components/src/AppInfo/strings.ts | 9 - .../src/AppInfo/test/appInfo.test.tsx | 48 - .../components/src/AppInfo/versionDisplay.tsx | 92 - .../src/Sample/__stories__/sample.stories.tsx | 36 - packages/components/src/Sample/index.tsx | 52 - .../src/Sample/test/sample.test.tsx | 11 - packages/components/src/index.ts | 1 - packages/components/tsconfig.build.es.json | 16 - packages/components/tsconfig.build.json | 27 - packages/components/tsconfig.json | 25 - packages/components/tsconfig.test.json | 11 - packages/console/LICENSE | 202 - packages/console/README.md | 5 - packages/console/jest.config.ts | 37 - packages/console/package.json | 145 - packages/console/src/assets/SmallArrow.svg | 3 - .../console/src/basics/ExternalConfigHoc.tsx | 5 - .../ExternalConfigurationProvider.tsx | 34 - .../ExternalConfigurationProvider/index.ts | 1 - .../src/basics/FeatureFlags/AdminFlag.tsx | 29 - .../basics/FeatureFlags/FeatureFlags.test.tsx | 116 - .../src/basics/FeatureFlags/defaultConfig.ts | 61 - .../console/src/basics/FeatureFlags/index.tsx | 7 - packages/console/src/basics/index.ts | 4 - packages/console/src/common/index.ts | 4 - packages/console/src/common/promiseUtils.ts | 11 - packages/console/src/common/timer.ts | 20 - packages/console/src/components/App/App.tsx | 129 - .../src/components/Breadcrumbs/async/utils.ts | 95 - .../components/BreadcrumbFormControl.tsx | 229 - .../Breadcrumbs/components/index.ts | 13 - .../components/Breadcrumbs/hooks/index.tsx | 64 - .../src/components/Breadcrumbs/index.ts | 5 - .../components/Breadcrumbs/viewAll/index.ts | 23 - .../components/Entities/EntityDescription.tsx | 175 - .../src/components/Entities/EntityDetails.tsx | 130 - .../Entities/EntityDetailsHeader.tsx | 136 - .../components/Entities/EntityExecutions.tsx | 98 - .../Entities/EntityExecutionsBarChart.tsx | 126 - .../src/components/Entities/EntityInputs.tsx | 240 - .../components/Entities/EntitySchedules.tsx | 121 - .../components/Entities/EntityVersions.tsx | 145 - .../console/src/components/Entities/Row.tsx | 32 - .../VersionDetails/EntityVersionDetails.tsx | 72 - .../EntityVersionDetailsContainer.tsx | 132 - .../Entities/VersionDetails/EnvVarsTable.tsx | 71 - .../VersionDetails/VersionDetailsLink.tsx | 31 - .../src/components/Entities/generators.ts | 176 - .../Entities/test/EntityDetails.test.tsx | 87 - .../Entities/test/EntitySchedules.test.tsx | 93 - .../test/EntityVersionDetails.test.tsx | 73 - .../test/TaskVersionDetailsLink.test.tsx | 46 - .../src/components/Errors/DataError.tsx | 53 - .../console/src/components/Errors/index.ts | 1 - .../components/Errors/test/DataError.test.tsx | 24 - .../src/components/Executions/CacheStatus.tsx | 149 - .../ExecutionDetailsActions.tsx | 246 - .../ExecutionDetailsAppBarContent.tsx | 277 - .../ExecutionDetails/ExecutionNodeURL.tsx | 188 - .../ExecutionDetails/ExecutionTab.tsx | 43 - .../ExecutionDetails/ExecutionTabView.tsx | 34 - .../NodeExecutionDetailsPanelContent.tsx | 487 - .../NodeExecutionTabs/NodeExecutionInputs.tsx | 39 - .../NodeExecutionOutputs.tsx | 40 - .../NodeExecutionTabs/index.tsx | 137 - .../NodeExecutionTabs/test/index.test.tsx | 71 - .../StatusIndicator.tsx | 39 - .../TaskExecutionNode.tsx | 63 - .../TaskExecutionNodeRenderer.tsx | 18 - .../ExecutionDetails/Timeline/ChartHeader.tsx | 70 - .../Timeline/ExecutionTimeline.tsx | 245 - .../Timeline/ExecutionTimelineContainer.tsx | 39 - .../Timeline/ExecutionTimelineFooter.tsx | 123 - .../Timeline/NodeExecutionName.tsx | 97 - .../ExecutionDetails/Timeline/TaskNames.tsx | 125 - .../Timeline/TimelineChart/index.tsx | 117 - .../Timeline/scaleContext.tsx | 104 - .../Executions/ExecutionDetails/index.ts | 4 - .../test/ExecutionNodeViews.test.tsx | 227 - .../test/ExecutionTabContent.test.tsx | 104 - .../NodeExecutionDetailsPanelContent.test.tsx | 60 - .../test/NodeExecutionName.test.tsx | 68 - .../ExecutionDetails/useNodeExecutionRow.ts | 24 - .../Executions/ExecutionDetails/utils.ts | 62 - .../Tables/ExecutionsTableHeader.tsx | 47 - .../Tables/ExpandableExecutionError.tsx | 31 - .../Executions/Tables/NoExecutionsContent.tsx | 17 - .../Tables/NodeExecutionActions.tsx | 153 - .../Executions/Tables/NodeExecutionRow.tsx | 160 - .../Executions/Tables/NodeExecutionsTable.tsx | 296 - .../Executions/Tables/RowExpander.tsx | 36 - .../WorkflowExecutionRow.tsx | 162 - .../Tables/WorkflowExecutionTable/cells.tsx | 227 - .../Tables/WorkflowExecutionTable/strings.ts | 32 - .../Tables/WorkflowExecutionTable/styles.ts | 59 - .../Tables/WorkflowExecutionsTable.tsx | 94 - .../__mocks__/WorkflowExecutionsTable.tsx | 38 - .../WorkflowExecutionsTable.stories.tsx | 59 - .../Tables/nodeExecutionColumns.tsx | 212 - .../components/Executions/Tables/styles.ts | 188 - .../Tables/test/NodeExecutionActions.test.tsx | 99 - .../Tables/test/NodeExecutionRow.test.tsx | 98 - .../src/components/Executions/Tables/types.ts | 50 - .../src/components/Executions/Tables/utils.ts | 9 - .../TaskExecutionDetails.tsx | 50 - .../TaskExecutionsList/TaskExecutionError.tsx | 22 - .../TaskExecutionLogsCard.tsx | 125 - .../Executions/TaskExecutionsList/index.ts | 2 - .../test/TaskExecutionsList.test.tsx | 52 - .../NodeExecutionDetailsContextProvider.tsx | 193 - .../NodeExecutionDynamicProvider.tsx | 172 - .../WorkflowNodeExecutionsProvider.tsx | 236 - .../createExecutionArray.tsx | 121 - .../getTaskThroughExecution.ts | 57 - .../NodeExecutionDetails/index.ts | 4 - .../NodeExecutionDetails/types.ts | 17 - .../NodeExecutionDetails/utils.ts | 33 - .../Executions/contextProvider/index.ts | 1 - .../src/components/Executions/contexts.ts | 66 - .../src/components/Executions/index.ts | 12 - .../Executions/nodeExecutionQueries.ts | 532 - .../Executions/taskExecutionQueries.ts | 59 - .../Executions/useExecutionMetrics.tsx | 37 - .../Executions/useTaskExecutions.ts | 84 - .../Executions/workflowExecutionQueries.ts | 24 - .../LaunchFormComponents/DatetimeInput.tsx | 54 - .../LaunchFormComponents/EnumInput.tsx | 51 - .../SearchableSelector.tsx | 303 - .../LaunchFormComponents/StyledCard.tsx | 56 - .../LaunchForm/LaunchFormComponents/index.ts | 12 - .../Launch/LaunchForm/LaunchFormHeader.tsx | 22 - .../Launch/LaunchForm/NoInputsNeeded.tsx | 35 - .../UnsupportedRequiredInputsError.tsx | 63 - .../Launch/LaunchForm/__mocks__/mockInputs.ts | 111 - .../src/components/Launch/LaunchForm/index.ts | 1 - .../components/Launch/LaunchForm/styles.ts | 62 - .../Launch/LaunchForm/test/utils.ts | 41 - .../console/src/components/Launch/index.ts | 1 - .../SearchableLaunchPlanNameList.tsx | 174 - .../LaunchPlan/launchPlanQueries.ts | 28 - .../src/components/LaunchPlan/types.ts | 8 - .../LaunchPlan/useLaunchPlanInfoList.ts | 31 - .../console/src/components/Literals/styles.ts | 15 - .../helpers/genScalarStructuredDsCase.mock.ts | 146 - .../Navigation/DefaultAppBarContent.tsx | 204 - .../src/components/Navigation/NavBar.tsx | 93 - .../components/Navigation/NavBarContent.tsx | 18 - .../Navigation/NavLinkWithSearch.tsx | 33 - .../Navigation/NavigationDropdown.tsx | 108 - .../Navigation/OnlyMine/FilterPopoverIcon.tsx | 75 - .../components/Navigation/OnlyMine/index.tsx | 115 - .../components/Navigation/OnlyMine/strings.ts | 9 - .../Navigation/ProjectNavigation.tsx | 203 - .../components/Navigation/ProjectSelector.tsx | 115 - .../src/components/Navigation/Readme.md | 48 - .../Navigation/SearchableProjectList.tsx | 164 - .../components/Navigation/SideNavigation.tsx | 52 - .../Navigation/SubNavBarContent.tsx | 18 - .../components/Navigation/TopLevelLayout.tsx | 285 - .../components/Navigation/UserInformation.tsx | 148 - .../src/components/Navigation/index.ts | 20 - .../src/components/Navigation/strings.ts | 16 - .../Navigation/test/ProjectSelector.test.tsx | 50 - .../Navigation/test/UserInformation.test.tsx | 43 - .../src/components/Navigation/utils.ts | 17 - .../Navigation/withSideNavigation.tsx | 20 - .../src/components/NotFound/NotFound.tsx | 10 - .../NotFound/__stories__/NotFound.stories.tsx | 7 - .../Notifications/SystemStatusBanner.tsx | 151 - .../components/Project/ProjectDashboard.tsx | 261 - .../src/components/Project/ProjectDetails.tsx | 106 - .../components/Project/ProjectLaunchPlans.tsx | 38 - .../components/Project/ProjectStatusBar.tsx | 69 - .../src/components/Project/ProjectTasks.tsx | 45 - .../components/Project/ProjectWorkflows.tsx | 44 - .../src/components/Project/constants.ts | 1 - .../console/src/components/Project/strings.ts | 11 - .../Project/test/ProjectDashboard.test.tsx | 260 - .../Project/test/ProjectTask.test.tsx | 167 - .../Project/test/ProjectWorkflows.test.tsx | 111 - .../components/SelectProject/ProjectList.tsx | 105 - .../SelectProject/SelectProject.tsx | 61 - .../src/components/Tables/DataList.tsx | 242 - .../components/Tables/LoadMoreRowContent.tsx | 61 - .../components/Tables/PaginatedDataList.tsx | 229 - .../src/components/Tables/constants.ts | 4 - .../Task/SearchableTaskNameList.tsx | 306 - .../components/Task/SimpleTaskInterface.tsx | 91 - packages/console/src/components/Task/index.ts | 1 - .../src/components/Task/taskQueries.ts | 20 - .../Task/test/SimpleTaskInterface.test.tsx | 45 - .../src/components/Task/useLatestTask.ts | 38 - packages/console/src/components/Task/utils.ts | 11 - .../console/src/components/Theme/constants.ts | 125 - .../console/src/components/Theme/muiTheme.ts | 228 - .../console/src/components/Theme/useTheme.ts | 22 - .../Workflow/SearchableWorkflowNameList.tsx | 412 - .../Workflow/StaticGraphContainer.tsx | 57 - .../Workflow/WorkflowVersionDetails.tsx | 97 - .../console/src/components/Workflow/index.ts | 1 - .../console/src/components/Workflow/types.ts | 22 - .../Workflow/useWorkflowInfoItem.ts | 139 - .../Workflow/useWorkflowInfoList.ts | 31 - .../console/src/components/Workflow/utils.ts | 13 - .../components/Workflow/workflowQueries.ts | 75 - .../WorkflowGraph/InputOutputNodeRenderer.tsx | 39 - .../WorkflowGraph/TaskNodeRenderer.tsx | 31 - .../WorkflowGraph/WorkflowGraph.tsx | 44 - .../src/components/common/BarChart.tsx | 178 - .../common/ButtonCircularProgress.tsx | 18 - .../src/components/common/ButtonLink.tsx | 9 - .../components/common/ClosableDialogTitle.tsx | 49 - .../src/components/common/DataTable.tsx | 60 - .../src/components/common/DetailsGroup.tsx | 62 - .../src/components/common/DetailsPanel.tsx | 63 - .../components/common/DetailsPanelContent.tsx | 19 - .../common/DomainSettingsSection.tsx | 133 - .../src/components/common/DumpJSON.tsx | 6 - .../src/components/common/ErrorBoundary.tsx | 101 - .../common/ExpandableMonospaceText.tsx | 168 - .../components/common/FileUpload/FileItem.tsx | 50 - .../common/FileUpload/FileUpload.tsx | 89 - .../common/FilterableNamedEntityList.tsx | 121 - .../src/components/common/Icons/InfoIcon.tsx | 43 - .../src/components/common/Icons/interface.ts | 5 - .../src/components/common/LoadingSpinner.tsx | 71 - .../MapTaskStatusInfo.tsx | 91 - .../MapTaskExecutionsList/TaskNameList.tsx | 114 - .../test/TaskNameList.test.tsx | 59 - .../src/components/common/NewTargetLink.tsx | 55 - .../src/components/common/NoResults.tsx | 18 - .../components/common/PanelSection/index.tsx | 25 - .../src/components/common/ReactJsonView.tsx | 108 - .../common/ScrollableMonospaceText.tsx | 119 - .../src/components/common/SearchInputForm.tsx | 73 - .../src/components/common/SearchableList.tsx | 152 - .../common/SearchableNamedEntityList.tsx | 103 - .../src/components/common/SectionHeader.tsx | 26 - .../console/src/components/common/Shimmer.tsx | 32 - .../console/src/components/common/index.ts | 8 - .../src/components/common/keyboardEvents.ts | 18 - .../console/src/components/common/styles.ts | 158 - .../test/DomainSettingsSection.test.tsx | 105 - .../common/test/LoadingSpinner.test.tsx | 27 - .../common/test/SearchableList.spec.tsx | 106 - .../common/useSearchableListState.ts | 159 - .../console/src/components/common/utils.ts | 57 - packages/console/src/components/data/index.ts | 1 - .../src/components/flytegraph/Arrowhead.tsx | 26 - .../flytegraph/DragAllowingClickHandler.ts | 54 - .../flytegraph/InteractiveViewBox.tsx | 215 - .../src/components/flytegraph/Layout.tsx | 39 - .../src/components/flytegraph/Node.tsx | 116 - .../src/components/flytegraph/NodeLink.tsx | 52 - .../src/components/flytegraph/NodeText.tsx | 27 - .../flytegraph/ReactFlow/BreadCrumb.tsx | 163 - .../ReactFlow/ReactFlowBreadCrumbProvider.tsx | 80 - .../flytegraph/ReactFlow/test/utils.test.ts | 23 - .../components/flytegraph/RenderedGraph.tsx | 169 - .../src/components/flytegraph/constants.ts | 11 - .../src/components/flytegraph/layoutUtils.ts | 215 - .../src/components/flytegraph/theme.ts | 28 - .../src/components/flytegraph/timer.ts | 20 - .../src/components/flytegraph/utils.ts | 41 - .../console/src/components/hooks/index.ts | 3 - .../src/components/hooks/useDataRefresher.ts | 63 - .../src/components/hooks/useDescription.ts | 35 - .../src/components/hooks/useLaunchPlans.ts | 30 - .../src/components/hooks/useLocationState.ts | 15 - .../src/components/hooks/useNamedEntity.ts | 86 - .../src/components/hooks/useNodeExecution.ts | 41 - .../src/components/hooks/useProjects.ts | 33 - .../src/components/hooks/useQueryState.ts | 37 - .../src/components/hooks/useTabState.ts | 14 - .../console/src/components/hooks/useTask.ts | 34 - .../src/components/hooks/useTaskExecution.ts | 18 - .../src/components/hooks/useVersion.ts | 31 - .../components/hooks/useWorkflowExecutions.ts | 16 - packages/console/src/components/index.ts | 14 - .../src/components/utils/GlobalStyles.tsx | 18 - packages/console/src/config/types.ts | 9 - packages/console/src/errors/fetchErrors.ts | 18 - .../console/src/errors/parameterErrors.ts | 22 - packages/console/src/errors/protobufErrors.ts | 9 - .../console/src/errors/validationErrors.ts | 11 - packages/console/src/index.ts | 9 - .../data/fixtures/dynamicPythonWorkflow.ts | 224 - packages/console/src/mocks/data/projects.ts | 28 - .../console/src/mocks/insertDefaultData.ts | 9 - .../console/src/models/AdminEntity/index.ts | 5 - .../AdminEntity/test/AdminEntity.spec.ts | 39 - .../models/Graph/convertFlyteGraphToDAG.ts | 80 - packages/console/src/models/Launch/api.ts | 33 - .../console/src/models/Launch/constants.ts | 3 - packages/console/src/models/Node/utils.ts | 17 - .../src/models/Project/test/api.test.ts | 21 - packages/console/src/models/Project/utils.ts | 20 - packages/console/src/models/Task/index.ts | 4 - packages/console/src/models/Workflow/index.ts | 1 - packages/console/src/models/Workflow/utils.ts | 16 - .../src/models/__mocks__/graphWorkflowData.ts | 32 - .../src/models/__mocks__/projectData.ts | 20 - packages/console/src/models/index.ts | 6 - .../console/src/routes/ApplicationRouter.tsx | 129 - packages/console/src/routes/components.ts | 33 - packages/console/src/routes/constants.ts | 10 - packages/console/src/routes/history.ts | 3 - packages/console/src/routes/index.ts | 3 - packages/console/src/routes/routes.ts | 145 - packages/console/src/test/modelUtils.ts | 44 - packages/console/src/test/setupTests.ts | 22 - packages/console/src/tsd/window.d.ts | 1 - packages/console/tsconfig.build.es.json | 28 - packages/console/tsconfig.json | 43 - packages/console/tsconfig.test.json | 23 - packages/flyte-api/LICENSE | 202 - packages/flyte-api/README.md | 42 - packages/flyte-api/jest.config.js | 11 +- packages/flyte-api/package.json | 54 +- .../src/ApiProvider/apiProvider.test.tsx | 2 +- packages/flyte-api/src/ApiProvider/index.tsx | 30 +- packages/flyte-api/src/ApiProvider/login.ts | 21 +- packages/flyte-api/src/index.ts | 8 - packages/flyte-api/src/utils/AdminEndpoint.ts | 5 + packages/flyte-api/src/utils/RawEndpoint.ts | 6 + .../flyte-api/src/utils/adminApiPrefix.ts | 2 + packages/flyte-api/src/utils/constants.ts | 10 - .../flyte-api/src/utils/createLocalURL.ts | 6 + .../flyte-api/src/utils/defaultAxiosConfig.ts | 27 + .../src/utils/ensureSlashPrefixed.ts | 4 + packages/flyte-api/src/utils/errors.ts | 39 - .../flyte-api/src/utils/getAdminApiUrl.ts | 17 + .../flyte-api/src/utils/getAxiosApiCall.ts | 22 + .../flyte-api/src/utils/getEndpointUrl.ts | 13 + packages/flyte-api/src/utils/index.ts | 80 - .../src/utils/{nodeChecks.ts => isObject.ts} | 2 + .../src/utils}/transformRequestError.ts | 26 +- packages/flyte-api/src/utils/utils.test.ts | 29 +- packages/flyte-api/tsconfig.build.es.json | 7 - packages/flyte-api/tsconfig.build.json | 16 +- packages/flyte-api/tsconfig.json | 15 +- packages/flyte-api/tsconfig.test.json | 3 - packages/flyteidl-types/LICENSE | 202 - packages/flyteidl-types/README.md | 3 - packages/flyteidl-types/package.json | 51 - packages/flyteidl-types/src/index.ts | 18 - .../flyteidl-types/tsconfig.build.es.json | 7 - packages/flyteidl-types/tsconfig.json | 16 - packages/flyteidl-types/tsconfig.test.json | 3 - packages/locale/LICENSE | 202 - packages/locale/README.md | 3 - packages/locale/jest.config.js | 5 +- packages/locale/package.json | 49 +- packages/locale/tsconfig.build.es.json | 7 - packages/locale/tsconfig.build.json | 12 +- packages/locale/tsconfig.json | 11 - packages/locale/tsconfig.test.json | 3 - packages/oss-console/jest.config.ts | 10 + packages/oss-console/package.json | 120 + .../oss-console/src/App/ApplicationRouter.tsx | 112 + packages/oss-console/src/App/index.tsx | 94 + .../src/basics/FeatureFlags/FEATURE_FLAGS.md | 18 +- .../basics/FeatureFlags/FeatureFlags.test.tsx | 64 + .../src/basics/FeatureFlags/FeatureFlags.tsx | 27 +- .../src/basics/FeatureFlags/defaultConfig.ts | 32 + .../src/basics/FeatureFlags/index.tsx | 2 + .../src/basics/LocalCache/ContextProvider.tsx | 15 +- .../src/basics/LocalCache/defaultConfig.ts | 4 +- .../src/basics/LocalCache/index.tsx | 7 +- .../src/basics/LocalCache/localCache.test.tsx | 20 +- .../LocalCache/onlyMineDefaultConfig.ts | 2 +- .../src/common/formatters.test.ts | 4 +- .../src/common/formatters.ts | 47 +- .../src/common/layout.ts | 1 - .../src/common/linkify.ts | 2 +- .../src/common/log.ts | 3 +- .../oss-console/src/common/promiseUtils.ts | 5 + .../src/common/setupProtobuf.ts | 0 .../src/common/stringifyIsEqual.ts | 15 + .../src/common/test/formatters.spec.ts | 44 +- .../src/common/test/linkify.test.ts | 13 +- .../src/common/test/utils.spec.ts | 15 +- .../src/common/timezone.ts | 0 .../src/common/typeCheckers.ts | 0 .../src/common/types.ts | 0 .../src/common/utils.ts | 79 +- .../Breadcrumbs/async/executionContext.ts | 288 +- .../src/components/Breadcrumbs/async/fn.ts | 126 +- .../async/utils/breadcrumQueryOptions.ts | 6 + .../async/utils/domainIdFromURL.ts | 12 + .../async/utils/formatProjectEntities.ts | 46 + .../utils/formatProjectEntitiesAsDomains.ts | 46 + .../Breadcrumbs/async/utils/index.ts | 77 + .../async/utils/projectIdFromURL.ts | 5 + .../utils/tests/domainIdFromURL.test.ts} | 47 +- .../utils/tests/formatProjectEntities.test.ts | 103 + .../formatProjectEntitiesAsDomains.test.ts | 84 + .../utils/tests/projectIdFromURL.test.ts | 34 + .../components/BreadcrumbFormControl.tsx | 295 + .../components/BreadcrumbPopover.tsx | 212 +- .../components/BreadcrumbTitleActions.tsx | 9 +- .../Breadcrumbs/components/Breadcrumbs.tsx | 100 +- .../components/breadcrumbGlobalStyles.tsx | 64 + .../Breadcrumbs/components/tlmAsyncFns.tsx | 11 + .../Breadcrumbs/defaultValue/default.ts | 0 .../Breadcrumbs/defaultValue/index.ts | 0 .../defaultValue/namedEntities.test.ts | 3 +- .../Breadcrumbs/defaultValue/namedEntities.ts | 24 +- .../components/Breadcrumbs/hooks/index.tsx | 33 + .../registry/contextualDefaults.ts | 7 +- .../Breadcrumbs/registry/default.ts | 0 .../components/Breadcrumbs/registry/index.ts | 87 +- .../Breadcrumbs/registry/semanticDefaults.ts | 9 +- .../components/Breadcrumbs/registry/utils.ts | 2 +- .../components/Breadcrumbs/selfLinks/index.ts | 20 +- .../src/components/Breadcrumbs/types.ts | 24 +- .../Breadcrumbs/validators/default.test.ts | 0 .../Breadcrumbs/validators/default.ts | 0 .../components/Breadcrumbs/validators/fn.ts | 15 +- .../Breadcrumbs/validators/index.ts | 0 .../validators/namedEntitiesValidator.test.ts | 5 +- .../src/components/Cache/CacheContext.ts | 0 .../src/components/Cache/createCache.ts | 4 +- .../src/components/Cache/utils.ts | 0 .../components/Entities/EntityDescription.tsx | 185 + .../src/components/Entities/EntityDetails.tsx | 178 + .../Entities/EntityDetailsHeader.tsx | 124 + .../components/Entities/EntityExecutions.tsx | 69 + .../Entities/EntityExecutionsBarChart.tsx | 59 + .../src/components/Entities/EntityInputs.tsx | 209 + .../components/Entities/EntitySchedules.tsx | 226 + .../components/Entities/EntityVersions.tsx | 134 + .../src/components/Entities/Row.tsx | 34 + .../VersionDetails/EntityVersionDetails.tsx | 69 + .../EntityVersionDetailsContainer.tsx | 139 + .../Entities/VersionDetails/EnvVarsTable.tsx | 69 + .../VersionDetails/VersionDetailsLink.tsx | 37 + .../Entities/VersionDetails/constants.ts | 2 +- .../src/components/Entities/constants.ts | 12 +- .../src/components/Entities/generators.ts | 93 + .../src/components/Entities/strings.ts | 10 +- .../Entities/test/EntityDetails.test.tsx | 91 + .../test/EntityVersionDetails.test.tsx | 101 + .../test/TaskVersionDetailsLink.test.tsx | 156 + .../src/components/Errors/DataError.tsx | 60 + .../components/Errors/DownForMaintenance.tsx | 39 + .../src/components/Errors/PrettyError.tsx | 133 + .../Errors/__stories__/DataError.stories.tsx | 6 +- .../components/Errors/test/DataError.test.tsx | 30 + .../src/components/Executions/CacheStatus.tsx | 125 + .../ExecutionDetails/DetailsPanelContext.tsx | 71 +- .../ExecutionDetails/ExecutionContainer.tsx} | 153 +- .../FlyteDeckButton.tsx | 119 + .../ExecutionDetailsActions/RerunButton.tsx | 72 + .../ExecutionDetailsActions/ResumeButton.tsx | 85 + .../ExecutionDetailsActions/index.tsx | 65 + .../ExecutionDetailsAppBarContent.tsx | 152 + .../ExecutionDetails/ExecutionMetadata.tsx | 76 +- .../ExecutionMetadataExtra.tsx | 52 +- .../ExecutionDetails/ExecutionNodeDeck.tsx | 23 +- .../ExecutionDetails/ExecutionNodeURL.tsx | 122 + .../ExecutionDetails/ExecutionNodeViews.tsx | 0 .../ExecutionDetails/ExecutionTab.tsx | 35 + .../ExecutionDetails/ExecutionTabView.tsx | 32 + .../NodeExecutionDetailsPanelContent.tsx | 432 + .../NodeExecutionTabs/NodeExecutionInputs.tsx | 36 + .../NodeExecutionOutputs.tsx | 37 + .../NodeExecutionTabs/index.tsx | 115 + .../NodeExecutionTabs/test/index.test.tsx | 102 + .../RelaunchExecutionForm.tsx | 53 +- .../ExecutionDetails/Timeline/ChartHeader.tsx | 66 + .../Timeline/ExecutionTimeline.tsx | 92 + .../Timeline/ExecutionTimelineChart.tsx | 142 + .../Timeline/ExecutionTimelineFooter.tsx | 119 + .../Timeline/ExecutionTimelineTable.tsx | 55 + .../Timeline/ExecutionTimelineTableRow.tsx | 79 + .../Timeline/NodeExecutionName.tsx | 94 + .../Timeline/ScaleProvider/ScaleContext.tsx | 29 + .../Timeline/ScaleProvider/index.tsx | 103 + .../ScaleProvider/useScaleContext.tsx | 6 + .../Timeline/TaskNamesList.tsx | 60 + .../TimelineChart/TimelineChart.stories.tsx | 10 +- .../TimelineChartSingleItem.stories.tsx | 11 +- .../Timeline/TimelineChart/barOptions.ts | 48 +- .../Timeline/TimelineChart/chartData.ts | 42 +- .../Timeline/TimelineChart/index.tsx | 139 + .../Timeline/TimelineChart/utils.ts | 117 +- .../ExecutionDetails/Timeline/helpers.ts | 9 +- .../Executions/ExecutionDetails/constants.ts | 2 - .../Executions/ExecutionDetails/index.tsx | 11 + .../Executions/ExecutionDetails/strings.tsx | 3 +- .../ExecutionDetailsAppBarContent.test.tsx | 59 +- .../test/ExecutionMetadata.test.tsx | 35 +- .../test/ExecutionNodeViews.test.tsx | 252 + .../test/ExecutionTabContent.test.tsx | 107 + .../NodeExecutionDetailsPanelContent.test.tsx | 75 + .../test/NodeExecutionName.test.tsx | 55 + .../test/RelaunchExecutionForm.test.tsx | 73 +- .../ExecutionDetails/test/TaskNames.test.tsx | 93 +- .../test/TimelineChart.test.tsx | 10 +- .../test/__mocks__/NodeExecution.mock.ts | 40 +- .../useExecutionNodeViewsStatePoll.ts} | 26 +- .../useRecoverExecutionState.ts | 9 +- .../Executions/ExecutionDetails/utils.ts | 31 + .../ExecutionDetails/withExecutionDetails.tsx | 30 + .../Executions/ExecutionFilters.tsx | 85 +- .../ExecutionInputsOutputsModal.tsx | 112 +- .../Executions/ExecutionStatusBadge.tsx | 63 +- .../Executions/NodeExecutionCacheStatus.tsx | 52 +- .../Executions/Tables/EntityVersionsTable.tsx | 48 +- .../Tables/ExecutionsTableHeader.tsx | 32 + .../Tables/ExpandableExecutionError.tsx | 74 + .../InputsOutputsButton.tsx | 39 + .../NodeExecutionActions.tsx | 23 + .../NodeExecutionActions/RerunButton.tsx | 74 + .../NodeExecutionActions/ResumeButton.tsx | 90 + .../Executions/Tables/NodeExecutionRow.tsx | 206 + .../Executions/Tables/NodeExecutionsTable.tsx | 279 + .../Executions/Tables/RowExpander.tsx | 49 + .../Tables/SelectNodeExecutionLink.tsx | 15 +- .../Tables/WorkflowExecutionLink.tsx | 13 +- .../WorkflowExecutionRow.tsx | 240 + .../Tables/WorkflowExecutionTable/cells.tsx | 409 + .../Tables/WorkflowExecutionTable/strings.ts | 29 + .../Tables/WorkflowExecutionTable/styles.tsx | 49 + .../useWorkflowExecutionsTableColumns.tsx | 54 +- .../Tables/WorkflowExecutionsTable.tsx | 186 + .../Executions/Tables/WorkflowVersionRow.tsx | 61 +- .../NodeExecutionsTable.stories.tsx | 19 +- .../WorkflowExecutionsTable.stories.tsx | 45 + .../components/Executions/Tables/constants.ts | 10 - .../Tables/nodeExecutionColumns.tsx | 179 + .../components/Executions/Tables/strings.tsx | 6 +- .../components/Executions/Tables/styles.tsx | 194 + .../Tables/test/NodeExecutionActions.test.tsx | 11 + .../Tables/test/NodeExecutionRow.test.tsx | 123 + .../Tables/test/NodeExecutionsTable.test.tsx | 194 +- .../test/WorkflowExecutionLink.test.tsx | 12 +- .../src/components/Executions/Tables/types.ts | 37 + .../Tables/useWorkflowExecutionTableState.ts | 5 +- .../useWorkflowVersionsTableColumns.tsx | 31 +- .../src/components/Executions/Tables/utils.ts | 5 + .../MapTaskExecutionDetails.tsx | 16 +- .../MapTaskExecutionListItem.tsx | 84 +- .../TaskExecutionDetails.tsx | 42 + .../TaskExecutionsList/TaskExecutionError.tsx | 22 + .../TaskExecutionsList/TaskExecutionLogs.tsx | 51 +- .../TaskExecutionLogsCard.tsx | 116 + .../TaskExecutions.mocks.ts | 46 +- .../TaskExecutionsList/TaskExecutionsList.tsx | 55 +- .../TaskExecutionsListContent.stories.tsx | 20 +- .../TaskExecutionsListItem.tsx | 4 +- .../TaskExecutionsList/constants.ts | 2 +- .../test/MapTaskExecutionDetails.test.tsx | 16 +- .../test/TaskExecutionDetails.test.tsx | 42 +- .../test/TaskExecutionLogsCard.test.tsx | 43 +- .../test/TaskExecutionsList.test.tsx | 67 + .../test/TaskExecutionsListItem.test.tsx | 4 +- .../TaskExecutionsList/test/utils.spec.ts | 25 +- .../Executions/TaskExecutionsList/utils.ts | 65 +- .../TerminateExecutionButton.tsx | 15 +- .../TerminateExecutionForm.tsx | 62 +- .../useTerminateExecutionState.ts | 19 +- .../__stories__/ExecutionFilters.stories.tsx | 13 +- .../src/components/Executions/constants.ts | 200 +- .../NodeExecutionDetailsContextProvider.tsx | 240 + .../NodeExecutionDynamicProvider.tsx | 125 + .../WorkflowNodeExecutionsProvider.tsx | 157 + .../createExecutionArray.tsx | 166 + .../getTaskThroughExecution.ts | 50 + .../NodeExecutionDetails/types.ts | 8 + .../NodeExecutionDetails/utils.ts | 72 + .../src/components/Executions/contexts.ts | 47 + .../Executions/filters/constants.ts | 0 .../Executions/filters/durationFilters.ts | 2 +- .../Executions/filters/startTimeFilters.ts | 16 +- .../Executions/filters/statusFilters.ts | 44 +- .../components/Executions/filters/types.ts | 21 +- .../filters/useExecutionArchiveState.ts | 6 +- .../filters/useExecutionFiltersState.ts | 18 +- .../filters/useFilterButtonState.ts | 0 .../Executions/filters/useMultiFilterState.ts | 45 +- .../filters/useOnlyMyExecutionsFilterState.ts | 18 +- .../filters/useSearchFilterState.ts | 19 +- .../filters/useSingleFilterState.ts | 31 +- .../src/components/Executions/strings.ts | 4 +- .../Executions/test/CacheStatus.test.tsx | 27 +- .../Executions/test/ExecutionFilters.test.tsx | 50 +- .../test/NodeExecutionCacheStatus.test.tsx | 45 +- .../useOnlyMyExecutionsFilterState.test.ts | 16 +- .../components/Executions/test/utils.test.ts | 71 +- .../src/components/Executions/types.ts | 14 +- .../Executions/useWorkflowExecution.ts | 40 +- .../src/components/Executions/utils.ts | 113 +- .../Launch/LaunchForm/LaunchForm.tsx | 11 +- .../Launch/LaunchForm/LaunchFormActions.tsx | 49 +- .../LaunchFormComponents/BlobInput.tsx | 98 +- .../LaunchFormComponents/BooleanInput.tsx | 12 +- .../LaunchFormComponents/CollectionInput.tsx | 43 +- .../LaunchFormComponents/CollectionList.tsx | 24 +- .../LaunchFormComponents/DatetimeInput.tsx | 59 + .../LaunchFormComponents/EnumInput.tsx | 51 + .../LaunchFormAdvancedInputs.tsx | 178 +- .../LaunchInterruptibleInput.tsx | 40 +- .../LaunchOverwriteCacheInput.tsx | 23 +- .../LaunchFormComponents/NoneInput.tsx | 8 +- .../SearchableSelector.tsx | 198 + .../LaunchFormComponents/Selector.tsx | 236 + .../LaunchFormComponents/SimpleInput.tsx | 2 +- .../LaunchFormComponents/StructInput.tsx | 121 +- .../StructuredDatasetInput.tsx | 53 +- .../LaunchFormComponents/StyledCard.tsx | 65 + .../LaunchFormComponents/TextInput.tsx | 8 +- .../LaunchFormComponents/UnionInput.tsx | 86 +- .../LaunchFormComponents/UnsupportedInput.tsx | 8 +- .../getComponentForInput.tsx | 0 .../Launch/LaunchForm/LaunchFormDialog.tsx | 35 +- .../Launch/LaunchForm/LaunchFormHeader.tsx | 29 + .../Launch/LaunchForm/LaunchFormInputs.tsx | 64 +- .../Launch/LaunchForm/LaunchRoleInput.tsx | 71 +- .../Launch/LaunchForm/LaunchTaskForm.tsx | 27 +- .../Launch/LaunchForm/LaunchWorkflowForm.tsx | 50 +- .../components/Launch/LaunchForm/MapInput.tsx | 130 +- .../Launch/LaunchForm/NoInputsNeeded.tsx | 26 + .../Launch/LaunchForm/ResumeForm.tsx | 11 +- .../Launch/LaunchForm/ResumeSignalForm.tsx | 41 +- .../UnsupportedRequiredInputsError.tsx | 52 + .../Launch/LaunchForm/__mocks__/mockInputs.ts | 164 + .../Launch/LaunchForm/__mocks__/utils.ts | 8 +- .../__stories__/LaunchForm.stories.tsx | 63 +- .../__stories__/MapInput.stories.tsx | 2 +- .../__stories__/WorkflowSelector.stories.tsx | 34 +- .../components/Launch/LaunchForm/constants.ts | 34 +- .../components/Launch/LaunchForm/getInputs.ts | 33 +- .../components/Launch/LaunchForm/handlers.ts | 5 +- .../Launch/LaunchForm/inputHelpers/blob.ts | 24 +- .../Launch/LaunchForm/inputHelpers/boolean.ts | 11 +- .../LaunchForm/inputHelpers/collection.ts | 62 +- .../LaunchForm/inputHelpers/constants.ts | 2 +- .../LaunchForm/inputHelpers/datetime.ts | 11 +- .../LaunchForm/inputHelpers/duration.ts | 10 +- .../Launch/LaunchForm/inputHelpers/float.ts | 12 +- .../inputHelpers/getHelperForInput.ts | 0 .../LaunchForm/inputHelpers/inputHelpers.ts | 11 +- .../Launch/LaunchForm/inputHelpers/integer.ts | 19 +- .../Launch/LaunchForm/inputHelpers/map.ts | 29 +- .../Launch/LaunchForm/inputHelpers/none.ts | 6 +- .../LaunchForm/inputHelpers/parseJson.ts | 0 .../Launch/LaunchForm/inputHelpers/schema.ts | 6 +- .../Launch/LaunchForm/inputHelpers/string.ts | 9 +- .../Launch/LaunchForm/inputHelpers/struct.ts | 42 +- .../inputHelpers/structuredDataSet.ts | 11 +- .../inputHelpers/test/inputHelpers.test.ts | 118 +- .../inputHelpers/test/structTestCases.ts | 4 +- .../LaunchForm/inputHelpers/test/testCases.ts | 137 +- .../inputHelpers/test/union.test.ts | 12 +- .../inputHelpers/test/utils.test.ts | 20 +- .../Launch/LaunchForm/inputHelpers/types.ts | 10 +- .../Launch/LaunchForm/inputHelpers/union.ts | 32 +- .../Launch/LaunchForm/inputHelpers/utils.ts | 43 +- .../Launch/LaunchForm/inputValueCache.ts | 4 +- .../Launch/LaunchForm/launchMachine.ts | 60 +- .../components/Launch/LaunchForm/services.ts | 4 +- .../components/Launch/LaunchForm/strings.ts | 9 +- .../components/Launch/LaunchForm/styles.tsx | 104 + .../LaunchForm/test/LaunchTaskForm.test.tsx | 379 +- .../test/LaunchWorkflowForm.test.tsx | 977 +- .../test/LaunchWorkflowFormInputs.test.tsx | 3618 ++ .../LaunchForm/test/ResumeSignalForm.test.tsx | 106 +- .../Launch/LaunchForm/test/constants.ts | 4 - .../Launch/LaunchForm/test/getInputs.test.ts | 10 +- .../Launch/LaunchForm/test/utils.ts | 33 + .../src/components/Launch/LaunchForm/types.ts | 72 +- .../Launch/LaunchForm/useFormInputsState.ts | 17 +- .../LaunchForm/useLaunchTaskFormState.ts | 43 +- .../LaunchForm/useLaunchWorkflowFormState.ts | 72 +- .../useMappedExecutionInputValues.ts | 19 +- .../Launch/LaunchForm/useResumeFormState.ts | 54 +- .../LaunchForm/useTaskSourceSelectorState.ts | 17 +- .../LaunchForm/useVersionSelectorOptions.ts | 0 .../useWorkflowSourceSelectorState.ts | 46 +- .../src/components/Launch/LaunchForm/utils.ts | 105 +- .../LaunchPlanCardList/LaunchPlanCardView.tsx | 28 + .../LaunchPlanCardList/LaunchPlanListCard.tsx | 145 + .../LaunchPlan/LaunchPlanDetails.tsx | 16 +- .../components/LaunchPlan/LaunchPlanList.tsx | 91 + .../LaunchPlanTable/LaunchPlanTableRow.tsx | 108 + .../LaunchPlanTable/LaunchPlanTableView.tsx | 51 + .../LaunchPlan/ResponsiveLaunchPlanList.tsx | 102 + .../SearchableLaunchPlanNameList.tsx | 121 + .../LaunchPlan/components/LaunchPlanCells.tsx | 243 + .../components/LaunchPlanLastNExecutions.tsx | 88 + .../LaunchPlan/components}/LaunchPlanLink.tsx | 11 +- .../LaunchPlanNextPotentialExecution.tsx | 77 + .../LaunchPlan/components/SearchBox.tsx | 64 + .../LaunchPlanNextPotentialExecution.test.tsx | 315 + .../LaunchPlan/useLaunchPlanArchivedState.ts | 33 + .../LaunchPlan/useLaunchPlanInfoList.ts | 14 + .../LaunchPlan/useLaunchPlanScheduledState.ts | 29 + .../src/components/LaunchPlan/utils.ts | 73 + .../ListProjectExecutions.tsx | 131 + .../ListProjectLaunchPlans.tsx | 15 + .../ListProjectEntities/ListProjectTasks.tsx | 56 + .../ListProjectWorkflows.tsx | 57 + .../ListProjectEntities/ProjectStatusBar.tsx | 68 + .../components/ListProjectEntities/index.tsx | 84 + .../test/ListProjectExecutions.test.tsx | 196 + .../test/ListProjectTasks.test.tsx | 127 + .../Literals/DeprecatedLiteralMapViewer.tsx | 14 +- .../Literals/LiteralCollectionViewer.tsx | 2 +- .../components/Literals/LiteralMapViewer.tsx | 6 +- .../src/components/Literals/LiteralValue.tsx | 13 +- .../src/components/Literals/PrintList.tsx | 9 +- .../src/components/Literals/PrintValue.tsx | 2 +- .../Literals/Scalar/BinaryValue.tsx | 2 +- .../components/Literals/Scalar/BlobValue.tsx | 8 +- .../components/Literals/Scalar/ErrorValue.tsx | 2 +- .../Literals/Scalar/NoneTypeValue.tsx | 0 .../Literals/Scalar/PrimitiveValue.tsx | 12 +- .../Literals/Scalar/ProtobufStructValue.tsx | 10 +- .../Literals/Scalar/ScalarValue.tsx | 4 +- .../Literals/Scalar/SchemaValue.tsx | 6 +- .../Scalar/test/PrimitiveValue.test.tsx | 4 +- .../Scalar/test/ProtobufStructValue.test.tsx | 2 +- .../components/Literals/UnsupportedType.tsx | 4 +- .../src/components/Literals/ValueLabel.tsx | 0 .../Literals/__stories__/CardDecorator.tsx | 7 +- .../__stories__/Collection.stories.tsx | 9 +- .../Literals/__stories__/Map.stories.tsx | 5 +- .../__stories__/ProtobufStruct.stories.tsx | 9 +- .../Literals/__stories__/Scalar.stories.tsx | 7 +- .../__stories__/StructuredDataSet.stories.tsx | 58 +- .../Literals/__stories__/binaryValues.ts | 2 +- .../Literals/__stories__/blobValues.ts | 2 +- .../Literals/__stories__/errorValues.ts | 2 +- .../__stories__/helpers/typeGenerators.ts | 22 +- .../Literals/__stories__/literalValues.ts | 4 +- .../Literals/__stories__/primitiveValues.ts | 4 +- .../Literals/__stories__/protobufValues.ts | 2 +- .../Literals/__stories__/scalarValues.ts | 11 +- .../Literals/__stories__/schemaValues.ts | 2 +- .../src/components/Literals/constants.ts | 0 .../src/components/Literals/helpers.ts | 78 +- .../src/components/Literals/styles.tsx | 36 + .../Literals/test/LiteralMapViewer.test.tsx | 12 +- .../helpers/genCollectionTestcase.mock.ts | 8 +- .../test/helpers/genMapTestCase.mock.ts | 8 +- .../helpers/genScalarBinaryTestCase.mock.ts | 2 +- .../test/helpers/genScalarBlobCases.mock.ts | 26 +- .../test/helpers/genScalarErrorCase.mock.ts | 2 +- .../test/helpers/genScalarGenericCase.mock.ts | 10 +- .../test/helpers/genScalarNoneCase.mock.ts | 2 +- .../helpers/genScalarPrimitiveCases.mock.ts | 4 +- .../test/helpers/genScalarSchemaCase.mock.ts | 4 +- .../helpers/genScalarStructuredDsCase.mock.ts | 135 + .../components/Literals/test/helpers/index.ts | 0 .../Literals/test/helpers/literalHelpers.ts | 29 +- .../Literals/test/helpers/mock_simpleTypes.ts | 4 +- .../Literals/test/literal.helpers.test.ts | 18 +- .../src/components/Literals/test/types.d.ts | 0 .../src/components/Navigation/NavBar.tsx | 112 + .../components/Navigation/SideNavigation.tsx | 5 + .../Navigation/__stories__/Navbar.stories.tsx | 23 +- .../__stories__/ProjectSelector.stories.tsx | 13 +- .../__stories__/SideNavigation.stories.tsx | 6 +- .../src/components/Navigation/utils.ts | 11 + .../Notifications/SystemStatusBanner.tsx | 128 + .../SystemStatusBanner.stories.tsx | 5 +- .../test/SystemStatusBanner.test.tsx | 76 +- .../Notifications/useSystemStatus.ts | 10 +- .../components/SelectProject/ProjectList.tsx | 151 + .../src/components/SelectProject/constants.ts | 0 .../src/components/SelectProject/index.tsx | 94 + .../components/Tables/PaginatedDataList.tsx | 141 + .../Tables/filters/FilterPopoverButton.tsx | 85 +- .../Task/SearchableTaskNameList.tsx | 203 + .../components/Task/SimpleTaskInterface.tsx | 100 + .../SearchableTaskNameList.stories.tsx | 8 +- .../src/components/Task/index.tsx} | 15 +- .../Task/test/SimpleTaskInterface.test.tsx | 119 + .../src/components/Task/useLatestTask.ts | 29 + .../Task/useTaskShowArchivedState.ts | 4 +- .../Workflow/SearchableWorkflowNameList.tsx | 547 + .../Workflow/StaticGraphContainer.tsx | 51 + .../components/Workflow/WorkflowDetails.tsx | 10 +- .../SearchableWorkflowNameList.stories.tsx | 4 +- .../filters/useWorkflowShowArchivedState.ts | 4 +- .../src/components/Workflow/types.ts | 8 + .../src/components/Workflow/utils.ts | 11 + .../WorkflowGraph/WorkflowGraph.tsx | 27 + .../__stories__/WorkflowGraph.stories.tsx | 16 +- .../WorkflowGraph/__stories__/rich.json | 9 +- .../src/components/WorkflowGraph/strings.ts | 3 +- .../WorkflowGraph/test/WorkflowGraph.test.tsx | 19 +- .../test/nodeExecutionsById.mock.ts | 0 .../WorkflowGraph/test/utils.test.ts | 18 +- .../WorkflowGraph/test/workflow.mock.ts | 4 +- .../transformerWorkflowToDag.tsx | 385 +- .../src/components/WorkflowGraph/utils.ts | 113 +- .../src/components/common/BarChart.tsx | 185 + .../components/common/ClosableDialogTitle.tsx | 41 + .../components/common/ContentContainer.tsx | 65 +- .../src/components/common/DataTable.tsx | 52 + .../src/components/common/DetailsGroup.tsx | 60 + .../src/components/common/DetailsPanel.tsx | 58 + .../common/DomainSettingsSection.tsx | 191 + .../common/DropDownWindowButton.tsx | 21 +- .../src/components/common/Empty.tsx | 0 .../src/components/common/EntityCardError.tsx | 14 + .../src/components/common/ErrorBoundary.tsx | 69 + .../common/ExecutionsBarChartSection.tsx | 136 + .../common/ExpandableContentLink.tsx | 11 +- .../common/ExpandableMonospaceText.tsx | 171 + .../common/FilterableNamedEntityList.tsx | 209 + .../src/components/common/LinkifiedText.tsx | 2 +- .../components/common/LocalStoreDefaults.ts | 35 +- .../MapTaskStatusInfo.stories.tsx | 8 +- .../MapTaskStatusInfo.tsx | 108 + .../MapTaskExecutionsList/TaskNameList.tsx | 130 + .../test/MapTaskStatusInfo.test.tsx | 47 +- .../test/TaskNameList.test.tsx | 72 + .../src/components/common/MoreOptionsMenu.tsx | 55 +- .../src/components/common/MultiSelectForm.tsx | 53 +- .../src/components/common/NewTargetLink.tsx | 43 + .../src/components/common/NonIdealState.tsx | 73 +- .../components/common/PanelSection/index.tsx | 22 + .../common/PublishedWithChanges.tsx | 9 +- .../src/components/common/ReactJsonView.tsx | 102 + .../common/ScrollableMonospaceText.tsx | 99 + .../src/components/common/SearchInputForm.tsx | 58 + .../src/components/common/SearchableList.tsx | 91 + .../common/SearchableNamedEntityList.tsx | 14 + .../components/common/SingleSelectForm.tsx | 51 +- .../common/TopLevelLayout/TopLevelLayout.tsx | 202 + .../TopLevelLayout}/TopLevelLayoutState.tsx | 22 +- .../src/components/common/WaitForData.tsx | 20 +- .../src/components/common/WaitForQuery.tsx | 8 +- .../common/__stories__/BarChart.stories.tsx | 24 +- .../common/__stories__/Decorators.tsx | 0 .../__stories__/ErrorBoundary.stories.tsx | 14 +- .../ExpandableContentLink.stories.tsx | 4 +- .../ExpandableMonospaceText.stories.tsx | 6 +- .../__stories__/NonIdealState.stories.tsx | 4 +- .../common/__stories__/Typography.stories.tsx | 14 +- .../src/components/common/apiResponseUtils.ts | 93 + .../src/components/common/constants.ts | 10 +- .../src/components/common/strings.ts | 6 +- .../src/components/common/styles.ts | 5 + .../components/common/test/DataTable.test.tsx | 13 +- .../test/DomainSettingsSection.test.tsx | 193 + .../common/test/MoreOptionsMenu.test.tsx | 4 +- .../common/test/NewTargetLink.spec.tsx | 5 +- .../src/components/common/types.ts | 3 - .../components/common/useLinkifiedChunks.ts | 2 +- .../common/useSearchableListState.ts | 116 + .../src/components/common/utils.ts | 20 + .../src/components/common/withRouteParams.tsx | 4 +- .../data/QueryAuthorizationObserver.tsx | 4 +- .../components/data/__mocks__/apiContext.ts | 4 +- .../src/components/data/apiContext.ts | 18 +- .../src/components/data/queryCache.ts | 12 +- .../src/components/data/queryUtils.ts | 4 +- .../components/data/test/queryUtils.test.ts | 0 .../src/components/data/types.ts | 52 +- .../src/components/data/utils.ts | 3 +- .../flytegraph/ReactFlow/BreadCrumb.tsx | 125 + .../flytegraph/ReactFlow/NodeStatusLegend.tsx | 8 +- .../ReactFlow/PausedTasksComponent.tsx | 79 +- .../ReactFlow/ReactFlowBreadCrumbProvider.tsx | 96 + .../ReactFlow/ReactFlowGraphComponent.tsx | 63 +- .../flytegraph/ReactFlow/ReactFlowStyled.tsx | 212 + .../flytegraph/ReactFlow/ReactFlowWrapper.tsx | 56 +- .../flytegraph/ReactFlow/commonStyles.ts | 1 - .../ReactFlow/customNodeComponents.tsx | 458 +- .../flytegraph/ReactFlow/strings.ts | 3 +- .../ReactFlow/test/NodeStatusLegend.test.tsx | 6 +- .../test/PausedTasksComponent.test.tsx | 107 +- .../flytegraph/ReactFlow/test/utils.test.ts | 39 + .../ReactFlow/transformDAGToReactFlowV2.tsx | 172 +- .../components/flytegraph/ReactFlow/types.ts | 44 +- .../components/flytegraph/ReactFlow/utils.tsx | 362 +- .../__stories__/CustomNodes.stories.tsx | 13 +- .../flytegraph/__stories__/batchTasks.json | 0 .../flytegraph/__stories__/largeGraph.json | 0 .../flytegraph/__stories__/rich.json | 9 +- .../flytegraph/__stories__/simple.json | 0 .../src/components/flytegraph/layoutUtils.ts | 20 + .../src/components/flytegraph/types.ts | 10 +- .../src/components/hooks/Entity/constants.ts | 14 +- .../hooks/Entity/useEntityVersions.ts | 9 +- .../hooks/__mocks__/fetchableData.ts | 15 +- .../src/components/hooks/fetchMachine.ts | 8 +- .../hooks/test/useDebouncedValue.test.tsx | 0 .../hooks/test/useFetchableData.test.tsx | 18 +- .../hooks/test/useKeyListener.test.tsx | 0 .../hooks/test/usePagination.test.tsx | 56 +- .../hooks/test/useQueryState.test.tsx | 97 + .../src/components/hooks/test/utils.test.ts | 10 +- .../src/components/hooks/types.ts | 28 +- .../src/components/hooks/useChartState.ts | 2 +- .../components/hooks/useConditionalQuery.ts | 13 +- .../src/components/hooks/useDataProxy.ts | 12 +- .../src/components/hooks/useDebouncedValue.ts | 0 .../src/components/hooks/useDescription.ts | 14 + .../src/components/hooks/useFetchableData.ts | 69 +- .../src/components/hooks/useKeyListener.ts | 7 +- .../src/components/hooks/useLaunchPlans.ts | 13 + .../hooks/useNodeExecutionChildrenQuery.ts | 62 + .../hooks/useNodeExecutionDataQuery.ts | 31 + .../hooks/useOnlyMineSelectedValue.ts | 2 +- .../src/components/hooks/usePagination.ts | 27 +- .../src/components/hooks/useProjects.ts | 29 + .../src/components/hooks/useQueryState.ts | 84 + .../src/components/hooks/useTabState.ts | 27 + .../src/components/hooks/useUserProfile.ts | 5 +- .../components/hooks/useWorkflowExecutions.ts | 26 + ...orkflowNodeExecutionTaskExecutionsQuery.ts | 50 + .../components/hooks/useWorkflowSchedules.ts | 10 +- .../src/components/hooks/utils.ts | 41 +- .../src/components/utils/GlobalStyles.tsx | 52 + .../src/components/utils/classes.ts | 95 + .../src/components/utils/index.ts | 0 packages/oss-console/src/index.ts | 4 + .../src/mocks/createAdminServer.ts | 235 +- .../src/mocks/data/constants.ts | 9 +- .../data/fixtures/basicPythonWorkflow.ts | 21 +- .../fixtures/dynamicExternalSubworkflow.ts | 72 +- .../data/fixtures/dynamicPythonWorkflow.ts | 70 + .../data/fixtures/oneFailedTaskWorkflow.ts | 33 +- .../src/mocks/data/fixtures/types.ts | 14 +- .../src/mocks/data/generators.ts | 32 +- .../src/mocks/data/insertFixture.ts | 29 +- .../oss-console/src/mocks/data/projects.ts | 18 + .../src/mocks/data/utils.ts | 52 +- .../src/mocks/errors.ts | 7 +- .../src/mocks/server.ts | 5 +- .../src/mocks/utils.ts | 9 +- .../src/models/AdminEntity/AdminApiQuery.ts | 5 +- .../src/models/AdminEntity/AdminEntity.ts | 51 +- .../src/models/AdminEntity/constants.ts | 10 +- .../AdminEntity/test/AdminApiQuery.spec.ts | 16 +- .../src/models/AdminEntity/test/utils.spec.ts | 34 +- .../src/models/AdminEntity/utils.ts | 30 +- .../src/models/Common/api.ts | 31 +- .../src/models/Common/constants.ts | 0 .../src/models/Common/types.ts | 48 +- .../src/models/Common/utils.ts | 29 +- .../src/models/DescriptionEntity/api.ts | 15 +- .../src/models/DescriptionEntity/types.ts | 4 +- .../src/models/DescriptionEntity/utils.ts | 10 +- .../models/Execution/__mocks__/constants.ts | 0 .../__mocks__/mockNodeExecutionsData.ts | 17 +- .../__mocks__/mockTaskExecutionsData.ts | 17 +- .../__mocks__/mockWorkflowExecutionsData.ts | 22 +- .../__mocks__/sampleExecutionError.ts | 0 .../src/models/Execution/api.ts | 125 +- .../src/models/Execution/constants.ts | 16 +- .../src/models/Execution/enums.ts | 7 +- .../src/models/Execution/types.ts | 73 +- .../src/models/Execution/utils.ts | 38 +- .../src/models/Graph/types.ts | 11 +- packages/oss-console/src/models/Launch/api.ts | 51 + .../src/models/Launch/constants.ts | 11 + .../src/models/Launch/types.ts | 6 +- .../src/models/Launch/utils.ts | 4 +- .../src/models/Node/__mocks__/mockNodeData.ts | 12 +- .../src/models/Node/constants.ts | 2 - .../src/models/Node/types.ts | 4 +- packages/oss-console/src/models/Node/utils.ts | 30 + .../src/models/Project/api.ts | 27 +- .../src/models/Project/types.ts | 2 +- .../oss-console/src/models/Project/utils.ts | 9 + .../src/models/Task/__mocks__/mockTaskData.ts | 0 .../src/models/Task/api.ts | 24 +- .../src/models/Task/constants.ts | 0 .../src/models/Task/task.test.ts | 19 +- .../src/models/Task/types.ts | 6 +- .../src/models/Task/utils.ts | 19 +- .../src/models/Workflow/api.ts | 26 +- .../src/models/Workflow/constants.ts | 0 .../src/models/Workflow/types.ts | 10 +- .../oss-console/src/models/Workflow/utils.ts | 19 + .../src/models/__mocks__/executionsData.ts | 22 +- .../src/models/__mocks__/graphWorkflowData.ts | 16 + .../src/models/__mocks__/launchPlanData.ts | 32 +- .../src/models/__mocks__/projectData.ts | 18 + .../src/models/__mocks__/sampleTaskNames.ts | 10 +- .../models/__mocks__/sampleWorkflowNames.ts | 19 +- .../models/__mocks__/simpleTaskClosure.json | 0 .../models/__mocks__/simpleWorkflow.mock.ts | 201 + .../__mocks__/simpleWorkflowClosure.json | 0 .../src/models/__mocks__/taskData.ts | 20 +- .../src/models/__mocks__/workflowData.ts | 33 +- .../src/models/enums.ts | 4 +- .../src/queries/descriptionEntitiesQuery.ts | 63 + .../src/queries/executionMetricsQuery.ts | 44 + .../src/queries/launchPlanQueries.ts | 89 + .../src/queries/nodeExecutionQueries.ts | 117 + .../oss-console/src/queries/projectQueries.ts | 122 + .../src/queries/taskExecutionQueries.ts | 60 + .../oss-console/src/queries/taskQueries.ts | 75 + .../src/queries/workflowQueries.ts | 114 + .../oss-console/src/routes/AnimateRoute.tsx | 46 + packages/oss-console/src/routes/constants.ts | 5 + packages/oss-console/src/routes/history.ts | 3 + packages/oss-console/src/routes/routes.ts | 213 + .../tests/useDomainPathUpgrade.test.tsx | 108 + .../src/routes/types.ts | 0 .../src/routes/useDomainPathUpgrade.tsx | 82 + packages/oss-console/src/test/modelUtils.ts | 26 + packages/oss-console/src/test/renderUtils.tsx | 14 + packages/oss-console/src/test/setupTests.ts | 23 + .../src/test/utils.ts | 37 +- .../src/tsd/assets.d.ts | 0 .../src/tsd/contrast.d.ts | 0 .../src/tsd/d3-dag.d.ts | 0 .../oss-console}/src/tsd/globals.d.ts | 0 .../src/tsd/index.d.ts | 0 packages/oss-console/src/tsd/window.d.ts | 1 + packages/oss-console/tsconfig.build.json | 53 + packages/oss-console/tsconfig.json | 26 + packages/primitives/jest.config.js | 6 + packages/primitives/package.json | 65 + .../ButtonCircularProgress.stories.tsx | 14 +- .../src/CircularProgressButton/index.tsx | 17 + .../primitives/src/CopyableWrapper/index.tsx | 76 + .../primitives/src/CustomNavBar/Actions.tsx | 45 + .../src/CustomNavBar/HomeButtons.tsx | 57 + .../primitives/src/CustomNavBar/NavLink.tsx | 73 + .../src/CustomNavBar/NavLinkItem.tsx | 57 + .../src/CustomNavBar/NavigationItems.tsx | 231 + .../src/CustomNavBar/UserProfile.tsx | 154 + .../primitives/src/CustomNavBar/index.tsx | 260 + .../src/CustomNavBar/login.test.tsx | 61 + .../primitives/src/CustomNavBar/strings.ts | 15 + .../primitives/src/HoverTooltip/index.tsx | 73 + packages/primitives/src/InfoTooltip/index.tsx | 19 + packages/primitives/src/Loading/index.tsx | 3 + .../LoadingSpinner.stories.tsx | 2 +- .../LoadingSpinner/LoadingSpinner.test.tsx | 19 + .../primitives/src/LoadingSpinner/index.tsx | 62 + .../primitives/src/MetricMeter/constant.ts | 20 + packages/primitives/src/NoResults/index.tsx | 18 + packages/primitives/src/NoResults/strings.ts | 7 + packages/primitives/src/PageMeta/index.tsx | 14 + .../src/SessionManagent/LoginPanel.tsx | 91 + .../primitives/src/SessionManagent/index.ts | 1 + packages/primitives/src/Shimmer/index.tsx | 30 + .../primitives/src/SimpleCache/SimpleCache.ts | 90 + .../SimpleCache/SimpleCacheCallbackManager.ts | 102 + packages/primitives/src/SimpleCache/index.ts | 5 + .../src/SimpleCache/tests/simpleCache.test.ts | 146 + .../tests/simpleCacheCallbackmanager.test.ts | 76 + .../src/TableLoadMoreCell/index.tsx | 59 + .../primitives/src/TableLoadingCell/index.tsx | 16 + .../primitives/src/TableNoRowsCell/index.tsx | 37 + .../src/assets/icons/FlyteLogo.tsx} | 13 + .../primitives/src/common/LoadingSpinner.tsx | 34 + packages/primitives/src/common/index.ts | 1 + .../src/hooks/DataProvider/DataProvider.tsx | 7 + .../src/hooks/DataProvider/apis/admin.ts | 124 + .../src/hooks/DataProvider/apis/logs-utils.ts | 114 + .../src/hooks/DataProvider/apis/logs.ts | 123 + .../src/hooks/DataProvider/store.ts | 24 + .../src/hooks/DataProvider/utils.ts | 45 + .../FeatureFlagContext.tsx | 13 + .../FeatureFlagProvider.tsx | 42 + .../FeatureFlagsProvider/defaultFlags.ts | 9 + .../FeatureFlagsProvider/useFeatureFlags.ts | 6 + .../IdentityProvider/IdentityContext.tsx | 27 + .../IdentityProvider/IdentityProvider.tsx | 45 + .../src/hooks/IdentityProvider/Restricted.tsx | 20 + .../hooks/IdentityProvider/useUserIdentity.ts | 6 + .../src}/hooks/useDelayedValue.ts | 6 +- packages/primitives/src/types/cloudTypes.ts | 100 + .../primitives/src/types/flyteConstants.ts | 12 + packages/primitives/src/types/flyteTypes.ts | 55 + packages/primitives/src/types/rest.ts | 7 + packages/primitives/src/utils/api.ts | 54 + packages/primitives/src/utils/dateUtils.ts | 32 + packages/primitives/src/utils/endpoints.ts | 80 + packages/primitives/src/utils/environment.ts | 12 + packages/primitives/src/utils/format.test.tsx | 55 + packages/primitives/src/utils/format.ts | 131 + packages/primitives/src/utils/navUtils.tsx | 131 + .../tsconfig.build.json | 44 +- packages/primitives/tsconfig.json | 23 + packages/theme/jest.config.js | 6 + packages/theme/package.json | 27 + .../theme/src/CommonStyles/CommonStyles.tsx | 187 + .../src/CommonStyles}/colorSpectrum.ts | 219 +- packages/theme/src/CommonStyles/constants.ts | 42 + packages/theme/src/CommonStyles/utils.ts | 17 + .../theme/src/Theme/Typography.stories.tsx | 70 + packages/theme/src/Theme/muiTheme.ts | 535 + packages/theme/src/Theme/types.ts | 94 + packages/theme/src/Theme/utils.ts | 4 + packages/theme/src/config/index.ts | 11 + .../tsconfig.build.json | 12 +- packages/theme/tsconfig.json | 5 + packages/ui-atoms/LICENSE | 202 - packages/ui-atoms/README.md | 5 - packages/ui-atoms/jest.config.js | 7 + packages/ui-atoms/package.json | 61 +- packages/ui-atoms/src/ArchiveLogo/index.tsx | 30 + .../ui-atoms/src/ExecutionsLogo/index.tsx | 20 + packages/ui-atoms/src/HomeLogo/index.tsx | 21 + .../src/Icons/FlyteLogo/FlyteLogo.stories.tsx | 91 - .../ui-atoms/src/Icons/InfoIcon/index.tsx | 20 - .../ui-atoms/src/Icons/MapCacheIcon/index.tsx | 32 - .../src/Icons/MuiLaunchPlanIcon/index.tsx | 16 - packages/ui-atoms/src/Icons/index.tsx | 5 - .../ui-atoms/src/LaunchPlansLogo/index.tsx | 21 + packages/ui-atoms/src/LockPerson/index.tsx | 10 + packages/ui-atoms/src/LogoutLogo/index.tsx | 21 + packages/ui-atoms/src/MapCacheIcon/index.tsx | 26 + packages/ui-atoms/src/NotFoundLogo/index.tsx | 16 + .../src/{Icons => }/RerunIcon/index.tsx | 4 +- packages/ui-atoms/src/SmallArrow/index.tsx | 23 + packages/ui-atoms/src/TasksLogo/index.tsx | 21 + packages/ui-atoms/src/WorkflowsLogo/index.tsx | 21 + packages/ui-atoms/src/index.ts | 1 - packages/ui-atoms/tsconfig.build.es.json | 7 - packages/ui-atoms/tsconfig.build.json | 15 +- packages/ui-atoms/tsconfig.json | 11 +- packages/ui-atoms/tsconfig.test.json | 3 - script/generator/src/constants.js | 15 +- script/generator/src/questions.js | 18 +- script/generator/src/utils.js | 23 +- .../src/SampleComponent/navbar.stories.tsx | 4 +- script/test/assetsTransformer.js | 2 +- script/test/jest.base.js | 9 +- scripts/assetsTransformer.js | 7 + .../eslint-custom-rules/eslint-custom-path.js | 152 + scripts/eslint-custom-rules/index.js | 4 + scripts/eslint-custom-rules/package.json | 12 + scripts/generate_ssl.sh | 14 + scripts/getFailedLogs.js | 30 + scripts/getTestTodo.js | 161 + scripts/jest-resolver.js | 18 + scripts/jest-setup.ts | 69 + scripts/jest.base.js | 64 + scripts/server.csr.cnf | 14 + scripts/v3.ext | 7 + stories-intro/Button.stories.tsx | 41 + stories-intro/Button.tsx | 48 + stories-intro/Header.stories.tsx | 25 + stories-intro/Header.tsx | 56 + stories-intro/Introduction.stories.mdx | 198 + stories-intro/Page.stories.tsx | 26 + stories-intro/Page.tsx | 73 + stories-intro/assets/code-brackets.svg | 1 + stories-intro/assets/colors.svg | 1 + stories-intro/assets/comments.svg | 1 + stories-intro/assets/direction.svg | 1 + stories-intro/assets/flow.svg | 1 + stories-intro/assets/plugin.svg | 1 + stories-intro/assets/repo.svg | 1 + stories-intro/assets/stackalt.svg | 1 + stories-intro/button.css | 30 + stories-intro/header.css | 32 + stories-intro/page.css | 69 + tsconfig.json | 61 +- types.d.ts | 8 + website/console/env/index.ts | 100 + website/console/jest.config.js | 6 + website/console/package.json | 68 + website/console/src/assets/index.html | 30 + .../src/assets/public/apple-touch-icon.png | Bin .../src/assets/public}/favicon.ico | Bin .../src/assets/public}/favicon.svg | 0 .../src/assets/public/icon-192.png | Bin .../src/assets/public/icon-512.png | Bin .../src/assets/public/manifest.webmanifest | 6 + website/console/src/client/app.tsx | 39 + website/console/src/client/index.tsx | 24 + website/console/src/server/index.ts | 104 + .../console/src/server/routes/mainRouter.ts | 37 + website/console/tsconfig.build.json | 47 + website/console/tsconfig.json | 29 + website/console/webpack.config.ts | 303 + website/console/webpack.dev.config.ts | 127 + website/console/webpack.prod.config.ts | 57 + website/env.js | 69 - website/package.json | 55 - website/src/assets/index.html | 41 - .../src/assets/public/manifest.webmanifest | 7 - website/src/client.tsx | 35 - website/src/server/index.ts | 102 - website/src/server/plugins.ts | 27 - website/src/server/router.ts | 32 - website/src/tsd/contrast.d.ts | 4 - website/src/tsd/d3-dag.d.ts | 276 - website/src/tsd/window.d.ts | 10 - website/tsconfig.build.json | 24 - website/tsconfig.json | 25 - website/webpack.config.ts | 179 - website/webpack.dev.config.ts | 81 - website/webpack.prod.config.ts | 65 - website/webpack.utilities.ts | 211 - yarn.lock | 11519 ++--- 1259 files changed, 43785 insertions(+), 76420 deletions(-) delete mode 100755 .husky/commit-msg delete mode 100644 .vscode/launch.json mode change 100755 => 100644 Makefile delete mode 100644 package-lock.json delete mode 100644 packages/common/LICENSE delete mode 100644 packages/common/README.md create mode 100644 packages/common/jest.config.js create mode 100644 packages/common/src/Errors/NotAuthorizedError.ts create mode 100644 packages/common/src/Errors/NotFoundError.ts create mode 100644 packages/common/src/Errors/ParameterError.ts create mode 100644 packages/common/src/Errors/ValueError.ts create mode 100644 packages/common/src/Utils/decodeProtoResponse.ts create mode 100644 packages/common/src/Utils/getInputDefintionForLiteralType.ts delete mode 100644 packages/common/src/config/index.ts rename packages/{console/src/common/constants.ts => common/src/constants/index.ts} (72%) create mode 100644 packages/common/src/constants/tableConstants.ts create mode 100644 packages/common/src/flyteidl/admin.ts create mode 100644 packages/common/src/flyteidl/core.ts create mode 100644 packages/common/src/flyteidl/coreTypes.ts create mode 100644 packages/common/src/flyteidl/event.ts create mode 100644 packages/common/src/flyteidl/protobuf.ts create mode 100644 packages/common/src/flyteidl/protobufTypes.ts create mode 100644 packages/common/src/flyteidl/service.ts delete mode 100644 packages/common/src/index.ts rename packages/{console => common}/src/tsd/globals.d.ts (100%) rename {website => packages/common}/src/tsd/index.d.ts (63%) rename packages/{console/src/models/AdminEntity/types.ts => common/src/types/adminEntityTypes.ts} (87%) delete mode 100644 packages/common/tsconfig.build.es.json delete mode 100644 packages/common/tsconfig.test.json delete mode 100644 packages/components/LICENSE delete mode 100644 packages/components/README.md delete mode 100644 packages/components/jest.config.js delete mode 100644 packages/components/package.json delete mode 100644 packages/components/src/AppInfo/__mocks__/appInfo.mock.ts delete mode 100644 packages/components/src/AppInfo/__stories__/appInfo.stories.tsx delete mode 100644 packages/components/src/AppInfo/index.tsx delete mode 100644 packages/components/src/AppInfo/strings.ts delete mode 100644 packages/components/src/AppInfo/test/appInfo.test.tsx delete mode 100644 packages/components/src/AppInfo/versionDisplay.tsx delete mode 100644 packages/components/src/Sample/__stories__/sample.stories.tsx delete mode 100644 packages/components/src/Sample/index.tsx delete mode 100644 packages/components/src/Sample/test/sample.test.tsx delete mode 100644 packages/components/src/index.ts delete mode 100644 packages/components/tsconfig.build.es.json delete mode 100644 packages/components/tsconfig.build.json delete mode 100644 packages/components/tsconfig.json delete mode 100644 packages/components/tsconfig.test.json delete mode 100644 packages/console/LICENSE delete mode 100644 packages/console/README.md delete mode 100644 packages/console/jest.config.ts delete mode 100644 packages/console/package.json delete mode 100644 packages/console/src/assets/SmallArrow.svg delete mode 100644 packages/console/src/basics/ExternalConfigHoc.tsx delete mode 100644 packages/console/src/basics/ExternalConfigurationProvider/ExternalConfigurationProvider.tsx delete mode 100644 packages/console/src/basics/ExternalConfigurationProvider/index.ts delete mode 100644 packages/console/src/basics/FeatureFlags/AdminFlag.tsx delete mode 100644 packages/console/src/basics/FeatureFlags/FeatureFlags.test.tsx delete mode 100644 packages/console/src/basics/FeatureFlags/defaultConfig.ts delete mode 100644 packages/console/src/basics/FeatureFlags/index.tsx delete mode 100644 packages/console/src/basics/index.ts delete mode 100644 packages/console/src/common/index.ts delete mode 100644 packages/console/src/common/promiseUtils.ts delete mode 100644 packages/console/src/common/timer.ts delete mode 100644 packages/console/src/components/App/App.tsx delete mode 100644 packages/console/src/components/Breadcrumbs/async/utils.ts delete mode 100644 packages/console/src/components/Breadcrumbs/components/BreadcrumbFormControl.tsx delete mode 100644 packages/console/src/components/Breadcrumbs/components/index.ts delete mode 100644 packages/console/src/components/Breadcrumbs/hooks/index.tsx delete mode 100644 packages/console/src/components/Breadcrumbs/index.ts delete mode 100644 packages/console/src/components/Breadcrumbs/viewAll/index.ts delete mode 100644 packages/console/src/components/Entities/EntityDescription.tsx delete mode 100644 packages/console/src/components/Entities/EntityDetails.tsx delete mode 100644 packages/console/src/components/Entities/EntityDetailsHeader.tsx delete mode 100644 packages/console/src/components/Entities/EntityExecutions.tsx delete mode 100644 packages/console/src/components/Entities/EntityExecutionsBarChart.tsx delete mode 100644 packages/console/src/components/Entities/EntityInputs.tsx delete mode 100644 packages/console/src/components/Entities/EntitySchedules.tsx delete mode 100644 packages/console/src/components/Entities/EntityVersions.tsx delete mode 100644 packages/console/src/components/Entities/Row.tsx delete mode 100644 packages/console/src/components/Entities/VersionDetails/EntityVersionDetails.tsx delete mode 100644 packages/console/src/components/Entities/VersionDetails/EntityVersionDetailsContainer.tsx delete mode 100644 packages/console/src/components/Entities/VersionDetails/EnvVarsTable.tsx delete mode 100644 packages/console/src/components/Entities/VersionDetails/VersionDetailsLink.tsx delete mode 100644 packages/console/src/components/Entities/generators.ts delete mode 100644 packages/console/src/components/Entities/test/EntityDetails.test.tsx delete mode 100644 packages/console/src/components/Entities/test/EntitySchedules.test.tsx delete mode 100644 packages/console/src/components/Entities/test/EntityVersionDetails.test.tsx delete mode 100644 packages/console/src/components/Entities/test/TaskVersionDetailsLink.test.tsx delete mode 100644 packages/console/src/components/Errors/DataError.tsx delete mode 100644 packages/console/src/components/Errors/index.ts delete mode 100644 packages/console/src/components/Errors/test/DataError.test.tsx delete mode 100644 packages/console/src/components/Executions/CacheStatus.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/ExecutionNodeURL.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/ExecutionTab.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/ExecutionTabView.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/NodeExecutionDetailsPanelContent.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/NodeExecutionInputs.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/NodeExecutionOutputs.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/index.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/test/index.test.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/StatusIndicator.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/TaskExecutionNode.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/TaskExecutionNodeRenderer.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/Timeline/ChartHeader.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimeline.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineContainer.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineFooter.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/Timeline/NodeExecutionName.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/Timeline/TaskNames.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/Timeline/TimelineChart/index.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/Timeline/scaleContext.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/index.ts delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/test/ExecutionNodeViews.test.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/test/ExecutionTabContent.test.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/test/NodeExecutionDetailsPanelContent.test.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/test/NodeExecutionName.test.tsx delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/useNodeExecutionRow.ts delete mode 100644 packages/console/src/components/Executions/ExecutionDetails/utils.ts delete mode 100644 packages/console/src/components/Executions/Tables/ExecutionsTableHeader.tsx delete mode 100644 packages/console/src/components/Executions/Tables/ExpandableExecutionError.tsx delete mode 100644 packages/console/src/components/Executions/Tables/NoExecutionsContent.tsx delete mode 100644 packages/console/src/components/Executions/Tables/NodeExecutionActions.tsx delete mode 100644 packages/console/src/components/Executions/Tables/NodeExecutionRow.tsx delete mode 100644 packages/console/src/components/Executions/Tables/NodeExecutionsTable.tsx delete mode 100644 packages/console/src/components/Executions/Tables/RowExpander.tsx delete mode 100644 packages/console/src/components/Executions/Tables/WorkflowExecutionTable/WorkflowExecutionRow.tsx delete mode 100644 packages/console/src/components/Executions/Tables/WorkflowExecutionTable/cells.tsx delete mode 100644 packages/console/src/components/Executions/Tables/WorkflowExecutionTable/strings.ts delete mode 100644 packages/console/src/components/Executions/Tables/WorkflowExecutionTable/styles.ts delete mode 100644 packages/console/src/components/Executions/Tables/WorkflowExecutionsTable.tsx delete mode 100644 packages/console/src/components/Executions/Tables/__mocks__/WorkflowExecutionsTable.tsx delete mode 100644 packages/console/src/components/Executions/Tables/__stories__/WorkflowExecutionsTable.stories.tsx delete mode 100644 packages/console/src/components/Executions/Tables/nodeExecutionColumns.tsx delete mode 100644 packages/console/src/components/Executions/Tables/styles.ts delete mode 100644 packages/console/src/components/Executions/Tables/test/NodeExecutionActions.test.tsx delete mode 100644 packages/console/src/components/Executions/Tables/test/NodeExecutionRow.test.tsx delete mode 100644 packages/console/src/components/Executions/Tables/types.ts delete mode 100644 packages/console/src/components/Executions/Tables/utils.ts delete mode 100644 packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionDetails.tsx delete mode 100644 packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionError.tsx delete mode 100644 packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionLogsCard.tsx delete mode 100644 packages/console/src/components/Executions/TaskExecutionsList/index.ts delete mode 100644 packages/console/src/components/Executions/TaskExecutionsList/test/TaskExecutionsList.test.tsx delete mode 100644 packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDetailsContextProvider.tsx delete mode 100644 packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDynamicProvider.tsx delete mode 100644 packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/WorkflowNodeExecutionsProvider.tsx delete mode 100644 packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/createExecutionArray.tsx delete mode 100644 packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/getTaskThroughExecution.ts delete mode 100644 packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/index.ts delete mode 100644 packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/types.ts delete mode 100644 packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/utils.ts delete mode 100644 packages/console/src/components/Executions/contextProvider/index.ts delete mode 100644 packages/console/src/components/Executions/contexts.ts delete mode 100644 packages/console/src/components/Executions/index.ts delete mode 100644 packages/console/src/components/Executions/nodeExecutionQueries.ts delete mode 100644 packages/console/src/components/Executions/taskExecutionQueries.ts delete mode 100644 packages/console/src/components/Executions/useExecutionMetrics.tsx delete mode 100644 packages/console/src/components/Executions/useTaskExecutions.ts delete mode 100644 packages/console/src/components/Executions/workflowExecutionQueries.ts delete mode 100644 packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/DatetimeInput.tsx delete mode 100644 packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/EnumInput.tsx delete mode 100644 packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/SearchableSelector.tsx delete mode 100644 packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/StyledCard.tsx delete mode 100644 packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/index.ts delete mode 100644 packages/console/src/components/Launch/LaunchForm/LaunchFormHeader.tsx delete mode 100644 packages/console/src/components/Launch/LaunchForm/NoInputsNeeded.tsx delete mode 100644 packages/console/src/components/Launch/LaunchForm/UnsupportedRequiredInputsError.tsx delete mode 100644 packages/console/src/components/Launch/LaunchForm/__mocks__/mockInputs.ts delete mode 100644 packages/console/src/components/Launch/LaunchForm/index.ts delete mode 100644 packages/console/src/components/Launch/LaunchForm/styles.ts delete mode 100644 packages/console/src/components/Launch/LaunchForm/test/utils.ts delete mode 100644 packages/console/src/components/Launch/index.ts delete mode 100644 packages/console/src/components/LaunchPlan/SearchableLaunchPlanNameList.tsx delete mode 100644 packages/console/src/components/LaunchPlan/launchPlanQueries.ts delete mode 100644 packages/console/src/components/LaunchPlan/types.ts delete mode 100644 packages/console/src/components/LaunchPlan/useLaunchPlanInfoList.ts delete mode 100644 packages/console/src/components/Literals/styles.ts delete mode 100644 packages/console/src/components/Literals/test/helpers/genScalarStructuredDsCase.mock.ts delete mode 100644 packages/console/src/components/Navigation/DefaultAppBarContent.tsx delete mode 100644 packages/console/src/components/Navigation/NavBar.tsx delete mode 100644 packages/console/src/components/Navigation/NavBarContent.tsx delete mode 100644 packages/console/src/components/Navigation/NavLinkWithSearch.tsx delete mode 100644 packages/console/src/components/Navigation/NavigationDropdown.tsx delete mode 100644 packages/console/src/components/Navigation/OnlyMine/FilterPopoverIcon.tsx delete mode 100644 packages/console/src/components/Navigation/OnlyMine/index.tsx delete mode 100644 packages/console/src/components/Navigation/OnlyMine/strings.ts delete mode 100644 packages/console/src/components/Navigation/ProjectNavigation.tsx delete mode 100644 packages/console/src/components/Navigation/ProjectSelector.tsx delete mode 100644 packages/console/src/components/Navigation/Readme.md delete mode 100644 packages/console/src/components/Navigation/SearchableProjectList.tsx delete mode 100644 packages/console/src/components/Navigation/SideNavigation.tsx delete mode 100644 packages/console/src/components/Navigation/SubNavBarContent.tsx delete mode 100644 packages/console/src/components/Navigation/TopLevelLayout.tsx delete mode 100644 packages/console/src/components/Navigation/UserInformation.tsx delete mode 100644 packages/console/src/components/Navigation/index.ts delete mode 100644 packages/console/src/components/Navigation/strings.ts delete mode 100644 packages/console/src/components/Navigation/test/ProjectSelector.test.tsx delete mode 100644 packages/console/src/components/Navigation/test/UserInformation.test.tsx delete mode 100644 packages/console/src/components/Navigation/utils.ts delete mode 100644 packages/console/src/components/Navigation/withSideNavigation.tsx delete mode 100644 packages/console/src/components/NotFound/NotFound.tsx delete mode 100644 packages/console/src/components/NotFound/__stories__/NotFound.stories.tsx delete mode 100644 packages/console/src/components/Notifications/SystemStatusBanner.tsx delete mode 100644 packages/console/src/components/Project/ProjectDashboard.tsx delete mode 100644 packages/console/src/components/Project/ProjectDetails.tsx delete mode 100644 packages/console/src/components/Project/ProjectLaunchPlans.tsx delete mode 100644 packages/console/src/components/Project/ProjectStatusBar.tsx delete mode 100644 packages/console/src/components/Project/ProjectTasks.tsx delete mode 100644 packages/console/src/components/Project/ProjectWorkflows.tsx delete mode 100644 packages/console/src/components/Project/constants.ts delete mode 100644 packages/console/src/components/Project/strings.ts delete mode 100644 packages/console/src/components/Project/test/ProjectDashboard.test.tsx delete mode 100644 packages/console/src/components/Project/test/ProjectTask.test.tsx delete mode 100644 packages/console/src/components/Project/test/ProjectWorkflows.test.tsx delete mode 100644 packages/console/src/components/SelectProject/ProjectList.tsx delete mode 100644 packages/console/src/components/SelectProject/SelectProject.tsx delete mode 100644 packages/console/src/components/Tables/DataList.tsx delete mode 100644 packages/console/src/components/Tables/LoadMoreRowContent.tsx delete mode 100644 packages/console/src/components/Tables/PaginatedDataList.tsx delete mode 100644 packages/console/src/components/Tables/constants.ts delete mode 100644 packages/console/src/components/Task/SearchableTaskNameList.tsx delete mode 100644 packages/console/src/components/Task/SimpleTaskInterface.tsx delete mode 100644 packages/console/src/components/Task/index.ts delete mode 100644 packages/console/src/components/Task/taskQueries.ts delete mode 100644 packages/console/src/components/Task/test/SimpleTaskInterface.test.tsx delete mode 100644 packages/console/src/components/Task/useLatestTask.ts delete mode 100644 packages/console/src/components/Task/utils.ts delete mode 100644 packages/console/src/components/Theme/constants.ts delete mode 100644 packages/console/src/components/Theme/muiTheme.ts delete mode 100644 packages/console/src/components/Theme/useTheme.ts delete mode 100644 packages/console/src/components/Workflow/SearchableWorkflowNameList.tsx delete mode 100644 packages/console/src/components/Workflow/StaticGraphContainer.tsx delete mode 100644 packages/console/src/components/Workflow/WorkflowVersionDetails.tsx delete mode 100644 packages/console/src/components/Workflow/index.ts delete mode 100644 packages/console/src/components/Workflow/types.ts delete mode 100644 packages/console/src/components/Workflow/useWorkflowInfoItem.ts delete mode 100644 packages/console/src/components/Workflow/useWorkflowInfoList.ts delete mode 100644 packages/console/src/components/Workflow/utils.ts delete mode 100644 packages/console/src/components/Workflow/workflowQueries.ts delete mode 100644 packages/console/src/components/WorkflowGraph/InputOutputNodeRenderer.tsx delete mode 100644 packages/console/src/components/WorkflowGraph/TaskNodeRenderer.tsx delete mode 100644 packages/console/src/components/WorkflowGraph/WorkflowGraph.tsx delete mode 100644 packages/console/src/components/common/BarChart.tsx delete mode 100644 packages/console/src/components/common/ButtonCircularProgress.tsx delete mode 100644 packages/console/src/components/common/ButtonLink.tsx delete mode 100644 packages/console/src/components/common/ClosableDialogTitle.tsx delete mode 100644 packages/console/src/components/common/DataTable.tsx delete mode 100644 packages/console/src/components/common/DetailsGroup.tsx delete mode 100644 packages/console/src/components/common/DetailsPanel.tsx delete mode 100644 packages/console/src/components/common/DetailsPanelContent.tsx delete mode 100644 packages/console/src/components/common/DomainSettingsSection.tsx delete mode 100644 packages/console/src/components/common/DumpJSON.tsx delete mode 100644 packages/console/src/components/common/ErrorBoundary.tsx delete mode 100644 packages/console/src/components/common/ExpandableMonospaceText.tsx delete mode 100644 packages/console/src/components/common/FileUpload/FileItem.tsx delete mode 100644 packages/console/src/components/common/FileUpload/FileUpload.tsx delete mode 100644 packages/console/src/components/common/FilterableNamedEntityList.tsx delete mode 100644 packages/console/src/components/common/Icons/InfoIcon.tsx delete mode 100644 packages/console/src/components/common/Icons/interface.ts delete mode 100644 packages/console/src/components/common/LoadingSpinner.tsx delete mode 100644 packages/console/src/components/common/MapTaskExecutionsList/MapTaskStatusInfo.tsx delete mode 100644 packages/console/src/components/common/MapTaskExecutionsList/TaskNameList.tsx delete mode 100644 packages/console/src/components/common/MapTaskExecutionsList/test/TaskNameList.test.tsx delete mode 100644 packages/console/src/components/common/NewTargetLink.tsx delete mode 100644 packages/console/src/components/common/NoResults.tsx delete mode 100644 packages/console/src/components/common/PanelSection/index.tsx delete mode 100644 packages/console/src/components/common/ReactJsonView.tsx delete mode 100644 packages/console/src/components/common/ScrollableMonospaceText.tsx delete mode 100644 packages/console/src/components/common/SearchInputForm.tsx delete mode 100644 packages/console/src/components/common/SearchableList.tsx delete mode 100644 packages/console/src/components/common/SearchableNamedEntityList.tsx delete mode 100644 packages/console/src/components/common/SectionHeader.tsx delete mode 100644 packages/console/src/components/common/Shimmer.tsx delete mode 100644 packages/console/src/components/common/index.ts delete mode 100644 packages/console/src/components/common/keyboardEvents.ts delete mode 100644 packages/console/src/components/common/styles.ts delete mode 100644 packages/console/src/components/common/test/DomainSettingsSection.test.tsx delete mode 100644 packages/console/src/components/common/test/LoadingSpinner.test.tsx delete mode 100644 packages/console/src/components/common/test/SearchableList.spec.tsx delete mode 100644 packages/console/src/components/common/useSearchableListState.ts delete mode 100644 packages/console/src/components/common/utils.ts delete mode 100644 packages/console/src/components/data/index.ts delete mode 100644 packages/console/src/components/flytegraph/Arrowhead.tsx delete mode 100644 packages/console/src/components/flytegraph/DragAllowingClickHandler.ts delete mode 100644 packages/console/src/components/flytegraph/InteractiveViewBox.tsx delete mode 100644 packages/console/src/components/flytegraph/Layout.tsx delete mode 100644 packages/console/src/components/flytegraph/Node.tsx delete mode 100644 packages/console/src/components/flytegraph/NodeLink.tsx delete mode 100644 packages/console/src/components/flytegraph/NodeText.tsx delete mode 100644 packages/console/src/components/flytegraph/ReactFlow/BreadCrumb.tsx delete mode 100644 packages/console/src/components/flytegraph/ReactFlow/ReactFlowBreadCrumbProvider.tsx delete mode 100644 packages/console/src/components/flytegraph/ReactFlow/test/utils.test.ts delete mode 100644 packages/console/src/components/flytegraph/RenderedGraph.tsx delete mode 100644 packages/console/src/components/flytegraph/constants.ts delete mode 100644 packages/console/src/components/flytegraph/layoutUtils.ts delete mode 100644 packages/console/src/components/flytegraph/theme.ts delete mode 100644 packages/console/src/components/flytegraph/timer.ts delete mode 100644 packages/console/src/components/flytegraph/utils.ts delete mode 100644 packages/console/src/components/hooks/index.ts delete mode 100644 packages/console/src/components/hooks/useDataRefresher.ts delete mode 100644 packages/console/src/components/hooks/useDescription.ts delete mode 100644 packages/console/src/components/hooks/useLaunchPlans.ts delete mode 100644 packages/console/src/components/hooks/useLocationState.ts delete mode 100644 packages/console/src/components/hooks/useNamedEntity.ts delete mode 100644 packages/console/src/components/hooks/useNodeExecution.ts delete mode 100644 packages/console/src/components/hooks/useProjects.ts delete mode 100644 packages/console/src/components/hooks/useQueryState.ts delete mode 100644 packages/console/src/components/hooks/useTabState.ts delete mode 100644 packages/console/src/components/hooks/useTask.ts delete mode 100644 packages/console/src/components/hooks/useTaskExecution.ts delete mode 100644 packages/console/src/components/hooks/useVersion.ts delete mode 100644 packages/console/src/components/hooks/useWorkflowExecutions.ts delete mode 100644 packages/console/src/components/index.ts delete mode 100644 packages/console/src/components/utils/GlobalStyles.tsx delete mode 100644 packages/console/src/config/types.ts delete mode 100644 packages/console/src/errors/fetchErrors.ts delete mode 100644 packages/console/src/errors/parameterErrors.ts delete mode 100644 packages/console/src/errors/protobufErrors.ts delete mode 100644 packages/console/src/errors/validationErrors.ts delete mode 100644 packages/console/src/index.ts delete mode 100644 packages/console/src/mocks/data/fixtures/dynamicPythonWorkflow.ts delete mode 100644 packages/console/src/mocks/data/projects.ts delete mode 100644 packages/console/src/mocks/insertDefaultData.ts delete mode 100644 packages/console/src/models/AdminEntity/index.ts delete mode 100644 packages/console/src/models/AdminEntity/test/AdminEntity.spec.ts delete mode 100644 packages/console/src/models/Graph/convertFlyteGraphToDAG.ts delete mode 100644 packages/console/src/models/Launch/api.ts delete mode 100644 packages/console/src/models/Launch/constants.ts delete mode 100644 packages/console/src/models/Node/utils.ts delete mode 100644 packages/console/src/models/Project/test/api.test.ts delete mode 100644 packages/console/src/models/Project/utils.ts delete mode 100644 packages/console/src/models/Task/index.ts delete mode 100644 packages/console/src/models/Workflow/index.ts delete mode 100644 packages/console/src/models/Workflow/utils.ts delete mode 100644 packages/console/src/models/__mocks__/graphWorkflowData.ts delete mode 100644 packages/console/src/models/__mocks__/projectData.ts delete mode 100644 packages/console/src/models/index.ts delete mode 100644 packages/console/src/routes/ApplicationRouter.tsx delete mode 100644 packages/console/src/routes/components.ts delete mode 100644 packages/console/src/routes/constants.ts delete mode 100644 packages/console/src/routes/history.ts delete mode 100644 packages/console/src/routes/index.ts delete mode 100644 packages/console/src/routes/routes.ts delete mode 100644 packages/console/src/test/modelUtils.ts delete mode 100644 packages/console/src/test/setupTests.ts delete mode 100644 packages/console/src/tsd/window.d.ts delete mode 100644 packages/console/tsconfig.build.es.json delete mode 100644 packages/console/tsconfig.json delete mode 100644 packages/console/tsconfig.test.json delete mode 100644 packages/flyte-api/LICENSE delete mode 100644 packages/flyte-api/README.md delete mode 100644 packages/flyte-api/src/index.ts create mode 100644 packages/flyte-api/src/utils/AdminEndpoint.ts create mode 100644 packages/flyte-api/src/utils/RawEndpoint.ts create mode 100644 packages/flyte-api/src/utils/adminApiPrefix.ts delete mode 100644 packages/flyte-api/src/utils/constants.ts create mode 100644 packages/flyte-api/src/utils/createLocalURL.ts create mode 100644 packages/flyte-api/src/utils/defaultAxiosConfig.ts create mode 100644 packages/flyte-api/src/utils/ensureSlashPrefixed.ts delete mode 100644 packages/flyte-api/src/utils/errors.ts create mode 100644 packages/flyte-api/src/utils/getAdminApiUrl.ts create mode 100644 packages/flyte-api/src/utils/getAxiosApiCall.ts create mode 100644 packages/flyte-api/src/utils/getEndpointUrl.ts delete mode 100644 packages/flyte-api/src/utils/index.ts rename packages/flyte-api/src/utils/{nodeChecks.ts => isObject.ts} (85%) rename packages/{console/src/models/AdminEntity => flyte-api/src/utils}/transformRequestError.ts (63%) delete mode 100644 packages/flyte-api/tsconfig.build.es.json delete mode 100644 packages/flyte-api/tsconfig.test.json delete mode 100644 packages/flyteidl-types/LICENSE delete mode 100644 packages/flyteidl-types/README.md delete mode 100644 packages/flyteidl-types/package.json delete mode 100644 packages/flyteidl-types/src/index.ts delete mode 100644 packages/flyteidl-types/tsconfig.build.es.json delete mode 100644 packages/flyteidl-types/tsconfig.json delete mode 100644 packages/flyteidl-types/tsconfig.test.json delete mode 100644 packages/locale/LICENSE delete mode 100644 packages/locale/README.md delete mode 100644 packages/locale/tsconfig.build.es.json delete mode 100644 packages/locale/tsconfig.test.json create mode 100644 packages/oss-console/jest.config.ts create mode 100644 packages/oss-console/package.json create mode 100644 packages/oss-console/src/App/ApplicationRouter.tsx create mode 100644 packages/oss-console/src/App/index.tsx rename packages/{console => oss-console}/src/basics/FeatureFlags/FEATURE_FLAGS.md (87%) create mode 100644 packages/oss-console/src/basics/FeatureFlags/FeatureFlags.test.tsx rename packages/{console => oss-console}/src/basics/FeatureFlags/FeatureFlags.tsx (87%) create mode 100644 packages/oss-console/src/basics/FeatureFlags/defaultConfig.ts create mode 100644 packages/oss-console/src/basics/FeatureFlags/index.tsx rename packages/{console => oss-console}/src/basics/LocalCache/ContextProvider.tsx (85%) rename packages/{console => oss-console}/src/basics/LocalCache/defaultConfig.ts (89%) rename packages/{console => oss-console}/src/basics/LocalCache/index.tsx (89%) rename packages/{console => oss-console}/src/basics/LocalCache/localCache.test.tsx (84%) rename packages/{console => oss-console}/src/basics/LocalCache/onlyMineDefaultConfig.ts (93%) rename packages/{console => oss-console}/src/common/formatters.test.ts (90%) rename packages/{console => oss-console}/src/common/formatters.ts (85%) rename packages/{console => oss-console}/src/common/layout.ts (85%) rename packages/{console => oss-console}/src/common/linkify.ts (97%) rename packages/{console => oss-console}/src/common/log.ts (63%) create mode 100644 packages/oss-console/src/common/promiseUtils.ts rename packages/{console => oss-console}/src/common/setupProtobuf.ts (100%) create mode 100644 packages/oss-console/src/common/stringifyIsEqual.ts rename packages/{console => oss-console}/src/common/test/formatters.spec.ts (90%) rename packages/{console => oss-console}/src/common/test/linkify.test.ts (79%) rename packages/{console => oss-console}/src/common/test/utils.spec.ts (93%) rename packages/{console => oss-console}/src/common/timezone.ts (100%) rename packages/{console => oss-console}/src/common/typeCheckers.ts (100%) rename packages/{console => oss-console}/src/common/types.ts (100%) rename packages/{console => oss-console}/src/common/utils.ts (68%) rename packages/{console => oss-console}/src/components/Breadcrumbs/async/executionContext.ts (58%) rename packages/{console => oss-console}/src/components/Breadcrumbs/async/fn.ts (51%) create mode 100644 packages/oss-console/src/components/Breadcrumbs/async/utils/breadcrumQueryOptions.ts create mode 100644 packages/oss-console/src/components/Breadcrumbs/async/utils/domainIdFromURL.ts create mode 100644 packages/oss-console/src/components/Breadcrumbs/async/utils/formatProjectEntities.ts create mode 100644 packages/oss-console/src/components/Breadcrumbs/async/utils/formatProjectEntitiesAsDomains.ts create mode 100644 packages/oss-console/src/components/Breadcrumbs/async/utils/index.ts create mode 100644 packages/oss-console/src/components/Breadcrumbs/async/utils/projectIdFromURL.ts rename packages/{console/src/components/Breadcrumbs/async/utils.test.ts => oss-console/src/components/Breadcrumbs/async/utils/tests/domainIdFromURL.test.ts} (50%) create mode 100644 packages/oss-console/src/components/Breadcrumbs/async/utils/tests/formatProjectEntities.test.ts create mode 100644 packages/oss-console/src/components/Breadcrumbs/async/utils/tests/formatProjectEntitiesAsDomains.test.ts create mode 100644 packages/oss-console/src/components/Breadcrumbs/async/utils/tests/projectIdFromURL.test.ts create mode 100644 packages/oss-console/src/components/Breadcrumbs/components/BreadcrumbFormControl.tsx rename packages/{console => oss-console}/src/components/Breadcrumbs/components/BreadcrumbPopover.tsx (60%) rename packages/{console => oss-console}/src/components/Breadcrumbs/components/BreadcrumbTitleActions.tsx (81%) rename packages/{console => oss-console}/src/components/Breadcrumbs/components/Breadcrumbs.tsx (60%) create mode 100644 packages/oss-console/src/components/Breadcrumbs/components/breadcrumbGlobalStyles.tsx create mode 100644 packages/oss-console/src/components/Breadcrumbs/components/tlmAsyncFns.tsx rename packages/{console => oss-console}/src/components/Breadcrumbs/defaultValue/default.ts (100%) rename packages/{console => oss-console}/src/components/Breadcrumbs/defaultValue/index.ts (100%) rename packages/{console => oss-console}/src/components/Breadcrumbs/defaultValue/namedEntities.test.ts (91%) rename packages/{console => oss-console}/src/components/Breadcrumbs/defaultValue/namedEntities.ts (70%) create mode 100644 packages/oss-console/src/components/Breadcrumbs/hooks/index.tsx rename packages/{console => oss-console}/src/components/Breadcrumbs/registry/contextualDefaults.ts (95%) rename packages/{console => oss-console}/src/components/Breadcrumbs/registry/default.ts (100%) rename packages/{console => oss-console}/src/components/Breadcrumbs/registry/index.ts (80%) rename packages/{console => oss-console}/src/components/Breadcrumbs/registry/semanticDefaults.ts (94%) rename packages/{console => oss-console}/src/components/Breadcrumbs/registry/utils.ts (94%) rename packages/{console => oss-console}/src/components/Breadcrumbs/selfLinks/index.ts (81%) rename packages/{console => oss-console}/src/components/Breadcrumbs/types.ts (89%) rename packages/{console => oss-console}/src/components/Breadcrumbs/validators/default.test.ts (100%) rename packages/{console => oss-console}/src/components/Breadcrumbs/validators/default.ts (100%) rename packages/{console => oss-console}/src/components/Breadcrumbs/validators/fn.ts (83%) rename packages/{console => oss-console}/src/components/Breadcrumbs/validators/index.ts (100%) rename packages/{console => oss-console}/src/components/Breadcrumbs/validators/namedEntitiesValidator.test.ts (97%) rename packages/{console => oss-console}/src/components/Cache/CacheContext.ts (100%) rename packages/{console => oss-console}/src/components/Cache/createCache.ts (96%) rename packages/{console => oss-console}/src/components/Cache/utils.ts (100%) create mode 100644 packages/oss-console/src/components/Entities/EntityDescription.tsx create mode 100644 packages/oss-console/src/components/Entities/EntityDetails.tsx create mode 100644 packages/oss-console/src/components/Entities/EntityDetailsHeader.tsx create mode 100644 packages/oss-console/src/components/Entities/EntityExecutions.tsx create mode 100644 packages/oss-console/src/components/Entities/EntityExecutionsBarChart.tsx create mode 100644 packages/oss-console/src/components/Entities/EntityInputs.tsx create mode 100644 packages/oss-console/src/components/Entities/EntitySchedules.tsx create mode 100644 packages/oss-console/src/components/Entities/EntityVersions.tsx create mode 100644 packages/oss-console/src/components/Entities/Row.tsx create mode 100644 packages/oss-console/src/components/Entities/VersionDetails/EntityVersionDetails.tsx create mode 100644 packages/oss-console/src/components/Entities/VersionDetails/EntityVersionDetailsContainer.tsx create mode 100644 packages/oss-console/src/components/Entities/VersionDetails/EnvVarsTable.tsx create mode 100644 packages/oss-console/src/components/Entities/VersionDetails/VersionDetailsLink.tsx rename packages/{console => oss-console}/src/components/Entities/VersionDetails/constants.ts (89%) rename packages/{console => oss-console}/src/components/Entities/constants.ts (84%) create mode 100644 packages/oss-console/src/components/Entities/generators.ts rename packages/{console => oss-console}/src/components/Entities/strings.ts (83%) create mode 100644 packages/oss-console/src/components/Entities/test/EntityDetails.test.tsx create mode 100644 packages/oss-console/src/components/Entities/test/EntityVersionDetails.test.tsx create mode 100644 packages/oss-console/src/components/Entities/test/TaskVersionDetailsLink.test.tsx create mode 100644 packages/oss-console/src/components/Errors/DataError.tsx create mode 100644 packages/oss-console/src/components/Errors/DownForMaintenance.tsx create mode 100644 packages/oss-console/src/components/Errors/PrettyError.tsx rename packages/{console => oss-console}/src/components/Errors/__stories__/DataError.stories.tsx (83%) create mode 100644 packages/oss-console/src/components/Errors/test/DataError.test.tsx create mode 100644 packages/oss-console/src/components/Executions/CacheStatus.tsx rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/DetailsPanelContext.tsx (62%) rename packages/{console/src/components/Executions/ExecutionDetails/ExecutionDetails.tsx => oss-console/src/components/Executions/ExecutionDetails/ExecutionContainer.tsx} (51%) create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/FlyteDeckButton.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/RerunButton.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/ResumeButton.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/index.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx (62%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/ExecutionMetadataExtra.tsx (61%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/ExecutionNodeDeck.tsx (51%) create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionNodeURL.tsx rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/ExecutionNodeViews.tsx (100%) create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionTab.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionTabView.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/NodeExecutionDetailsPanelContent.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/NodeExecutionInputs.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/NodeExecutionOutputs.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/index.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/test/index.test.tsx rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/RelaunchExecutionForm.tsx (74%) create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/ChartHeader.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimeline.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineChart.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineFooter.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineTable.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineTableRow.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/NodeExecutionName.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/ScaleProvider/ScaleContext.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/ScaleProvider/index.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/ScaleProvider/useScaleContext.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/TaskNamesList.tsx rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/Timeline/TimelineChart/TimelineChart.stories.tsx (82%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/Timeline/TimelineChart/TimelineChartSingleItem.stories.tsx (86%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/Timeline/TimelineChart/barOptions.ts (72%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/Timeline/TimelineChart/chartData.ts (65%) create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/Timeline/TimelineChart/index.tsx rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/Timeline/TimelineChart/utils.ts (65%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/Timeline/helpers.ts (73%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/constants.ts (93%) create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/index.tsx rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/strings.tsx (61%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/test/ExecutionDetailsAppBarContent.test.tsx (56%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/test/ExecutionMetadata.test.tsx (77%) create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/test/ExecutionNodeViews.test.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/test/ExecutionTabContent.test.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/test/NodeExecutionDetailsPanelContent.test.tsx create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/test/NodeExecutionName.test.tsx rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/test/RelaunchExecutionForm.test.tsx (87%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/test/TaskNames.test.tsx (53%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/test/TimelineChart.test.tsx (83%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/test/__mocks__/NodeExecution.mock.ts (74%) rename packages/{console/src/components/Executions/ExecutionDetails/useExecutionNodeViewsState.ts => oss-console/src/components/Executions/ExecutionDetails/useExecutionNodeViewsStatePoll.ts} (56%) rename packages/{console => oss-console}/src/components/Executions/ExecutionDetails/useRecoverExecutionState.ts (72%) create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/utils.ts create mode 100644 packages/oss-console/src/components/Executions/ExecutionDetails/withExecutionDetails.tsx rename packages/{console => oss-console}/src/components/Executions/ExecutionFilters.tsx (71%) rename packages/{console => oss-console}/src/components/Executions/ExecutionInputsOutputsModal.tsx (53%) rename packages/{console => oss-console}/src/components/Executions/ExecutionStatusBadge.tsx (64%) rename packages/{console => oss-console}/src/components/Executions/NodeExecutionCacheStatus.tsx (59%) rename packages/{console => oss-console}/src/components/Executions/Tables/EntityVersionsTable.tsx (60%) create mode 100644 packages/oss-console/src/components/Executions/Tables/ExecutionsTableHeader.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/ExpandableExecutionError.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/NodeExecutionActions/InputsOutputsButton.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/NodeExecutionActions/NodeExecutionActions.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/NodeExecutionActions/RerunButton.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/NodeExecutionActions/ResumeButton.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/NodeExecutionRow.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/NodeExecutionsTable.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/RowExpander.tsx rename packages/{console => oss-console}/src/components/Executions/Tables/SelectNodeExecutionLink.tsx (68%) rename packages/{console => oss-console}/src/components/Executions/Tables/WorkflowExecutionLink.tsx (74%) create mode 100644 packages/oss-console/src/components/Executions/Tables/WorkflowExecutionTable/WorkflowExecutionRow.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/WorkflowExecutionTable/cells.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/WorkflowExecutionTable/strings.ts create mode 100644 packages/oss-console/src/components/Executions/Tables/WorkflowExecutionTable/styles.tsx rename packages/{console => oss-console}/src/components/Executions/Tables/WorkflowExecutionTable/useWorkflowExecutionsTableColumns.tsx (72%) create mode 100644 packages/oss-console/src/components/Executions/Tables/WorkflowExecutionsTable.tsx rename packages/{console => oss-console}/src/components/Executions/Tables/WorkflowVersionRow.tsx (58%) rename packages/{console => oss-console}/src/components/Executions/Tables/__stories__/NodeExecutionsTable.stories.tsx (72%) create mode 100644 packages/oss-console/src/components/Executions/Tables/__stories__/WorkflowExecutionsTable.stories.tsx rename packages/{console => oss-console}/src/components/Executions/Tables/constants.ts (64%) create mode 100644 packages/oss-console/src/components/Executions/Tables/nodeExecutionColumns.tsx rename packages/{console => oss-console}/src/components/Executions/Tables/strings.tsx (67%) create mode 100644 packages/oss-console/src/components/Executions/Tables/styles.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/test/NodeExecutionActions.test.tsx create mode 100644 packages/oss-console/src/components/Executions/Tables/test/NodeExecutionRow.test.tsx rename packages/{console => oss-console}/src/components/Executions/Tables/test/NodeExecutionsTable.test.tsx (57%) rename packages/{console => oss-console}/src/components/Executions/Tables/test/WorkflowExecutionLink.test.tsx (79%) create mode 100644 packages/oss-console/src/components/Executions/Tables/types.ts rename packages/{console => oss-console}/src/components/Executions/Tables/useWorkflowExecutionTableState.ts (61%) rename packages/{console => oss-console}/src/components/Executions/Tables/useWorkflowVersionsTableColumns.tsx (70%) create mode 100644 packages/oss-console/src/components/Executions/Tables/utils.ts rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/MapTaskExecutionDetails.tsx (74%) rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/MapTaskExecutionListItem.tsx (56%) create mode 100644 packages/oss-console/src/components/Executions/TaskExecutionsList/TaskExecutionDetails.tsx create mode 100644 packages/oss-console/src/components/Executions/TaskExecutionsList/TaskExecutionError.tsx rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/TaskExecutionLogs.tsx (51%) create mode 100644 packages/oss-console/src/components/Executions/TaskExecutionsList/TaskExecutionLogsCard.tsx rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/TaskExecutions.mocks.ts (77%) rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/TaskExecutionsList.tsx (56%) rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/TaskExecutionsListContent.stories.tsx (86%) rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/TaskExecutionsListItem.tsx (85%) rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/constants.ts (81%) rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/test/MapTaskExecutionDetails.test.tsx (68%) rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/test/TaskExecutionDetails.test.tsx (54%) rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/test/TaskExecutionLogsCard.test.tsx (51%) create mode 100644 packages/oss-console/src/components/Executions/TaskExecutionsList/test/TaskExecutionsList.test.tsx rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/test/TaskExecutionsListItem.test.tsx (83%) rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/test/utils.spec.ts (85%) rename packages/{console => oss-console}/src/components/Executions/TaskExecutionsList/utils.ts (58%) rename packages/{console => oss-console}/src/components/Executions/TerminateExecution/TerminateExecutionButton.tsx (57%) rename packages/{console => oss-console}/src/components/Executions/TerminateExecution/TerminateExecutionForm.tsx (59%) rename packages/{console => oss-console}/src/components/Executions/TerminateExecution/useTerminateExecutionState.ts (68%) rename packages/{console => oss-console}/src/components/Executions/__stories__/ExecutionFilters.stories.tsx (78%) rename packages/{console => oss-console}/src/components/Executions/constants.ts (53%) create mode 100644 packages/oss-console/src/components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDetailsContextProvider.tsx create mode 100644 packages/oss-console/src/components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDynamicProvider.tsx create mode 100644 packages/oss-console/src/components/Executions/contextProvider/NodeExecutionDetails/WorkflowNodeExecutionsProvider.tsx create mode 100644 packages/oss-console/src/components/Executions/contextProvider/NodeExecutionDetails/createExecutionArray.tsx create mode 100644 packages/oss-console/src/components/Executions/contextProvider/NodeExecutionDetails/getTaskThroughExecution.ts create mode 100644 packages/oss-console/src/components/Executions/contextProvider/NodeExecutionDetails/types.ts create mode 100644 packages/oss-console/src/components/Executions/contextProvider/NodeExecutionDetails/utils.ts create mode 100644 packages/oss-console/src/components/Executions/contexts.ts rename packages/{console => oss-console}/src/components/Executions/filters/constants.ts (100%) rename packages/{console => oss-console}/src/components/Executions/filters/durationFilters.ts (95%) rename packages/{console => oss-console}/src/components/Executions/filters/startTimeFilters.ts (88%) rename packages/{console => oss-console}/src/components/Executions/filters/statusFilters.ts (79%) rename packages/{console => oss-console}/src/components/Executions/filters/types.ts (72%) rename packages/{console => oss-console}/src/components/Executions/filters/useExecutionArchiveState.ts (79%) rename packages/{console => oss-console}/src/components/Executions/filters/useExecutionFiltersState.ts (85%) rename packages/{console => oss-console}/src/components/Executions/filters/useFilterButtonState.ts (100%) rename packages/{console => oss-console}/src/components/Executions/filters/useMultiFilterState.ts (72%) rename packages/{console => oss-console}/src/components/Executions/filters/useOnlyMyExecutionsFilterState.ts (75%) rename packages/{console => oss-console}/src/components/Executions/filters/useSearchFilterState.ts (74%) rename packages/{console => oss-console}/src/components/Executions/filters/useSingleFilterState.ts (71%) rename packages/{console => oss-console}/src/components/Executions/strings.ts (90%) rename packages/{console => oss-console}/src/components/Executions/test/CacheStatus.test.tsx (83%) rename packages/{console => oss-console}/src/components/Executions/test/ExecutionFilters.test.tsx (77%) rename packages/{console => oss-console}/src/components/Executions/test/NodeExecutionCacheStatus.test.tsx (60%) rename packages/{console => oss-console}/src/components/Executions/test/useOnlyMyExecutionsFilterState.test.ts (75%) rename packages/{console => oss-console}/src/components/Executions/test/utils.test.ts (73%) rename packages/{console => oss-console}/src/components/Executions/types.ts (79%) rename packages/{console => oss-console}/src/components/Executions/useWorkflowExecution.ts (64%) rename packages/{console => oss-console}/src/components/Executions/utils.ts (62%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchForm.tsx (73%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormActions.tsx (69%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/BlobInput.tsx (54%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/BooleanInput.tsx (72%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/CollectionInput.tsx (77%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/CollectionList.tsx (85%) create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/LaunchFormComponents/DatetimeInput.tsx create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/LaunchFormComponents/EnumInput.tsx rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/LaunchFormAdvancedInputs.tsx (58%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/LaunchInterruptibleInput.tsx (75%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/LaunchOverwriteCacheInput.tsx (72%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/NoneInput.tsx (76%) create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/LaunchFormComponents/SearchableSelector.tsx create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/LaunchFormComponents/Selector.tsx rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/SimpleInput.tsx (96%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/StructInput.tsx (50%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/StructuredDatasetInput.tsx (55%) create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/LaunchFormComponents/StyledCard.tsx rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/TextInput.tsx (76%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/UnionInput.tsx (73%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/UnsupportedInput.tsx (75%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormComponents/getComponentForInput.tsx (100%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormDialog.tsx (66%) create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/LaunchFormHeader.tsx rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchFormInputs.tsx (57%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchRoleInput.tsx (59%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchTaskForm.tsx (84%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/LaunchWorkflowForm.tsx (81%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/MapInput.tsx (64%) create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/NoInputsNeeded.tsx rename packages/{console => oss-console}/src/components/Launch/LaunchForm/ResumeForm.tsx (70%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/ResumeSignalForm.tsx (69%) create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/UnsupportedRequiredInputsError.tsx create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/__mocks__/mockInputs.ts rename packages/{console => oss-console}/src/components/Launch/LaunchForm/__mocks__/utils.ts (88%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/__stories__/LaunchForm.stories.tsx (75%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/__stories__/MapInput.stories.tsx (95%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/__stories__/WorkflowSelector.stories.tsx (66%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/constants.ts (73%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/getInputs.ts (73%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/handlers.ts (83%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/blob.ts (79%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/boolean.ts (83%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/collection.ts (70%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/constants.ts (93%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/datetime.ts (75%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/duration.ts (77%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/float.ts (75%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/getHelperForInput.ts (100%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/inputHelpers.ts (89%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/integer.ts (69%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/map.ts (83%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/none.ts (76%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/parseJson.ts (100%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/schema.ts (83%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/string.ts (84%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/struct.ts (82%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/structuredDataSet.ts (84%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/test/inputHelpers.test.ts (82%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/test/structTestCases.ts (95%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/test/testCases.ts (84%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/test/union.test.ts (88%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/test/utils.test.ts (73%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/types.ts (76%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/union.ts (82%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputHelpers/utils.ts (68%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/inputValueCache.ts (94%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/launchMachine.ts (91%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/services.ts (75%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/strings.ts (85%) create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/styles.tsx rename packages/{console => oss-console}/src/components/Launch/LaunchForm/test/LaunchTaskForm.test.tsx (76%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/test/LaunchWorkflowForm.test.tsx (50%) create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/test/LaunchWorkflowFormInputs.test.tsx rename packages/{console => oss-console}/src/components/Launch/LaunchForm/test/ResumeSignalForm.test.tsx (65%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/test/constants.ts (68%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/test/getInputs.test.ts (71%) create mode 100644 packages/oss-console/src/components/Launch/LaunchForm/test/utils.ts rename packages/{console => oss-console}/src/components/Launch/LaunchForm/types.ts (82%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/useFormInputsState.ts (86%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/useLaunchTaskFormState.ts (87%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/useLaunchWorkflowFormState.ts (87%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/useMappedExecutionInputValues.ts (75%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/useResumeFormState.ts (71%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/useTaskSourceSelectorState.ts (84%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/useVersionSelectorOptions.ts (100%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/useWorkflowSourceSelectorState.ts (74%) rename packages/{console => oss-console}/src/components/Launch/LaunchForm/utils.ts (74%) create mode 100644 packages/oss-console/src/components/LaunchPlan/LaunchPlanCardList/LaunchPlanCardView.tsx create mode 100644 packages/oss-console/src/components/LaunchPlan/LaunchPlanCardList/LaunchPlanListCard.tsx rename packages/{console => oss-console}/src/components/LaunchPlan/LaunchPlanDetails.tsx (68%) create mode 100644 packages/oss-console/src/components/LaunchPlan/LaunchPlanList.tsx create mode 100644 packages/oss-console/src/components/LaunchPlan/LaunchPlanTable/LaunchPlanTableRow.tsx create mode 100644 packages/oss-console/src/components/LaunchPlan/LaunchPlanTable/LaunchPlanTableView.tsx create mode 100644 packages/oss-console/src/components/LaunchPlan/ResponsiveLaunchPlanList.tsx create mode 100644 packages/oss-console/src/components/LaunchPlan/SearchableLaunchPlanNameList.tsx create mode 100644 packages/oss-console/src/components/LaunchPlan/components/LaunchPlanCells.tsx create mode 100644 packages/oss-console/src/components/LaunchPlan/components/LaunchPlanLastNExecutions.tsx rename packages/{console/src/components/LaunchPlan => oss-console/src/components/LaunchPlan/components}/LaunchPlanLink.tsx (69%) create mode 100644 packages/oss-console/src/components/LaunchPlan/components/LaunchPlanNextPotentialExecution.tsx create mode 100644 packages/oss-console/src/components/LaunchPlan/components/SearchBox.tsx create mode 100644 packages/oss-console/src/components/LaunchPlan/test/LaunchPlanNextPotentialExecution.test.tsx create mode 100644 packages/oss-console/src/components/LaunchPlan/useLaunchPlanArchivedState.ts create mode 100644 packages/oss-console/src/components/LaunchPlan/useLaunchPlanInfoList.ts create mode 100644 packages/oss-console/src/components/LaunchPlan/useLaunchPlanScheduledState.ts create mode 100644 packages/oss-console/src/components/LaunchPlan/utils.ts create mode 100644 packages/oss-console/src/components/ListProjectEntities/ListProjectExecutions.tsx create mode 100644 packages/oss-console/src/components/ListProjectEntities/ListProjectLaunchPlans.tsx create mode 100644 packages/oss-console/src/components/ListProjectEntities/ListProjectTasks.tsx create mode 100644 packages/oss-console/src/components/ListProjectEntities/ListProjectWorkflows.tsx create mode 100644 packages/oss-console/src/components/ListProjectEntities/ProjectStatusBar.tsx create mode 100644 packages/oss-console/src/components/ListProjectEntities/index.tsx create mode 100644 packages/oss-console/src/components/ListProjectEntities/test/ListProjectExecutions.test.tsx create mode 100644 packages/oss-console/src/components/ListProjectEntities/test/ListProjectTasks.test.tsx rename packages/{console => oss-console}/src/components/Literals/DeprecatedLiteralMapViewer.tsx (79%) rename packages/{console => oss-console}/src/components/Literals/LiteralCollectionViewer.tsx (87%) rename packages/{console => oss-console}/src/components/Literals/LiteralMapViewer.tsx (82%) rename packages/{console => oss-console}/src/components/Literals/LiteralValue.tsx (82%) rename packages/{console => oss-console}/src/components/Literals/PrintList.tsx (83%) rename packages/{console => oss-console}/src/components/Literals/PrintValue.tsx (90%) rename packages/{console => oss-console}/src/components/Literals/Scalar/BinaryValue.tsx (90%) rename packages/{console => oss-console}/src/components/Literals/Scalar/BlobValue.tsx (78%) rename packages/{console => oss-console}/src/components/Literals/Scalar/ErrorValue.tsx (90%) rename packages/{console => oss-console}/src/components/Literals/Scalar/NoneTypeValue.tsx (100%) rename packages/{console => oss-console}/src/components/Literals/Scalar/PrimitiveValue.tsx (69%) rename packages/{console => oss-console}/src/components/Literals/Scalar/ProtobufStructValue.tsx (90%) rename packages/{console => oss-console}/src/components/Literals/Scalar/ScalarValue.tsx (96%) rename packages/{console => oss-console}/src/components/Literals/Scalar/SchemaValue.tsx (89%) rename packages/{console => oss-console}/src/components/Literals/Scalar/test/PrimitiveValue.test.tsx (84%) rename packages/{console => oss-console}/src/components/Literals/Scalar/test/ProtobufStructValue.test.tsx (90%) rename packages/{console => oss-console}/src/components/Literals/UnsupportedType.tsx (93%) rename packages/{console => oss-console}/src/components/Literals/ValueLabel.tsx (100%) rename packages/{console => oss-console}/src/components/Literals/__stories__/CardDecorator.tsx (63%) rename packages/{console => oss-console}/src/components/Literals/__stories__/Collection.stories.tsx (89%) rename packages/{console => oss-console}/src/components/Literals/__stories__/Map.stories.tsx (92%) rename packages/{console => oss-console}/src/components/Literals/__stories__/ProtobufStruct.stories.tsx (85%) rename packages/{console => oss-console}/src/components/Literals/__stories__/Scalar.stories.tsx (87%) rename packages/{console => oss-console}/src/components/Literals/__stories__/StructuredDataSet.stories.tsx (74%) rename packages/{console => oss-console}/src/components/Literals/__stories__/binaryValues.ts (67%) rename packages/{console => oss-console}/src/components/Literals/__stories__/blobValues.ts (91%) rename packages/{console => oss-console}/src/components/Literals/__stories__/errorValues.ts (71%) rename packages/{console => oss-console}/src/components/Literals/__stories__/helpers/typeGenerators.ts (65%) rename packages/{console => oss-console}/src/components/Literals/__stories__/literalValues.ts (91%) rename packages/{console => oss-console}/src/components/Literals/__stories__/primitiveValues.ts (84%) rename packages/{console => oss-console}/src/components/Literals/__stories__/protobufValues.ts (88%) rename packages/{console => oss-console}/src/components/Literals/__stories__/scalarValues.ts (78%) rename packages/{console => oss-console}/src/components/Literals/__stories__/schemaValues.ts (90%) rename packages/{console => oss-console}/src/components/Literals/constants.ts (100%) rename packages/{console => oss-console}/src/components/Literals/helpers.ts (81%) create mode 100644 packages/oss-console/src/components/Literals/styles.tsx rename packages/{console => oss-console}/src/components/Literals/test/LiteralMapViewer.test.tsx (61%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/genCollectionTestcase.mock.ts (79%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/genMapTestCase.mock.ts (80%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/genScalarBinaryTestCase.mock.ts (89%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/genScalarBlobCases.mock.ts (59%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/genScalarErrorCase.mock.ts (93%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/genScalarGenericCase.mock.ts (92%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/genScalarNoneCase.mock.ts (81%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/genScalarPrimitiveCases.mock.ts (96%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/genScalarSchemaCase.mock.ts (92%) create mode 100644 packages/oss-console/src/components/Literals/test/helpers/genScalarStructuredDsCase.mock.ts rename packages/{console => oss-console}/src/components/Literals/test/helpers/index.ts (100%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/literalHelpers.ts (83%) rename packages/{console => oss-console}/src/components/Literals/test/helpers/mock_simpleTypes.ts (82%) rename packages/{console => oss-console}/src/components/Literals/test/literal.helpers.test.ts (82%) rename packages/{console => oss-console}/src/components/Literals/test/types.d.ts (100%) create mode 100644 packages/oss-console/src/components/Navigation/NavBar.tsx create mode 100644 packages/oss-console/src/components/Navigation/SideNavigation.tsx rename packages/{console => oss-console}/src/components/Navigation/__stories__/Navbar.stories.tsx (82%) rename packages/{console => oss-console}/src/components/Navigation/__stories__/ProjectSelector.stories.tsx (70%) rename packages/{console => oss-console}/src/components/Navigation/__stories__/SideNavigation.stories.tsx (78%) create mode 100644 packages/oss-console/src/components/Navigation/utils.ts create mode 100644 packages/oss-console/src/components/Notifications/SystemStatusBanner.tsx rename packages/{console => oss-console}/src/components/Notifications/__stories__/SystemStatusBanner.stories.tsx (91%) rename packages/{console => oss-console}/src/components/Notifications/test/SystemStatusBanner.test.tsx (56%) rename packages/{console => oss-console}/src/components/Notifications/useSystemStatus.ts (52%) create mode 100644 packages/oss-console/src/components/SelectProject/ProjectList.tsx rename packages/{console => oss-console}/src/components/SelectProject/constants.ts (100%) create mode 100644 packages/oss-console/src/components/SelectProject/index.tsx create mode 100644 packages/oss-console/src/components/Tables/PaginatedDataList.tsx rename packages/{console => oss-console}/src/components/Tables/filters/FilterPopoverButton.tsx (56%) create mode 100644 packages/oss-console/src/components/Task/SearchableTaskNameList.tsx create mode 100644 packages/oss-console/src/components/Task/SimpleTaskInterface.tsx rename packages/{console => oss-console}/src/components/Task/__stories__/SearchableTaskNameList.stories.tsx (78%) rename packages/{console/src/components/Task/TaskDetails.tsx => oss-console/src/components/Task/index.tsx} (61%) create mode 100644 packages/oss-console/src/components/Task/test/SimpleTaskInterface.test.tsx create mode 100644 packages/oss-console/src/components/Task/useLatestTask.ts rename packages/{console => oss-console}/src/components/Task/useTaskShowArchivedState.ts (83%) create mode 100644 packages/oss-console/src/components/Workflow/SearchableWorkflowNameList.tsx create mode 100644 packages/oss-console/src/components/Workflow/StaticGraphContainer.tsx rename packages/{console => oss-console}/src/components/Workflow/WorkflowDetails.tsx (77%) rename packages/{console => oss-console}/src/components/Workflow/__stories__/SearchableWorkflowNameList.stories.tsx (75%) rename packages/{console => oss-console}/src/components/Workflow/filters/useWorkflowShowArchivedState.ts (83%) create mode 100644 packages/oss-console/src/components/Workflow/types.ts create mode 100644 packages/oss-console/src/components/Workflow/utils.ts create mode 100644 packages/oss-console/src/components/WorkflowGraph/WorkflowGraph.tsx rename packages/{console => oss-console}/src/components/WorkflowGraph/__stories__/WorkflowGraph.stories.tsx (74%) rename packages/{console => oss-console}/src/components/WorkflowGraph/__stories__/rich.json (99%) rename packages/{console => oss-console}/src/components/WorkflowGraph/strings.ts (60%) rename packages/{console => oss-console}/src/components/WorkflowGraph/test/WorkflowGraph.test.tsx (77%) rename packages/{console => oss-console}/src/components/WorkflowGraph/test/nodeExecutionsById.mock.ts (100%) rename packages/{console => oss-console}/src/components/WorkflowGraph/test/utils.test.ts (91%) rename packages/{console => oss-console}/src/components/WorkflowGraph/test/workflow.mock.ts (98%) rename packages/{console => oss-console}/src/components/WorkflowGraph/transformerWorkflowToDag.tsx (56%) rename packages/{console => oss-console}/src/components/WorkflowGraph/utils.ts (53%) create mode 100644 packages/oss-console/src/components/common/BarChart.tsx create mode 100644 packages/oss-console/src/components/common/ClosableDialogTitle.tsx rename packages/{console => oss-console}/src/components/common/ContentContainer.tsx (53%) create mode 100644 packages/oss-console/src/components/common/DataTable.tsx create mode 100644 packages/oss-console/src/components/common/DetailsGroup.tsx create mode 100644 packages/oss-console/src/components/common/DetailsPanel.tsx create mode 100644 packages/oss-console/src/components/common/DomainSettingsSection.tsx rename packages/{console => oss-console}/src/components/common/DropDownWindowButton.tsx (79%) rename packages/{console => oss-console}/src/components/common/Empty.tsx (100%) create mode 100644 packages/oss-console/src/components/common/EntityCardError.tsx create mode 100644 packages/oss-console/src/components/common/ErrorBoundary.tsx create mode 100644 packages/oss-console/src/components/common/ExecutionsBarChartSection.tsx rename packages/{console => oss-console}/src/components/common/ExpandableContentLink.tsx (91%) create mode 100644 packages/oss-console/src/components/common/ExpandableMonospaceText.tsx create mode 100644 packages/oss-console/src/components/common/FilterableNamedEntityList.tsx rename packages/{console => oss-console}/src/components/common/LinkifiedText.tsx (90%) rename packages/{console => oss-console}/src/components/common/LocalStoreDefaults.ts (70%) rename packages/{console => oss-console}/src/components/common/MapTaskExecutionsList/MapTaskStatusInfo.stories.tsx (78%) create mode 100644 packages/oss-console/src/components/common/MapTaskExecutionsList/MapTaskStatusInfo.tsx create mode 100644 packages/oss-console/src/components/common/MapTaskExecutionsList/TaskNameList.tsx rename packages/{console => oss-console}/src/components/common/MapTaskExecutionsList/test/MapTaskStatusInfo.test.tsx (55%) create mode 100644 packages/oss-console/src/components/common/MapTaskExecutionsList/test/TaskNameList.test.tsx rename packages/{console => oss-console}/src/components/common/MoreOptionsMenu.tsx (55%) rename packages/{console => oss-console}/src/components/common/MultiSelectForm.tsx (73%) create mode 100644 packages/oss-console/src/components/common/NewTargetLink.tsx rename packages/{console => oss-console}/src/components/common/NonIdealState.tsx (52%) create mode 100644 packages/oss-console/src/components/common/PanelSection/index.tsx rename packages/{console => oss-console}/src/components/common/PublishedWithChanges.tsx (86%) create mode 100644 packages/oss-console/src/components/common/ReactJsonView.tsx create mode 100644 packages/oss-console/src/components/common/ScrollableMonospaceText.tsx create mode 100644 packages/oss-console/src/components/common/SearchInputForm.tsx create mode 100644 packages/oss-console/src/components/common/SearchableList.tsx create mode 100644 packages/oss-console/src/components/common/SearchableNamedEntityList.tsx rename packages/{console => oss-console}/src/components/common/SingleSelectForm.tsx (53%) create mode 100644 packages/oss-console/src/components/common/TopLevelLayout/TopLevelLayout.tsx rename packages/{console/src/components/Navigation => oss-console/src/components/common/TopLevelLayout}/TopLevelLayoutState.tsx (77%) rename packages/{console => oss-console}/src/components/common/WaitForData.tsx (87%) rename packages/{console => oss-console}/src/components/common/WaitForQuery.tsx (91%) rename packages/{console => oss-console}/src/components/common/__stories__/BarChart.stories.tsx (67%) rename packages/{console => oss-console}/src/components/common/__stories__/Decorators.tsx (100%) rename packages/{console => oss-console}/src/components/common/__stories__/ErrorBoundary.stories.tsx (75%) rename packages/{console => oss-console}/src/components/common/__stories__/ExpandableContentLink.stories.tsx (83%) rename packages/{console => oss-console}/src/components/common/__stories__/ExpandableMonospaceText.stories.tsx (57%) rename packages/{console => oss-console}/src/components/common/__stories__/NonIdealState.stories.tsx (89%) rename packages/{console => oss-console}/src/components/common/__stories__/Typography.stories.tsx (53%) create mode 100644 packages/oss-console/src/components/common/apiResponseUtils.ts rename packages/{console => oss-console}/src/components/common/constants.ts (54%) rename packages/{console => oss-console}/src/components/common/strings.ts (85%) create mode 100644 packages/oss-console/src/components/common/styles.ts rename packages/{console => oss-console}/src/components/common/test/DataTable.test.tsx (65%) create mode 100644 packages/oss-console/src/components/common/test/DomainSettingsSection.test.tsx rename packages/{console => oss-console}/src/components/common/test/MoreOptionsMenu.test.tsx (96%) rename packages/{console => oss-console}/src/components/common/test/NewTargetLink.spec.tsx (81%) rename packages/{console => oss-console}/src/components/common/types.ts (69%) rename packages/{console => oss-console}/src/components/common/useLinkifiedChunks.ts (70%) create mode 100644 packages/oss-console/src/components/common/useSearchableListState.ts create mode 100644 packages/oss-console/src/components/common/utils.ts rename packages/{console => oss-console}/src/components/common/withRouteParams.tsx (89%) rename packages/{console => oss-console}/src/components/data/QueryAuthorizationObserver.tsx (87%) rename packages/{console => oss-console}/src/components/data/__mocks__/apiContext.ts (85%) rename packages/{console => oss-console}/src/components/data/apiContext.ts (67%) rename packages/{console => oss-console}/src/components/data/queryCache.ts (60%) rename packages/{console => oss-console}/src/components/data/queryUtils.ts (95%) rename packages/{console => oss-console}/src/components/data/test/queryUtils.test.ts (100%) rename packages/{console => oss-console}/src/components/data/types.ts (58%) rename packages/{console => oss-console}/src/components/data/utils.ts (86%) create mode 100644 packages/oss-console/src/components/flytegraph/ReactFlow/BreadCrumb.tsx rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/NodeStatusLegend.tsx (91%) rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/PausedTasksComponent.tsx (50%) create mode 100644 packages/oss-console/src/components/flytegraph/ReactFlow/ReactFlowBreadCrumbProvider.tsx rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/ReactFlowGraphComponent.tsx (57%) create mode 100644 packages/oss-console/src/components/flytegraph/ReactFlow/ReactFlowStyled.tsx rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/ReactFlowWrapper.tsx (73%) rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/commonStyles.ts (97%) rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/customNodeComponents.tsx (50%) rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/strings.ts (66%) rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/test/NodeStatusLegend.test.tsx (92%) rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/test/PausedTasksComponent.test.tsx (60%) create mode 100644 packages/oss-console/src/components/flytegraph/ReactFlow/test/utils.test.ts rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/transformDAGToReactFlowV2.tsx (69%) rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/types.ts (68%) rename packages/{console => oss-console}/src/components/flytegraph/ReactFlow/utils.tsx (52%) rename packages/{console => oss-console}/src/components/flytegraph/__stories__/CustomNodes.stories.tsx (88%) rename packages/{console => oss-console}/src/components/flytegraph/__stories__/batchTasks.json (100%) rename packages/{console => oss-console}/src/components/flytegraph/__stories__/largeGraph.json (100%) rename packages/{console => oss-console}/src/components/flytegraph/__stories__/rich.json (99%) rename packages/{console => oss-console}/src/components/flytegraph/__stories__/simple.json (100%) create mode 100644 packages/oss-console/src/components/flytegraph/layoutUtils.ts rename packages/{console => oss-console}/src/components/flytegraph/types.ts (92%) rename packages/{console => oss-console}/src/components/hooks/Entity/constants.ts (64%) rename packages/{console => oss-console}/src/components/hooks/Entity/useEntityVersions.ts (65%) rename packages/{console => oss-console}/src/components/hooks/__mocks__/fetchableData.ts (62%) rename packages/{console => oss-console}/src/components/hooks/fetchMachine.ts (94%) rename packages/{console => oss-console}/src/components/hooks/test/useDebouncedValue.test.tsx (100%) rename packages/{console => oss-console}/src/components/hooks/test/useFetchableData.test.tsx (87%) rename packages/{console => oss-console}/src/components/hooks/test/useKeyListener.test.tsx (100%) rename packages/{console => oss-console}/src/components/hooks/test/usePagination.test.tsx (69%) create mode 100644 packages/oss-console/src/components/hooks/test/useQueryState.test.tsx rename packages/{console => oss-console}/src/components/hooks/test/utils.test.ts (89%) rename packages/{console => oss-console}/src/components/hooks/types.ts (64%) rename packages/{console => oss-console}/src/components/hooks/useChartState.ts (94%) rename packages/{console => oss-console}/src/components/hooks/useConditionalQuery.ts (84%) rename packages/{console => oss-console}/src/components/hooks/useDataProxy.ts (59%) rename packages/{console => oss-console}/src/components/hooks/useDebouncedValue.ts (100%) create mode 100644 packages/oss-console/src/components/hooks/useDescription.ts rename packages/{console => oss-console}/src/components/hooks/useFetchableData.ts (76%) rename packages/{console => oss-console}/src/components/hooks/useKeyListener.ts (80%) create mode 100644 packages/oss-console/src/components/hooks/useLaunchPlans.ts create mode 100644 packages/oss-console/src/components/hooks/useNodeExecutionChildrenQuery.ts create mode 100644 packages/oss-console/src/components/hooks/useNodeExecutionDataQuery.ts rename packages/{console => oss-console}/src/components/hooks/useOnlyMineSelectedValue.ts (84%) rename packages/{console => oss-console}/src/components/hooks/usePagination.ts (80%) create mode 100644 packages/oss-console/src/components/hooks/useProjects.ts create mode 100644 packages/oss-console/src/components/hooks/useQueryState.ts create mode 100644 packages/oss-console/src/components/hooks/useTabState.ts rename packages/{console => oss-console}/src/components/hooks/useUserProfile.ts (68%) create mode 100644 packages/oss-console/src/components/hooks/useWorkflowExecutions.ts create mode 100644 packages/oss-console/src/components/hooks/useWorkflowNodeExecutionTaskExecutionsQuery.ts rename packages/{console => oss-console}/src/components/hooks/useWorkflowSchedules.ts (74%) rename packages/{console => oss-console}/src/components/hooks/utils.ts (51%) create mode 100644 packages/oss-console/src/components/utils/GlobalStyles.tsx create mode 100644 packages/oss-console/src/components/utils/classes.ts rename packages/{console => oss-console}/src/components/utils/index.ts (100%) create mode 100644 packages/oss-console/src/index.ts rename packages/{console => oss-console}/src/mocks/createAdminServer.ts (73%) rename packages/{console => oss-console}/src/mocks/data/constants.ts (81%) rename packages/{console => oss-console}/src/mocks/data/fixtures/basicPythonWorkflow.ts (84%) rename packages/{console => oss-console}/src/mocks/data/fixtures/dynamicExternalSubworkflow.ts (77%) create mode 100644 packages/oss-console/src/mocks/data/fixtures/dynamicPythonWorkflow.ts rename packages/{console => oss-console}/src/mocks/data/fixtures/oneFailedTaskWorkflow.ts (80%) rename packages/{console => oss-console}/src/mocks/data/fixtures/types.ts (81%) rename packages/{console => oss-console}/src/mocks/data/generators.ts (87%) rename packages/{console => oss-console}/src/mocks/data/insertFixture.ts (68%) create mode 100644 packages/oss-console/src/mocks/data/projects.ts rename packages/{console => oss-console}/src/mocks/data/utils.ts (60%) rename packages/{console => oss-console}/src/mocks/errors.ts (74%) rename packages/{console => oss-console}/src/mocks/server.ts (65%) rename packages/{console => oss-console}/src/mocks/utils.ts (82%) rename packages/{console => oss-console}/src/models/AdminEntity/AdminApiQuery.ts (93%) rename packages/{console => oss-console}/src/models/AdminEntity/AdminEntity.ts (71%) rename packages/{console => oss-console}/src/models/AdminEntity/constants.ts (77%) rename packages/{console => oss-console}/src/models/AdminEntity/test/AdminApiQuery.spec.ts (92%) rename packages/{console => oss-console}/src/models/AdminEntity/test/utils.spec.ts (76%) rename packages/{console => oss-console}/src/models/AdminEntity/utils.ts (69%) rename packages/{console => oss-console}/src/models/Common/api.ts (79%) rename packages/{console => oss-console}/src/models/Common/constants.ts (100%) rename packages/{console => oss-console}/src/models/Common/types.ts (84%) rename packages/{console => oss-console}/src/models/Common/utils.ts (66%) rename packages/{console => oss-console}/src/models/DescriptionEntity/api.ts (64%) rename packages/{console => oss-console}/src/models/DescriptionEntity/types.ts (87%) rename packages/{console => oss-console}/src/models/DescriptionEntity/utils.ts (64%) rename packages/{console => oss-console}/src/models/Execution/__mocks__/constants.ts (100%) rename packages/{console => oss-console}/src/models/Execution/__mocks__/mockNodeExecutionsData.ts (83%) rename packages/{console => oss-console}/src/models/Execution/__mocks__/mockTaskExecutionsData.ts (84%) rename packages/{console => oss-console}/src/models/Execution/__mocks__/mockWorkflowExecutionsData.ts (83%) rename packages/{console => oss-console}/src/models/Execution/__mocks__/sampleExecutionError.ts (100%) rename packages/{console => oss-console}/src/models/Execution/api.ts (77%) rename packages/{console => oss-console}/src/models/Execution/constants.ts (77%) rename packages/{console => oss-console}/src/models/Execution/enums.ts (85%) rename packages/{console => oss-console}/src/models/Execution/types.ts (73%) rename packages/{console => oss-console}/src/models/Execution/utils.ts (77%) rename packages/{console => oss-console}/src/models/Graph/types.ts (79%) create mode 100644 packages/oss-console/src/models/Launch/api.ts create mode 100644 packages/oss-console/src/models/Launch/constants.ts rename packages/{console => oss-console}/src/models/Launch/types.ts (88%) rename packages/{console => oss-console}/src/models/Launch/utils.ts (66%) rename packages/{console => oss-console}/src/models/Node/__mocks__/mockNodeData.ts (53%) rename packages/{console => oss-console}/src/models/Node/constants.ts (57%) rename packages/{console => oss-console}/src/models/Node/types.ts (93%) create mode 100644 packages/oss-console/src/models/Node/utils.ts rename packages/{console => oss-console}/src/models/Project/api.ts (62%) rename packages/{console => oss-console}/src/models/Project/types.ts (86%) create mode 100644 packages/oss-console/src/models/Project/utils.ts rename packages/{console => oss-console}/src/models/Task/__mocks__/mockTaskData.ts (100%) rename packages/{console => oss-console}/src/models/Task/api.ts (68%) rename packages/{console => oss-console}/src/models/Task/constants.ts (100%) rename packages/{console => oss-console}/src/models/Task/task.test.ts (77%) rename packages/{console => oss-console}/src/models/Task/types.ts (86%) rename packages/{console => oss-console}/src/models/Task/utils.ts (63%) rename packages/{console => oss-console}/src/models/Workflow/api.ts (67%) rename packages/{console => oss-console}/src/models/Workflow/constants.ts (100%) rename packages/{console => oss-console}/src/models/Workflow/types.ts (80%) create mode 100644 packages/oss-console/src/models/Workflow/utils.ts rename packages/{console => oss-console}/src/models/__mocks__/executionsData.ts (85%) create mode 100644 packages/oss-console/src/models/__mocks__/graphWorkflowData.ts rename packages/{console => oss-console}/src/models/__mocks__/launchPlanData.ts (77%) create mode 100644 packages/oss-console/src/models/__mocks__/projectData.ts rename packages/{console => oss-console}/src/models/__mocks__/sampleTaskNames.ts (90%) rename packages/{console => oss-console}/src/models/__mocks__/sampleWorkflowNames.ts (73%) rename packages/{console => oss-console}/src/models/__mocks__/simpleTaskClosure.json (100%) create mode 100644 packages/oss-console/src/models/__mocks__/simpleWorkflow.mock.ts rename packages/{console => oss-console}/src/models/__mocks__/simpleWorkflowClosure.json (100%) rename packages/{console => oss-console}/src/models/__mocks__/taskData.ts (56%) rename packages/{console => oss-console}/src/models/__mocks__/workflowData.ts (50%) rename packages/{console => oss-console}/src/models/enums.ts (75%) create mode 100644 packages/oss-console/src/queries/descriptionEntitiesQuery.ts create mode 100644 packages/oss-console/src/queries/executionMetricsQuery.ts create mode 100644 packages/oss-console/src/queries/launchPlanQueries.ts create mode 100644 packages/oss-console/src/queries/nodeExecutionQueries.ts create mode 100644 packages/oss-console/src/queries/projectQueries.ts create mode 100644 packages/oss-console/src/queries/taskExecutionQueries.ts create mode 100644 packages/oss-console/src/queries/taskQueries.ts create mode 100644 packages/oss-console/src/queries/workflowQueries.ts create mode 100644 packages/oss-console/src/routes/AnimateRoute.tsx create mode 100644 packages/oss-console/src/routes/constants.ts create mode 100644 packages/oss-console/src/routes/history.ts create mode 100644 packages/oss-console/src/routes/routes.ts create mode 100644 packages/oss-console/src/routes/tests/useDomainPathUpgrade.test.tsx rename packages/{console => oss-console}/src/routes/types.ts (100%) create mode 100644 packages/oss-console/src/routes/useDomainPathUpgrade.tsx create mode 100644 packages/oss-console/src/test/modelUtils.ts create mode 100644 packages/oss-console/src/test/renderUtils.tsx create mode 100644 packages/oss-console/src/test/setupTests.ts rename packages/{console => oss-console}/src/test/utils.ts (63%) rename packages/{console => oss-console}/src/tsd/assets.d.ts (100%) rename packages/{console => oss-console}/src/tsd/contrast.d.ts (100%) rename packages/{console => oss-console}/src/tsd/d3-dag.d.ts (100%) rename {website => packages/oss-console}/src/tsd/globals.d.ts (100%) rename packages/{console => oss-console}/src/tsd/index.d.ts (100%) create mode 100644 packages/oss-console/src/tsd/window.d.ts create mode 100644 packages/oss-console/tsconfig.build.json create mode 100644 packages/oss-console/tsconfig.json create mode 100644 packages/primitives/jest.config.js create mode 100644 packages/primitives/package.json rename packages/{console/src/components/common/__stories__ => primitives/src/CircularProgressButton}/ButtonCircularProgress.stories.tsx (66%) create mode 100644 packages/primitives/src/CircularProgressButton/index.tsx create mode 100644 packages/primitives/src/CopyableWrapper/index.tsx create mode 100644 packages/primitives/src/CustomNavBar/Actions.tsx create mode 100644 packages/primitives/src/CustomNavBar/HomeButtons.tsx create mode 100644 packages/primitives/src/CustomNavBar/NavLink.tsx create mode 100644 packages/primitives/src/CustomNavBar/NavLinkItem.tsx create mode 100644 packages/primitives/src/CustomNavBar/NavigationItems.tsx create mode 100644 packages/primitives/src/CustomNavBar/UserProfile.tsx create mode 100644 packages/primitives/src/CustomNavBar/index.tsx create mode 100644 packages/primitives/src/CustomNavBar/login.test.tsx create mode 100644 packages/primitives/src/CustomNavBar/strings.ts create mode 100644 packages/primitives/src/HoverTooltip/index.tsx create mode 100644 packages/primitives/src/InfoTooltip/index.tsx create mode 100644 packages/primitives/src/Loading/index.tsx rename packages/{console/src/components/common/__stories__ => primitives/src/LoadingSpinner}/LoadingSpinner.stories.tsx (84%) create mode 100644 packages/primitives/src/LoadingSpinner/LoadingSpinner.test.tsx create mode 100644 packages/primitives/src/LoadingSpinner/index.tsx create mode 100644 packages/primitives/src/MetricMeter/constant.ts create mode 100644 packages/primitives/src/NoResults/index.tsx create mode 100644 packages/primitives/src/NoResults/strings.ts create mode 100644 packages/primitives/src/PageMeta/index.tsx create mode 100644 packages/primitives/src/SessionManagent/LoginPanel.tsx create mode 100644 packages/primitives/src/SessionManagent/index.ts create mode 100644 packages/primitives/src/Shimmer/index.tsx create mode 100644 packages/primitives/src/SimpleCache/SimpleCache.ts create mode 100644 packages/primitives/src/SimpleCache/SimpleCacheCallbackManager.ts create mode 100644 packages/primitives/src/SimpleCache/index.ts create mode 100644 packages/primitives/src/SimpleCache/tests/simpleCache.test.ts create mode 100644 packages/primitives/src/SimpleCache/tests/simpleCacheCallbackmanager.test.ts create mode 100644 packages/primitives/src/TableLoadMoreCell/index.tsx create mode 100644 packages/primitives/src/TableLoadingCell/index.tsx create mode 100644 packages/primitives/src/TableNoRowsCell/index.tsx rename packages/{ui-atoms/src/Icons/FlyteLogo/index.tsx => primitives/src/assets/icons/FlyteLogo.tsx} (70%) create mode 100644 packages/primitives/src/common/LoadingSpinner.tsx create mode 100644 packages/primitives/src/common/index.ts create mode 100644 packages/primitives/src/hooks/DataProvider/DataProvider.tsx create mode 100644 packages/primitives/src/hooks/DataProvider/apis/admin.ts create mode 100644 packages/primitives/src/hooks/DataProvider/apis/logs-utils.ts create mode 100644 packages/primitives/src/hooks/DataProvider/apis/logs.ts create mode 100644 packages/primitives/src/hooks/DataProvider/store.ts create mode 100644 packages/primitives/src/hooks/DataProvider/utils.ts create mode 100644 packages/primitives/src/hooks/FeatureFlagsProvider/FeatureFlagContext.tsx create mode 100644 packages/primitives/src/hooks/FeatureFlagsProvider/FeatureFlagProvider.tsx create mode 100644 packages/primitives/src/hooks/FeatureFlagsProvider/defaultFlags.ts create mode 100644 packages/primitives/src/hooks/FeatureFlagsProvider/useFeatureFlags.ts create mode 100644 packages/primitives/src/hooks/IdentityProvider/IdentityContext.tsx create mode 100644 packages/primitives/src/hooks/IdentityProvider/IdentityProvider.tsx create mode 100644 packages/primitives/src/hooks/IdentityProvider/Restricted.tsx create mode 100644 packages/primitives/src/hooks/IdentityProvider/useUserIdentity.ts rename packages/{console/src/components => primitives/src}/hooks/useDelayedValue.ts (82%) create mode 100644 packages/primitives/src/types/cloudTypes.ts create mode 100644 packages/primitives/src/types/flyteConstants.ts create mode 100644 packages/primitives/src/types/flyteTypes.ts create mode 100644 packages/primitives/src/types/rest.ts create mode 100644 packages/primitives/src/utils/api.ts create mode 100644 packages/primitives/src/utils/dateUtils.ts create mode 100644 packages/primitives/src/utils/endpoints.ts create mode 100644 packages/primitives/src/utils/environment.ts create mode 100644 packages/primitives/src/utils/format.test.tsx create mode 100644 packages/primitives/src/utils/format.ts create mode 100644 packages/primitives/src/utils/navUtils.tsx rename packages/{console => primitives}/tsconfig.build.json (70%) create mode 100644 packages/primitives/tsconfig.json create mode 100644 packages/theme/jest.config.js create mode 100644 packages/theme/package.json create mode 100644 packages/theme/src/CommonStyles/CommonStyles.tsx rename packages/{console/src/components/Theme => theme/src/CommonStyles}/colorSpectrum.ts (79%) create mode 100644 packages/theme/src/CommonStyles/constants.ts create mode 100644 packages/theme/src/CommonStyles/utils.ts create mode 100644 packages/theme/src/Theme/Typography.stories.tsx create mode 100644 packages/theme/src/Theme/muiTheme.ts create mode 100644 packages/theme/src/Theme/types.ts create mode 100644 packages/theme/src/Theme/utils.ts create mode 100644 packages/theme/src/config/index.ts rename packages/{flyteidl-types => theme}/tsconfig.build.json (62%) create mode 100644 packages/theme/tsconfig.json delete mode 100644 packages/ui-atoms/LICENSE delete mode 100644 packages/ui-atoms/README.md create mode 100644 packages/ui-atoms/jest.config.js create mode 100644 packages/ui-atoms/src/ArchiveLogo/index.tsx create mode 100644 packages/ui-atoms/src/ExecutionsLogo/index.tsx create mode 100644 packages/ui-atoms/src/HomeLogo/index.tsx delete mode 100644 packages/ui-atoms/src/Icons/FlyteLogo/FlyteLogo.stories.tsx delete mode 100644 packages/ui-atoms/src/Icons/InfoIcon/index.tsx delete mode 100644 packages/ui-atoms/src/Icons/MapCacheIcon/index.tsx delete mode 100644 packages/ui-atoms/src/Icons/MuiLaunchPlanIcon/index.tsx delete mode 100644 packages/ui-atoms/src/Icons/index.tsx create mode 100644 packages/ui-atoms/src/LaunchPlansLogo/index.tsx create mode 100644 packages/ui-atoms/src/LockPerson/index.tsx create mode 100644 packages/ui-atoms/src/LogoutLogo/index.tsx create mode 100644 packages/ui-atoms/src/MapCacheIcon/index.tsx create mode 100644 packages/ui-atoms/src/NotFoundLogo/index.tsx rename packages/ui-atoms/src/{Icons => }/RerunIcon/index.tsx (91%) create mode 100644 packages/ui-atoms/src/SmallArrow/index.tsx create mode 100644 packages/ui-atoms/src/TasksLogo/index.tsx create mode 100644 packages/ui-atoms/src/WorkflowsLogo/index.tsx delete mode 100644 packages/ui-atoms/src/index.ts delete mode 100644 packages/ui-atoms/tsconfig.build.es.json delete mode 100644 packages/ui-atoms/tsconfig.test.json create mode 100644 scripts/assetsTransformer.js create mode 100644 scripts/eslint-custom-rules/eslint-custom-path.js create mode 100644 scripts/eslint-custom-rules/index.js create mode 100644 scripts/eslint-custom-rules/package.json create mode 100755 scripts/generate_ssl.sh create mode 100644 scripts/getFailedLogs.js create mode 100644 scripts/getTestTodo.js create mode 100644 scripts/jest-resolver.js create mode 100644 scripts/jest-setup.ts create mode 100644 scripts/jest.base.js create mode 100644 scripts/server.csr.cnf create mode 100644 scripts/v3.ext create mode 100644 stories-intro/Button.stories.tsx create mode 100644 stories-intro/Button.tsx create mode 100644 stories-intro/Header.stories.tsx create mode 100644 stories-intro/Header.tsx create mode 100644 stories-intro/Introduction.stories.mdx create mode 100644 stories-intro/Page.stories.tsx create mode 100644 stories-intro/Page.tsx create mode 100644 stories-intro/assets/code-brackets.svg create mode 100644 stories-intro/assets/colors.svg create mode 100644 stories-intro/assets/comments.svg create mode 100644 stories-intro/assets/direction.svg create mode 100644 stories-intro/assets/flow.svg create mode 100644 stories-intro/assets/plugin.svg create mode 100644 stories-intro/assets/repo.svg create mode 100644 stories-intro/assets/stackalt.svg create mode 100644 stories-intro/button.css create mode 100644 stories-intro/header.css create mode 100644 stories-intro/page.css create mode 100644 types.d.ts create mode 100644 website/console/env/index.ts create mode 100644 website/console/jest.config.js create mode 100644 website/console/package.json create mode 100644 website/console/src/assets/index.html rename website/{ => console}/src/assets/public/apple-touch-icon.png (100%) rename website/{src/assets => console/src/assets/public}/favicon.ico (100%) rename website/{src/assets => console/src/assets/public}/favicon.svg (100%) rename website/{ => console}/src/assets/public/icon-192.png (100%) rename website/{ => console}/src/assets/public/icon-512.png (100%) create mode 100644 website/console/src/assets/public/manifest.webmanifest create mode 100644 website/console/src/client/app.tsx create mode 100644 website/console/src/client/index.tsx create mode 100644 website/console/src/server/index.ts create mode 100644 website/console/src/server/routes/mainRouter.ts create mode 100644 website/console/tsconfig.build.json create mode 100644 website/console/tsconfig.json create mode 100644 website/console/webpack.config.ts create mode 100644 website/console/webpack.dev.config.ts create mode 100644 website/console/webpack.prod.config.ts delete mode 100644 website/env.js delete mode 100644 website/package.json delete mode 100644 website/src/assets/index.html delete mode 100644 website/src/assets/public/manifest.webmanifest delete mode 100644 website/src/client.tsx delete mode 100644 website/src/server/index.ts delete mode 100644 website/src/server/plugins.ts delete mode 100644 website/src/server/router.ts delete mode 100644 website/src/tsd/contrast.d.ts delete mode 100644 website/src/tsd/d3-dag.d.ts delete mode 100644 website/src/tsd/window.d.ts delete mode 100644 website/tsconfig.build.json delete mode 100644 website/tsconfig.json delete mode 100644 website/webpack.config.ts delete mode 100644 website/webpack.dev.config.ts delete mode 100644 website/webpack.prod.config.ts delete mode 100644 website/webpack.utilities.ts diff --git a/.dockerignore b/.dockerignore index 70b8a75bf..2986334ca 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,12 +1,34 @@ +# Packages +bin/ +build/ +dist/ +lib/ -# * -# !package.json -# !yarn.lock -# !packages/ -# !node_modules/ -# !jes -.storybook/ -stories-intro/ -Dockerfile* -.dockerignore -README* +# yarn related +node_modules/** +.pnp.* +**/.yarn/* +!**/.yarn/plugins +!**/.yarn/releases +!**/.yarn/sdks +!**/.yarn/versions +# patches contain the patchfiles which have been generated with the `yarn patch-commit` command. +# We always want them in repository, since they are necessary to install dependencies. +!.yarn/patches + +# results of tsc build +tsconfig.tsbuildinfo + +# result of linting +.eslintcache + +#coverage +.coverage + +# misc +.DS_Store +.srl +yarn-error.log + +# generated data +certificate diff --git a/.eslintignore b/.eslintignore index 498e7b4a6..18449be1a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,11 +1,20 @@ -LICENSE -src/generated/ -.github/ -.dist/ +# ignore infrastracture +node_modules/ +bin/ +build/ dist/ lib/ -node_modules/ tsd/ -webpack.common.config.ts -webpack.dev.config.ts -webpack.prod.config.ts + +# generated files +generated/ +gen/ + +# webpack settings +webpack.* + +# Storybook md pages +stories-intro/ + +# package generator +scripts/generator diff --git a/.eslintrc.js b/.eslintrc.js index e6f6d350f..d938be883 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,15 +1,17 @@ +/** @type {import('eslint').Linter.Config} */ module.exports = { - root: true, env: { browser: true, es2021: true, jest: true, }, + root: true, globals: { // global variables, that should be assumed by eslint as defined JSX: true, RequiredNonNullable: true, Dictionary: true, + NodeJS: true, }, parser: '@typescript-eslint/parser', parserOptions: { @@ -20,101 +22,89 @@ module.exports = { sourceType: 'module', }, extends: ['plugin:react/recommended', 'airbnb', 'prettier'], - plugins: ['react', '@typescript-eslint'], + plugins: ['custom-rules', 'react', '@typescript-eslint', 'import'], settings: { 'import/resolver': { node: { extensions: ['.js', '.jsx', '.ts', '.tsx'], }, }, + 'import/core-modules': [ + '@clients/locale', + '@clients/ui-atoms', + '@clients/primitives', + '@clients/theme', + '@clients/common', + '@clients/db', + ], }, rules: { - /** - * Rules we don't want to be enabled - * "off" or 0: turn off the rule completely; "warn" or 1; "error" or 2 - */ + // "off" or 0 - turn the rule off; "warn" or 1; "error" or 2 'arrow-body-style': 'off', - 'import/extensions': 'off', - 'import/no-unresolved': 'off', - 'import/prefer-default-export': 'off', - 'react/jsx-boolean-value': 'off', - 'react/jsx-filename-extension': [2, { extensions: ['.jsx', '.tsx'] }], - 'lines-between-class-members': [ + 'consistent-return': 'off', + 'no-use-before-define': 'warn', + 'no-shadow': 'off', + 'no-nested-ternary': 'off', + 'no-unused-vars': 'off', + 'no-redeclare': 'off', + 'prefer-destructuring': 'warn', + 'prefer-promise-reject-errors': 'warn', + 'no-restricted-syntax': 'warn', + 'guard-for-in': 'warn', + 'no-param-reassign': 'warn', + 'no-unused-expressions': 'warn', + 'no-continue': 'warn', + 'no-restricted-globals': 'warn', + 'default-case': 'warn', + 'no-underscore-dangle': 'warn', + 'no-return-assign': 'warn', + 'no-throw-literal': 'warn', + + 'no-restricted-imports': [ 'error', - 'always', - { exceptAfterSingleLine: true }, + { + patterns: [ + { + group: ['@mui/styles', '@naterial/styles'], + importNames: ['makeStyles'], + message: + "MUIv5 styles are incompatible with JSS, use 'styled' pattern or 'sx' prop instead.", + }, + ], + }, ], + 'lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: true }], + // typescript specific + '@typescript-eslint/no-shadow': 'off', // disabled to let "@typescript-eslint/*" rules do it's job - 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], - 'no-redeclare': 'off', - '@typescript-eslint/no-redeclare': [ - 'warn', - { ignoreDeclarationMerge: true }, - ], // still will warn on exporting enums :( - - /** - * Up for discussion - * */ - 'react/function-component-definition': 'off', - 'react/destructuring-assignment': 'off', - - /** - * temporarily off or warn - * */ - // some setup of eslint or prettier needed - 'import/no-extraneous-dependencies': 'off', // 715 - !important - 'react/jsx-props-no-spreading': 'off', // 119 + '@typescript-eslint/no-redeclare': ['warn', { ignoreDeclarationMerge: true }], // still will warn on exporting enums :( // classic - 'no-use-before-define': 'off', // 49 - 'no-shadow': 'off', // 104 - 'no-param-reassign': 'off', // 28 - 'no-unused-expressions': 'warn', // 5 - 'prefer-destructuring': 'off', // 34 - 'no-empty-function': 'off', - 'no-useless-constructor': 'warn', // 1 - 'no-useless-computed-key': 'off', - 'no-restricted-syntax': 'off', - 'no-else-return': 'off', 'no-plusplus': 'off', - 'no-var': 'off', - 'no-continue': 'off', - 'no-unsafe-optional-chaining': 'off', - 'no-throw-literal': 'off', - 'no-lonely-if': 'off', - 'no-useless-return': 'off', - 'no-return-await': 'off', - 'no-nested-ternary': 'off', - 'no-restricted-globals': 'off', - 'no-return-assign': 'off', - 'no-await-in-loop': 'off', - 'no-undef-init': 'off', - 'no-unneeded-ternary': 'off', - 'no-underscore-dangle': 'off', - 'prefer-object-spread': 'off', - 'prefer-template': 'off', - 'default-case': 'off', - 'valid-typeof': 'off', - 'object-shorthand': 'off', - 'operator-assignment': 'off', 'array-callback-return': 'off', - 'global-require': 'off', - 'dot-notation': 'off', - 'guard-for-in': 'off', - 'one-var': 'off', - 'vars-on-top': 'off', - 'consistent-return': 'off', - 'prefer-promise-reject-errors': 'off', - 'prefer-arrow-callback': 'off', - 'func-names': 'off', - eqeqeq: 'warn', // 12 - // import - 'import/no-dynamic-require': 'warn', // 1 + 'import/extensions': 'off', + 'import/prefer-default-export': 'off', + 'import/no-extraneous-dependencies': 'off', + 'import/no-cycle': 2, + 'import/no-unresolved': 'off', + 'import/no-unused-modules': [1, { unusedExports: true }], + + // up for discussion + 'react/function-component-definition': 'off', + eqeqeq: 'warn', // 12 // react + 'react/destructuring-assignment': 'off', + 'react/jsx-props-no-spreading': 'off', + 'react/jsx-filename-extension': [ + 2, + { + extensions: ['.jsx', '.tsx'], + }, + ], 'react/button-has-type': 'off', // 5 'react/jsx-no-useless-fragment': 'off', // 15 'react/no-access-state-in-setstate': 'warn', // 2 @@ -136,32 +126,25 @@ module.exports = { 'jsx-a11y/no-noninteractive-element-interactions': 'off', // 1 'jsx-a11y/click-events-have-key-events': 'off', // 7 'jsx-a11y/no-static-element-interactions': 'off', // 6 + 'jsx-a11y/control-has-associated-label': 'warn', + + // custom-rules + 'custom-rules/enforce-path': 'error', }, overrides: [ { // overrides for test files - files: [ - '*.spec.*', - '*.test.*', - '*.stories.*', - 'src/**/test/*', - 'src/**/mocks/*', - ], + files: ['*.spec.*', '*.test.*', 'scripts/*'], rules: { - camelcase: 'off', '@typescript-eslint/no-explicit-any': 'off', 'import/no-extraneous-dependencies': 'off', - 'no-console': 'off', - - 'jsx-a11y/aria-role': 'off', - 'jsx-a11y/control-has-associated-label': 'off', }, }, { - // rules which not make sense for TS files - files: ['*.ts', '*.tsx'], + // overrides for test files + files: ['*.json'], rules: { - 'no-undef': 'off', + bracketSpacing: 2, }, }, ], diff --git a/.gitignore b/.gitignore index bc3eca068..3a73bc1b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,61 +1,11 @@ -.env -*.swp -# direnv -.envrc - -# C extensions -*.so - -# Snyk -.dccache - # Packages bin/ build/ dist/ -downloads/ -env/ lib/ -lib64/ -parts/ -sdist/ -var/ - -# Translations -*.mo - -# build packages or files that shouldn't be in repo -node_modules -bower_components -.sass-cache -.tmp -app/public/dist -app/public/styles/*.css - -# Mr Developer (mac, editor, IDEs, etc) -.mr.developer.cfg -.project -.pydevproject -.vagrant -.ropeproject -.tmp -.sass-cache -.DS_Store -.zedstate -.idea -.cache/ -venv/ -*.tsbuildinfo -*.log -**.orig -# Frontend -.awcache/ -.dist/ -npm-debug.log -jest -jest_0 -.coverage/ +# git +!.vscode/ # yarn related node_modules @@ -63,7 +13,6 @@ node_modules *.yalc yalc.lock **/.yarn/* -yarn-error.log !**/.yarn/plugins !**/.yarn/releases !**/.yarn/sdks @@ -72,6 +21,22 @@ yarn-error.log # We always want them in repository, since they are necessary to install dependencies. !.yarn/patches -# Certs +# results of tsc build +*.tsbuildinfo + +# result of linting +.eslintcache + +#coverage +.coverage +.jest-cache + +# misc +.DS_Store .srl -certificate/ +yarn-error.log +.dccache + +# generated data +certificate +.env diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100755 index cfae5319d..000000000 --- a/.husky/commit-msg +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -# exit if in a CI environment -[ -n "$CI" ] && exit 0 - -npx --no -- commitlint --edit ${1} diff --git a/.husky/pre-commit b/.husky/pre-commit index 369fd736e..744fe71af 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,7 +1,5 @@ #!/usr/bin/env sh - . "$(dirname -- "$0")/_/husky.sh" -# exit if in a CI environment [ -n "$CI" ] && exit 0 echo "Linting staged files..." diff --git a/.prettierrc.yml b/.prettierrc.yml index 9a1f44aa9..2b6ea5acb 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1,21 +1,21 @@ +tabWidth: 4 +printWidth: 100 singleQuote: true -tabWidth: 2 -printWidth: 80 trailingComma: "all" -useTabs: false -semi: true - -arrowParens: "avoid" -bracketSpacing: true -htmlWhitespaceSensitivity: "css" - overrides: + - files: ["*.js", "*.jsx", "*.ts", "*.tsx"] + options: + tabWidth: 2 + - files: ["*.json"] + options: + tabWidth: 2 + bracketSpacing: true - files: ["*.yml", "*.yaml"] options: singleQuote: false - - files: ["*.html"] - options: - tabWidth: 4 - - files: ["dockerfile"] + tabWidth: 2 + - files: ["Makefile"] options: + singleQuote: false + tabWidth: 2 useTabs: true diff --git a/.releaserc.js b/.releaserc.js index fcb261268..52da46f4a 100755 --- a/.releaserc.js +++ b/.releaserc.js @@ -39,16 +39,12 @@ function getProdConfiguration() { * ################################################################ */ function isTestRun() { - return ( - process.argv.includes('--dry-run') || process.argv.includes('--test-run') - ); + return process.argv.includes('--dry-run') || process.argv.includes('--test-run'); } function getTestConfiguration() { const localGitRepoPath = `file://${process.cwd()}/.git`; - const localBranchName = execSync('git branch --show-current') - .toString() - .trim(); + const localBranchName = execSync('git branch --show-current').toString().trim(); return { repositoryUrl: localGitRepoPath, diff --git a/.storybook/main.js b/.storybook/main.js index b0d96ae2e..e2a71e64a 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -20,10 +20,7 @@ module.exports = { // flyteidl.d.ts file. test: /\.tsx?$/, exclude: /node_modules/, - use: [ - 'babel-loader', - { loader: 'ts-loader', options: { transpileOnly: true } }, - ], + use: ['babel-loader', { loader: 'ts-loader', options: { transpileOnly: true } }], }, ]; @@ -32,14 +29,8 @@ module.exports = { '@flyteorg/console': path.resolve(__dirname, '../packages/console/src'), '@flyteorg/locale': path.resolve(__dirname, '../packages/locale/src'), '@flyteorg/ui-atoms': path.resolve(__dirname, '../packages/ui-atoms/src'), - '@flyteorg/components': path.resolve( - __dirname, - '../packages/components/src', - ), - '@flyteorg/flyte-api': path.resolve( - __dirname, - '../packages/flyte-api/src', - ), + '@flyteorg/components': path.resolve(__dirname, '../packages/components/src'), + '@flyteorg/flyte-api': path.resolve(__dirname, '../packages/flyte-api/src'), }; return config; diff --git a/.storybook/preview.js b/.storybook/preview.js index d0f0e6826..776dc9908 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -18,7 +18,7 @@ export const parameters = { }; export const decorators = [ - Story => ( + (Story) => ( diff --git a/.tool-versions b/.tool-versions index 18de0230f..ed5138baa 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ nodejs 18.1.0 -yarn 3.2.1 +yarn 3.2.1 \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index fb0c72afc..a35e88b6d 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,12 +1,30 @@ { // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp - // List of extensions which should be recommended for users of this workspace. "recommendations": [ + // Git codelens "eamodio.gitlens", + // Official TypeScript extension by Microsoft + "ms-vscode.vscode-typescript-next", + // ESLint for linting your TypeScript code "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode" + // Prettier for code formatting + "esbenp.prettier-vscode", + // Automatically finds, parses and provides code actions and code completion for all available imports + "steoates.autoimport", + // Icons for Visual Studio Code + "vscode-icons-team.vscode-icons", + // Make TypeScript errors prettier and more human-readable in VSCode + "yoavbls.pretty-ts-errors", + // HTML Linter + "vscode.html-language-features", + // Docker support + "ms-azuretools.vscode-docker", + // YAML support + "redhat.vscode-yaml", + // AI pair programmer + "GitHub.copilot" ], // List of extensions recommended by VS Code that should not be recommended for users of this workspace. "unwantedRecommendations": [] diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index abb8f9600..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "launch generator", - "type": "node", - "request": "launch", - "skipFiles": ["/**"], - "program": "${workspaceFolder}/script/generator/src/index.js", - "console": "integratedTerminal" - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json index 463fd54f2..9fe9fd0fb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,30 +2,68 @@ "explorer.autoReveal": true, "explorer.enableUndo": true, "explorer.excludeGitIgnore": false, - - "files.autoSave": "afterDelay", - "problems.autoReveal": true, - - // editor - "editor.formatOnSave": true, "editor.renderWhitespace": "all", - "editor.defaultFormatter": "esbenp.prettier-vscode", + "prettier.trailingComma": "es5", + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, - // typescript - "typescript.updateImportsOnFileMove.enabled": "always", + /** + ** Javascript general Settings ** + */ + "javascript.validate.enable": false, // Disable VS Code's built-in JavaScript validation to avoid conflicts with TypeScript + "javascript.format.enable": false, // Disable JavaScript formatting to avoid conflicts with TypeScript + "javascript.preferences.quoteStyle": "single", // Use single quotes for string literals in JavaScript files + "javascript.format.placeOpenBraceOnNewLineForControlBlocks": true, + "javascript.format.placeOpenBraceOnNewLineForFunctions": true, - "[javascript][javascriptreact][typescript][typescriptreact][json]": { - "editor.detectIndentation": false, - "editor.tabSize": 2 + /** + ** TypeScript general Settings ** + */ + "typescript.validate.enable": true, // Enable TypeScript validation + "typescript.tsdk": "node_modules/typescript/lib", + "typescript.format.placeOpenBraceOnNewLineForControlBlocks": true, + "typescript.format.placeOpenBraceOnNewLineForFunctions": true, + "editor.tabSize": 2, + "editor.formatOnSave": true, // Automatically format TypeScript code on save (requires Prettier or other formatter extensions) + "editor.defaultFormatter": "esbenp.prettier-vscode", // Set the default code formatter + "editor.wordWrap": "on", // Enable word wrapping + "editor.minimap.enabled": false, // Disable the minimap + "files.autoSave": "afterDelay", // Autosave files when switching focus away from VS Code + "typescript.format.enable": false, // Disable TypeScript formatting to rely on your chosen formatter + "editor.suggestSelection": "first", // Show suggestions as you type + "editor.codeLens": true, // Show code lenses (e.g., references and implementations) + "typescript.updateImportsOnFileMove.enabled": "always", // Automatically update import paths when moving files + "typescript.preferences.quoteStyle": "single", // Use single quotes for string literals + "editor.autoClosingBrackets": "always", // Automatically close brackets and quotes + /** + ** React-specific Settings ** + */ + "editor.codeActionsOnSave": { + "source.fixAll.tslint": "always", + "source.fixAll.eslint": "always" }, + "eslint.format.enable": true, + /** + ** JSON Settings ** + */ + "[json][jsonc]": { + "editor.insertSpaces": true + }, + /** + ** HTML Settings ** + */ + "html.autoClosingTags": true, + "html.format.enable": true, "[html]": { "editor.detectIndentation": false, "editor.tabSize": 4, "editor.defaultFormatter": "vscode.html-language-features" }, - + /** + ** DOCKERFILE Settings ** + */ "[dockerfile]": { "editor.defaultFormatter": "ms-azuretools.vscode-docker" } diff --git a/Dockerfile b/Dockerfile index 58127cd42..ba1b63185 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:experimental -# Use node:17 to docker build on M1 -FROM --platform=${BUILDPLATFORM} node:16 as builder + +FROM node:21.6.0 as builder LABEL org.opencontainers.image.source https://github.com/flyteorg/flyteconsole ARG TARGETARCH @@ -10,24 +10,31 @@ ENV npm_config_target_libc glibc WORKDIR /my-project/ COPY . /my-project/ + +# install production dependencies +RUN : \ + --mount=type=cache,target=/root/.yarn \ + && yarn workspaces focus --production --all + +# build console web app +RUN : \ + --mount=type=cache,target=/root/.yarn \ + && BASE_URL=/console yarn workspace @clients/console run build:prod + +# copy console build to /app RUN : \ --mount=type=cache,target=/root/.yarn \ - # install production dependencies - && yarn workspaces focus --all --production \ - && yarn build:types \ - && BASE_URL=/console yarn run build:prod \ && mkdir /app \ - && cp -R ./website/dist/* /app + && cp -R ./website/console/dist/* /app FROM gcr.io/distroless/nodejs LABEL org.opencontainers.image.source https://github.com/flyteorg/flyteconsole COPY --from=builder /app app WORKDIR /app -ENV NODE_ENV=production PORT=8080 +ENV NODE_ENV=production BASE_URL=/console PORT=8080 EXPOSE 8080 USER 1000 CMD ["server.js"] - diff --git a/Makefile b/Makefile old mode 100755 new mode 100644 index 2edce4e4e..6034cc40f --- a/Makefile +++ b/Makefile @@ -1,10 +1,4 @@ -export REPOSITORY=flyteconsole -include boilerplate/flyte/docker_build/Makefile - -.PHONY: update_boilerplate -update_boilerplate: - @curl https://raw.githubusercontent.com/flyteorg/boilerplate/master/boilerplate/update.sh -o boilerplate/update.sh - @boilerplate/update.sh +PACKAGES = packages .PHONY: install install: #installs dependencies @@ -14,47 +8,35 @@ install: #installs dependencies lint: #lints the package for common code smells yarn run lint -.PHONY: build_prod -build_prod: - yarn run clean - make types - BASE_URL=/console yarn run build:prod - -.PHONY: pack -pack: - yarn run build:pack +########################################################################## +################################ CLEAN ################################### +########################################################################## +.PHONY: clean_all +clean_all: + git clean -fxd --exclude scripts -.PHONY: types -types: - yarn workspaces focus --production --all - yarn run build:types - -# test_unit runs all unit tests .PHONY: test_unit test_unit: - yarn test + NODE_ENV=test yarn run jest --detectOpenHandles --no-cache # server starts the service in development mode .PHONY: server server: yarn start -.PHONY: clean -clean: - yarn run clean - # test_unit_codecov runs unit tests with code coverage turned on and # submits the coverage to codecov.io .PHONY: test_unit_codecov test_unit_codecov: - yarn run test-coverage + NODE_ENV=test yarn run jest --coverage --detectOpenHandles --no-cache .PHONY: generate_ssl generate_ssl: - ./script/generate_ssl.sh + ./scripts/generate_ssl.sh -PLACEHOLDER_NPM := "version": "0.0.0-develop" +PLACEHOLDER_NPM := \"version\": \"0.0.0-develop\" .PHONY: update_npmversion update_npmversion: - ./script/update_npmversion.sh ${VERSION} + grep "$(PLACEHOLDER_NPM)" "website/console/package.json" + sed -i "s/$(PLACEHOLDER_NPM)/\"version\": \"${VERSION}\"/g" "website/console/package.json" diff --git a/README.md b/README.md index ffa0501f2..d1eae5331 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -

+

Flyte Logo

@@ -31,6 +31,16 @@

+## 🎉 Announcement: Console Refresh 🎉 + +We've recently updated FlyteConsole with a number of changes, including a refreshed UI, performance updates such as an upgrade to MUI5, better optimized fetch patterns, code-splitting and a significant reduction in the vendor.js file size. In addition to these improvements, we've also addressed a number of bugs, including better support for dynamic executions and the timeline now supports long-running workflows. + +Most of these changes are non-breaking however, there are a few things we've changed: + +- `FLYTE_NAVIGATION` and `HORIZONTAL_LAYOUT` env vars have been removed. These were used to provide configuration options to the page layout and navigation but are no longer needed as the new navigation is fixed. +- `ENABLE_GA` and `GA_TRACKING_ID` env vars have been removed. These were used to configure Google Analytics; Google Analytics was removed. +- `ExternalConfigurationProviderProps` and `registry` have been removed. These were used to provide override capabilities to specific components and were removed for simplicity. + ## 📦 Install Dependencies Running flyteconsole locally requires [NodeJS](https://nodejs.org) and @@ -41,73 +51,74 @@ For help with installing dependencies look into ## 🚀 Quick Start 1. Follow [Start a Local flyte backend](https://docs.flyte.org/en/latest/getting_started/index.html), like: - ```bash - docker run --rm --privileged -p 30080:30080 -p 30081:30081 -p 30082:30082 -p 30084:30084 cr.flyte.org/flyteorg/flyte-sandbox - ``` + ```bash + docker run --rm --privileged -p 30080:30080 -p 30081:30081 -p 30082:30082 -p 30084:30084 cr.flyte.org/flyteorg/flyte-sandbox + ``` 2. Now, export the following env variables: - `export ADMIN_API_URL=http://localhost:30080` + `export ADMIN_API_URL=http://localhost:30080` - > You can persist these environment variables either in the current shell or in a `.env` file at the root - > of the repository. A `.env` file will persist the settings across multiple terminal - > sessions. + > You can persist these environment variables either in the current shell or in a `.env` file at the root + > of the repository. A `.env` file will persist the settings across multiple terminal + > sessions. 3. Start the server (uses localhost:3000) - ```bash - yarn start - ``` + ```bash + yarn install + yarn start + ``` 4. Explore your local copy at `http://localhost:3000` ### Note: Python errors with OSX -Recently OSX (12.3) removed python 2.7 from default installation and this can cause build errors for some users depending on it's setup. In this repository you can experience `env: python: No such file or directory` error from gyp ([node-gyp](https://github.com/nodejs/node-gyp)). +OSX (12.3) removed python 2.7 from default installation and this can cause build errors for some users depending on it's setup. In this repository you can experience `env: python: No such file or directory` error from gyp ([node-gyp](https://github.com/nodejs/node-gyp)). The easiest way to fix it: -- Install the XCode Command Line Tools standalone by running `xcode-select --install` in the terminal +- Install the XCode Command Line Tools standalone by running `xcode-select --install` in the terminal OR ```bash brew install python # install python with brew which python # check if python path is properly defined + # if path not defined where python3 - # Take the version and location from above and run this command (replacing `/usr/bin/python3` with the location of your python instalation). This will symlink python to python3 + + # Take the version and location from above and run this command + #(replacing `/usr/bin/python3` with the location of your python + # instalation). This will symlink python to python3 ln -s /usr/bin/python3 /usr/local/bin/python ``` ### Environment Variables -- `ADMIN_API_URL` (default: [window.location.origin](https://developer.mozilla.org/en-US/docs/Web/API/Window/location>)) +- `ADMIN_API_URL` (default: [window.location.origin](https://developer.mozilla.org/en-US/docs/Web/API/Window/location>)) - The Flyte Console displays information fetched from the FlyteAdmin API. This - environment variable specifies the host prefix used in constructing API requests. + The Flyte Console displays information fetched from the FlyteAdmin API. This + environment variable specifies the host prefix used in constructing API requests. - _Note_: this is only the host portion of the API endpoint, consisting of the - protocol, domain, and port (if not using the standard 80/443). + _Note_: this is only the host portion of the API endpoint, consisting of the + protocol, domain, and port (if not using the standard 80/443). - This value will be combined with a suffix (such as `/api/v1`) to construct the - final URL used in an API request. + This value will be combined with a suffix (such as `/api/v1`) to construct the + final URL used in an API request. - _Default Behavior_ + _Default Behavior_ - In most cases, `flyteconsole` will be hosted in the same cluster as the Admin - API, meaning that the domain used to access the console is the same value used to - access the API. For this reason, if no value is set for `ADMIN_API_URL`, the - default behavior is to use the value of `window.location.origin`. + In most cases, `flyteconsole` will be hosted in the same cluster as the Admin + API, meaning that the domain used to access the console is the same value used to + access the API. For this reason, if no value is set for `ADMIN_API_URL`, the + default behavior is to use the value of `window.location.origin`. -- `BASE_URL` (default: `undefined`) +- `BASE_URL` (default: `undefined`) - This setting allows running the console at a prefix on the target host. This is - necessary when hosting the API and console on the same domain (with prefixes of - `/api/v1` and `/console` for example). For local development, this is - usually not needed, so the default behavior is to run without a prefix. - -- `FLYTE_NAVIGATION` (default: `undefined`) - UI related. Allows you to change colors of the navigation bar and add links - to other internal pages or external sites. **[More info](packages/console/src/components/Navigation/Readme.md)** + This setting allows running the console at a prefix on the target host. This is + necessary when hosting the API and console on the same domain (with prefixes of + `/api/v1` and `/console` for example). For local development, this is + usually not needed, so the default behavior is to run without a prefix. ### Running from docker image as localhost @@ -129,8 +140,8 @@ docker run -p 8080:8080 -e BASE_URL="/console" -e CONFIG_DIR="/etc/flyte/config" To start the local development server run: ```bash -yarn install # to install node_modules -yarn start # to start application +yarn install # to install node_modules +yarn start # to start application ``` This will spin up a Webpack development server, compile all of the code into bundles, @@ -140,75 +151,72 @@ at http://localhost:3000 (if using the default port). ### 🎱 Using items in your own application -- Authorize your app to call flyte admin api. **[More info](packages/flyte-api/README.md)** +- Authorize your app to call flyte admin api. **[More info](packages/flyte-api/README.md)** ## 🛠 Development For continious development we are using: -- **[Protobuf and Debug Output](CONTRIBUTING.md#protobuf-and-debug-output)**. - Protobuf is a binary response/request format, which makes _Network Tab_ hardly useful. - To get more info on requests - use our Debug Output -- **[Storybook](CONTRIBUTING.md#storybook)** - \- used for component stories and base UI testing. - -- **[Feature flags](CONTRIBUTING.md#feature-flags)** - \- allows to enable/disable specific code paths. Used to simplify continious development. +- **[Protobuf and Debug Output](CONTRIBUTING.md#protobuf-and-debug-output)**. + Protobuf is a binary response/request format, which makes _Network Tab_ hardly useful. + To get more info on requests - use our Debug Output +- **[Storybook](CONTRIBUTING.md#storybook)** + \- used for component stories and base UI testing. -- **[Google Analytics](CONTRIBUTING.md#google-analytics)** - \- adds tracking code to the app or website. To disable use `ENABLE_GA=false` +- **[Feature flags](CONTRIBUTING.md#feature-flags)** + \- allows to enable/disable specific code paths. Used to simplify continious development. More info on each section could be found at [CONTRIBUTING.md](CONTRIBUTING.md) -- Set `ADMIN_API_URL` and `ADMIN_API_USE_SSL` +- Set `ADMIN_API_URL` and `ADMIN_API_USE_SSL` - ```bash - export ADMIN_API_URL=https://different.admin.service.com - export ADMIN_API_USE_SSL="https" - export LOCAL_DEV_HOST=localhost.different.admin.service.com - ``` + ```bash + export ADMIN_API_URL=https://different.admin.service.com + export ADMIN_API_USE_SSL="https" + export LOCAL_DEV_HOST=localhost.different.admin.service.com + ``` - > **Hint:** Add these to your local profile (eg, `./profile`) to prevent having to do this step each time + > **Hint:** Add these to your local profile (eg, `./profile`) to prevent having to do this step each time -- Generate SSL certificate +- Generate SSL certificate - Run the following command from your `flyteconsole` directory + Run the following command from your `flyteconsole` directory - ```bash - make generate_ssl - ``` + ```bash + make generate_ssl + ``` -- Add new record to hosts file +- Add new record to hosts file - ```bash - sudo vim /etc/hosts - ``` + ```bash + sudo vim /etc/hosts + ``` - Add the following record + Add the following record - ```bash - 127.0.0.1 localhost.different.admin.service.com - ``` + ```bash + 127.0.0.1 localhost.different.admin.service.com + ``` -- Install Chrome plugin: [Moesif Origin & CORS Changer](https://chrome.google.com/webstore/detail/moesif-origin-cors-change/digfbfaphojjndkpccljibejjbppifbc) +- Install Chrome plugin: [Moesif Origin & CORS Changer](https://chrome.google.com/webstore/detail/moesif-origin-cors-change/digfbfaphojjndkpccljibejjbppifbc) - > _NOTE:_ - > - > 1. Activate plugin (toggle to "on") - > 1. Open 'Advanced Settings': - > - > - set `Access-Control-Allow-Credentials`: `true` - > - set `Domain List`: `your.localhost.com` + > _NOTE:_ + > + > 1. Activate plugin (toggle to "on") + > 1. Open 'Advanced Settings': + > + > - set `Access-Control-Allow-Credentials`: `true` + > - set `Domain List`: `your.localhost.com` -- Start `flyteconsole` +- Start `flyteconsole` - ```bash - yarn start - ``` + ```bash + yarn start + ``` - Your new localhost is [localhost.different.admin.service.com](http://localhost.different.admin.service.com) + Your new localhost is [localhost.different.admin.service.com](http://localhost.different.admin.service.com) - > **Hint:** Ensure you don't have `ADMIN_API_URL` set (eg, in your `/.profile`.) + > **Hint:** Ensure you don't have `ADMIN_API_URL` set (eg, in your `/.profile`.) ## ⛳️ Release diff --git a/commitlint.config.js b/commitlint.config.js index b0482beff..422b19445 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,4 +1 @@ -module.exports = { - extends: ['@commitlint/config-conventional'], - ignores: [commit => commit.includes('[skip ci]')], -}; +module.exports = { extends: ['@commitlint/config-conventional'] }; diff --git a/jest.config.js b/jest.config.js index 000d08261..8338bb88d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,21 +1,46 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -const sharedConfig = require('./script/test/jest.base.js'); +// Docs: https://jestjs.io/docs/en/configuration.html +/** @type {import('ts-jest').JestConfigWithTsJest} */ +const sharedConfig = require('./scripts/jest.base.js'); module.exports = { ...sharedConfig, - clearMocks: true, verbose: false, + rootDir: './', - setupFilesAfterEnv: ['./script/test/jest-setup.ts'], + setupFilesAfterEnv: ['./scripts/jest-setup.ts'], + resolver: './scripts/jest-resolver.js', + moduleNameMapper: { + ...sharedConfig.moduleNameMapper, + '\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + '/script/test/assetsTransformer.js', + '^@clients/common(.*)$': '/packages/common/src$1', + '^@clients/db(.*)$': '/packages/db/src$1', + '^@clients/flyte-api(.*)$': '/packages/flyte-api/src$1', + '^@clients/locale(.*)$': '/packages/locale/src$1', + '^@clients/oss-console(.*)$': '/packages/oss-console/src$1', + '^@clients/primitives(.*)$': '/packages/primitives/src$1', + '^@clients/theme(.*)$': '/packages/theme/src$1', + '^@clients/ui-atoms(.*)$': '/packages/ui-atoms/src$1', + }, - projects: ['/packages/*', '/website'], + roots: [ + '/packages/common/src', + '/packages/flyte-api/src', + '/packages/locale/src', + '/packages/oss-console/src', + '/packages/primitives/src', + '/packages/theme/src', + '/packages/ui-atoms/src', + ], + projects: ['/packages/*'], + /** + * COVERAGE + */ coverageDirectory: '/.coverage', - collectCoverageFrom: [ - '**/*.{ts,tsx}', - '!**/*/*.stories.{ts,tsx}', - '!**/*/*.mocks.{ts,tsx}', - ], + collectCoverageFrom: ['**/*.ts', '**/*.tsx'], coveragePathIgnorePatterns: [...sharedConfig.coveragePathIgnorePatterns], - coverageReporters: ['text', 'json', 'html'], + // 'buildkite-test-collector/jest/reporter': https://buildkite.com/docs/test-analytics/javascript-collectors#configure-the-test-framework-jest + // reporters: ['default'], + coverageReporters: ['text', 'text-summary', 'json', 'html', 'clover', 'lcov'], }; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 68c15514f..000000000 --- a/package-lock.json +++ /dev/null @@ -1,34852 +0,0 @@ -{ - "name": "flyteconsole", - "version": "1.9.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "flyteconsole", - "version": "1.9.1", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/core": "~7.16.12", - "@babel/preset-env": "~7.16.11", - "@commitlint/cli": "^17.3.0", - "@commitlint/config-conventional": "^17.3.0", - "@material-ui/core": "^4.2.0", - "@material-ui/icons": "^4.2.1", - "@semantic-release/changelog": "^6.0.3", - "@semantic-release/commit-analyzer": "^10.0.1", - "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^9.0.4", - "@semantic-release/npm": "^10.0.4", - "@semantic-release/release-notes-generator": "^11.0.4", - "@testing-library/jest-dom": "^5.5.0", - "@testing-library/react": "^10.0.3", - "@testing-library/react-hooks": "^7.0.2", - "@types/morgan": "^1.9.4", - "@types/react": "^16.14.35", - "@types/react-dom": "^16.9.7", - "@typescript-eslint/eslint-plugin": "^5.48.2", - "@typescript-eslint/parser": "^5.48.2", - "babel-loader": "^8.2.5", - "chalk": "^4", - "chart.js": "3.6.2", - "chartjs-plugin-datalabels": "2.0.0", - "cheerio": "^1.0.0-rc.12", - "compression-webpack-plugin": "^9.2.0", - "cookie-parser": "^1.4.3", - "copy-webpack-plugin": "^11.0.0", - "dotenv": "^5.0.1", - "eslint": "^8.33.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-prettier": "^8.6.0", - "eslint-plugin-import": "^2.27.4", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.32.0", - "eslint-plugin-react-hooks": "^4.6.0", - "express": "^4.18.1", - "express-static-gzip": "^2.1.7", - "fork-ts-checker-webpack-plugin": "^7.2.11", - "html-webpack-plugin": "^5.5.0", - "husky": "^8.0.2", - "jest": "^26.0.0", - "jest-transformer-svg": "^2.0.0", - "lint-staged": "^13.1.0", - "morgan": "^1.10.0", - "msw": "^0.24.1", - "node-polyfill-webpack-plugin": "^2.0.1", - "prettier": "^2.8.3", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "serve-static": "^1.12.3", - "source-map-loader": "^4.0.1", - "ts-jest": "^26.3.0", - "ts-loader": "^9.2.6", - "ts-node": "^8.0.2", - "tsc-alias": "^1.7.0", - "tsc-watch": "^6.0.0", - "tslib": "^2.4.1", - "typescript": "^4.9.4", - "wait-on": "^6.0.1", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.7.4", - "webpack-merge": "^5.8.0", - "webpack-node-externals": "^3.0.0" - }, - "devDependencies": { - "@storybook/addon-actions": "^6.4.19", - "@storybook/addon-essentials": "^6.4.19", - "@storybook/addon-interactions": "^6.4.19", - "@storybook/addon-links": "^6.4.19", - "@storybook/builder-webpack5": "^6.4.19", - "@storybook/manager-webpack5": "^6.4.19", - "@storybook/react": "^6.4.19", - "@storybook/testing-library": "^0.0.9", - "@types/traverse": "^0.6.32", - "ansicolors": "^0.3.2", - "execa": "^7.2.0", - "semantic-release": "21.0.0", - "traverse": "^0.6.7" - }, - "workspaces": { - "packages": [ - "packages/*", - "website" - ] - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/@babel/code-frame": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.9", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.16.12", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.9", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.9", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "license": "ISC" - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.9", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "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", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "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", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.9", - "license": "MIT", - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.6", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.7", - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.16.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-decorators": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-default-from": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "license": "MIT", - "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", - "license": "MIT", - "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-object-rest-spread": { - "version": "7.16.7", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "license": "MIT", - "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", - "license": "MIT", - "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.11", - "license": "MIT", - "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/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "MIT", - "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.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "license": "MIT", - "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", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "MIT", - "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.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.6", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.16.11", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-flow": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-transform-flow-strip-types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "license": "MIT", - "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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.16.7", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.16.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.5", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register/node_modules/find-cache-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/make-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/register/node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/pkg-dir": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "license": "MIT" - }, - "node_modules/@babel/runtime": { - "version": "7.22.6", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.22.6", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.8", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@babel/types": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@base2/pretty-print-object": { - "version": "1.0.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "license": "MIT" - }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "license": "Apache-2.0", - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@commitlint/cli": { - "version": "17.6.6", - "license": "MIT", - "dependencies": { - "@commitlint/format": "^17.4.4", - "@commitlint/lint": "^17.6.6", - "@commitlint/load": "^17.5.0", - "@commitlint/read": "^17.5.1", - "@commitlint/types": "^17.4.4", - "execa": "^5.0.0", - "lodash.isfunction": "^3.0.9", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/cli/node_modules/execa": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@commitlint/cli/node_modules/human-signals": { - "version": "2.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@commitlint/cli/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/cli/node_modules/npm-run-path": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/cli/node_modules/strip-final-newline": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@commitlint/config-conventional": { - "version": "17.6.6", - "license": "MIT", - "dependencies": { - "conventional-changelog-conventionalcommits": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "17.4.4", - "license": "MIT", - "dependencies": { - "@commitlint/types": "^17.4.4", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/config-validator/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@commitlint/ensure": { - "version": "17.4.4", - "license": "MIT", - "dependencies": { - "@commitlint/types": "^17.4.4", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.upperfirst": "^4.3.1" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "17.4.0", - "license": "MIT", - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/format": { - "version": "17.4.4", - "license": "MIT", - "dependencies": { - "@commitlint/types": "^17.4.4", - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/is-ignored": { - "version": "17.6.6", - "license": "MIT", - "dependencies": { - "@commitlint/types": "^17.4.4", - "semver": "7.5.2" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/is-ignored/node_modules/semver": { - "version": "7.5.2", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@commitlint/lint": { - "version": "17.6.6", - "license": "MIT", - "dependencies": { - "@commitlint/is-ignored": "^17.6.6", - "@commitlint/parse": "^17.6.5", - "@commitlint/rules": "^17.6.5", - "@commitlint/types": "^17.4.4" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/load": { - "version": "17.5.0", - "license": "MIT", - "dependencies": { - "@commitlint/config-validator": "^17.4.4", - "@commitlint/execute-rule": "^17.4.0", - "@commitlint/resolve-extends": "^17.4.4", - "@commitlint/types": "^17.4.4", - "@types/node": "*", - "chalk": "^4.1.0", - "cosmiconfig": "^8.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4 || ^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/load/node_modules/acorn-walk": { - "version": "8.2.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@commitlint/load/node_modules/cosmiconfig-typescript-loader": { - "version": "4.3.0", - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=3" - } - }, - "node_modules/@commitlint/load/node_modules/ts-node": { - "version": "10.9.1", - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/@commitlint/load/node_modules/typescript": { - "version": "5.1.6", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@commitlint/message": { - "version": "17.4.2", - "license": "MIT", - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/parse": { - "version": "17.6.5", - "license": "MIT", - "dependencies": { - "@commitlint/types": "^17.4.4", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.2.2" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/read": { - "version": "17.5.1", - "license": "MIT", - "dependencies": { - "@commitlint/top-level": "^17.4.0", - "@commitlint/types": "^17.4.4", - "fs-extra": "^11.0.0", - "git-raw-commits": "^2.0.11", - "minimist": "^1.2.6" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/read/node_modules/fs-extra": { - "version": "11.1.1", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "17.4.4", - "license": "MIT", - "dependencies": { - "@commitlint/config-validator": "^17.4.4", - "@commitlint/types": "^17.4.4", - "import-fresh": "^3.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/rules": { - "version": "17.6.5", - "license": "MIT", - "dependencies": { - "@commitlint/ensure": "^17.4.4", - "@commitlint/message": "^17.4.2", - "@commitlint/to-lines": "^17.4.0", - "@commitlint/types": "^17.4.4", - "execa": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/rules/node_modules/execa": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@commitlint/rules/node_modules/human-signals": { - "version": "2.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@commitlint/rules/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/rules/node_modules/npm-run-path": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/rules/node_modules/strip-final-newline": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "17.4.0", - "license": "MIT", - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/top-level": { - "version": "17.4.0", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/types": { - "version": "17.4.4", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@design-systems/utils": { - "version": "2.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.2", - "clsx": "^1.0.4", - "focus-lock": "^0.8.0", - "react-merge-refs": "^1.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": ">= 16.8.6", - "react-dom": ">= 16.8.6" - } - }, - "node_modules/@devtools-ds/object-inspector": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "7.7.2", - "@devtools-ds/object-parser": "^1.2.1", - "@devtools-ds/themes": "^1.2.1", - "@devtools-ds/tree": "^1.2.1", - "clsx": "1.1.0" - }, - "peerDependencies": { - "react": ">= 16.8.6" - } - }, - "node_modules/@devtools-ds/object-inspector/node_modules/@babel/runtime": { - "version": "7.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.2" - } - }, - "node_modules/@devtools-ds/object-inspector/node_modules/clsx": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@devtools-ds/object-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "~7.5.4" - } - }, - "node_modules/@devtools-ds/object-parser/node_modules/@babel/runtime": { - "version": "7.5.5", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.2" - } - }, - "node_modules/@devtools-ds/themes": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "~7.5.4", - "@design-systems/utils": "2.12.0", - "clsx": "1.1.0" - }, - "peerDependencies": { - "react": ">= 16.8.6" - } - }, - "node_modules/@devtools-ds/themes/node_modules/@babel/runtime": { - "version": "7.5.5", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.2" - } - }, - "node_modules/@devtools-ds/themes/node_modules/clsx": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@devtools-ds/tree": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "7.7.2", - "@devtools-ds/themes": "^1.2.1", - "clsx": "1.1.0" - }, - "peerDependencies": { - "react": ">= 16.8.6" - } - }, - "node_modules/@devtools-ds/tree/node_modules/@babel/runtime": { - "version": "7.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.2" - } - }, - "node_modules/@devtools-ds/tree/node_modules/clsx": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "license": "MIT" - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "license": "MIT", - "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/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.44.0", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@flyteconsole/client-app": { - "resolved": "website", - "link": true - }, - "node_modules/@flyteorg/common": { - "resolved": "packages/common", - "link": true - }, - "node_modules/@flyteorg/components": { - "resolved": "packages/components", - "link": true - }, - "node_modules/@flyteorg/console": { - "resolved": "packages/console", - "link": true - }, - "node_modules/@flyteorg/flyte-api": { - "resolved": "packages/flyte-api", - "link": true - }, - "node_modules/@flyteorg/flyteidl-types": { - "resolved": "packages/flyteidl-types", - "link": true - }, - "node_modules/@flyteorg/locale": { - "resolved": "packages/locale", - "link": true - }, - "node_modules/@flyteorg/ui-atoms": { - "resolved": "packages/ui-atoms", - "link": true - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "license": "ISC", - "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.0.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "license": "MIT", - "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", - "license": "MIT", - "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.0", - "license": "MIT", - "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", - "license": "MIT", - "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/@isaacs/string-locale-compare": { - "version": "1.1.0", - "license": "ISC" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "license": "ISC", - "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/find-up": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/core": { - "version": "26.6.3", - "license": "MIT", - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/environment": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.6.1", - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.4.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils/node_modules/jest-get-type": { - "version": "29.4.3", - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/globals": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/reporters": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "node-notifier": "^8.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.0", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/test-result": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "26.6.3", - "license": "MIT", - "dependencies": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/transform": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/transform/node_modules/write-file-atomic": { - "version": "3.0.3", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/@jest/types": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "license": "MIT" - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "license": "MIT" - }, - "node_modules/@material-ui/core": { - "version": "4.12.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/icons": { - "version": "4.11.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@material-ui/core": "^4.0.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/styles": { - "version": "4.11.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/styles/node_modules/csstype": { - "version": "2.6.21", - "license": "MIT" - }, - "node_modules/@material-ui/system": { - "version": "4.12.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/system/node_modules/csstype": { - "version": "2.6.21", - "license": "MIT" - }, - "node_modules/@material-ui/types": { - "version": "5.1.0", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/utils": { - "version": "4.11.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@mdx-js/mdx": { - "version": "1.6.22", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@mdx-js/mdx/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@mdx-js/mdx/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@mdx-js/react": { - "version": "1.6.22", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" - } - }, - "node_modules/@mdx-js/util": { - "version": "1.6.22", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@mrmlnc/readdir-enhanced/node_modules/glob-to-regexp": { - "version": "0.3.0", - "dev": true, - "license": "BSD" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/arborist": { - "version": "6.3.0", - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^4.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^9.0.0", - "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/config": { - "version": "6.2.1", - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^3.8.0", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/config/node_modules/ini": { - "version": "4.1.1", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/disparity-colors": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "4.1.0", - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces": { - "version": "3.0.4", - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/glob": { - "version": "10.3.3", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/minipass": { - "version": "7.0.2", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@npmcli/metavuln-calculator": { - "version": "5.0.1", - "license": "ISC", - "dependencies": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "4.0.0", - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.1.0", - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.1", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.3.3", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/minipass": { - "version": "7.0.2", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "license": "ISC", - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/query": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.4", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.4", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core/node_modules/@octokit/request-error": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.6", - "license": "MIT", - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "license": "MIT", - "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "4.1.6", - "license": "MIT", - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "5.2.3", - "license": "MIT", - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": "^4.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.8", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@octokit/types": "^11.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "11.1.0", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@octokit/request/node_modules/@octokit/request-error": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/@octokit/types": { - "version": "9.3.2", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@open-draft/until": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.10", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "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 <4.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { - "version": "0.7.4", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@semantic-release/changelog": { - "version": "6.0.3", - "license": "MIT", - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.4" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/changelog/node_modules/fs-extra": { - "version": "11.1.1", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "10.0.1", - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^6.0.0", - "conventional-commits-filter": "^3.0.0", - "conventional-commits-parser": "^4.0.0", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash-es": "^4.17.21", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-changelog-angular": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-commits-filter": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-commits-parser": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.3.5", - "meow": "^8.1.2", - "split2": "^3.2.2" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@semantic-release/commit-analyzer/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@semantic-release/commit-analyzer/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@semantic-release/error": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@semantic-release/git": { - "version": "10.0.1", - "license": "MIT", - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/git/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@semantic-release/git/node_modules/execa": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@semantic-release/git/node_modules/human-signals": { - "version": "2.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@semantic-release/git/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/git/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@semantic-release/git/node_modules/npm-run-path": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/git/node_modules/p-reduce": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/git/node_modules/strip-final-newline": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@semantic-release/github": { - "version": "9.0.4", - "license": "MIT", - "dependencies": { - "@octokit/core": "^5.0.0", - "@octokit/plugin-paginate-rest": "^8.0.0", - "@octokit/plugin-retry": "^6.0.0", - "@octokit/plugin-throttling": "^7.0.0", - "@semantic-release/error": "^4.0.0", - "aggregate-error": "^4.0.1", - "debug": "^4.3.4", - "dir-glob": "^3.0.1", - "globby": "^13.1.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", - "lodash-es": "^4.17.21", - "mime": "^3.0.0", - "p-filter": "^3.0.0", - "url-join": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/github/node_modules/@octokit/auth-token": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@semantic-release/github/node_modules/@octokit/core": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.0.0", - "@octokit/request": "^8.0.2", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@semantic-release/github/node_modules/@octokit/endpoint": { - "version": "9.0.0", - "license": "MIT", - "dependencies": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@semantic-release/github/node_modules/@octokit/graphql": { - "version": "7.0.1", - "license": "MIT", - "dependencies": { - "@octokit/request": "^8.0.1", - "@octokit/types": "^11.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@semantic-release/github/node_modules/@octokit/plugin-paginate-rest": { - "version": "8.0.0", - "license": "MIT", - "dependencies": { - "@octokit/types": "^11.0.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=5" - } - }, - "node_modules/@semantic-release/github/node_modules/@octokit/plugin-retry": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=5" - } - }, - "node_modules/@semantic-release/github/node_modules/@octokit/plugin-throttling": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "@octokit/types": "^11.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "^5.0.0" - } - }, - "node_modules/@semantic-release/github/node_modules/@octokit/request": { - "version": "8.1.1", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@semantic-release/github/node_modules/@octokit/types": { - "version": "11.1.0", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@semantic-release/github/node_modules/@semantic-release/error": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@semantic-release/github/node_modules/agent-base": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@semantic-release/github/node_modules/aggregate-error": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/clean-stack": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@semantic-release/github/node_modules/escape-string-regexp": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/globby": { - "version": "13.2.2", - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/https-proxy-agent": { - "version": "7.0.1", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@semantic-release/github/node_modules/indent-string": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@semantic-release/github/node_modules/p-filter": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "p-map": "^5.1.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/p-map": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/slash": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/url-join": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm": { - "version": "10.0.4", - "license": "MIT", - "dependencies": { - "@semantic-release/error": "^4.0.0", - "aggregate-error": "^4.0.1", - "execa": "^7.0.0", - "fs-extra": "^11.0.0", - "lodash-es": "^4.17.21", - "nerf-dart": "^1.0.0", - "normalize-url": "^8.0.0", - "npm": "^9.5.0", - "rc": "^1.2.8", - "read-pkg": "^8.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^3.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/@semantic-release/error": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@semantic-release/npm/node_modules/aggregate-error": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/clean-stack": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/execa": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@semantic-release/npm/node_modules/fs-extra": { - "version": "11.1.1", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@semantic-release/npm/node_modules/indent-string": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/mimic-fn": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/onetime": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "11.0.4", - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^6.0.0", - "conventional-changelog-writer": "^6.0.0", - "conventional-commits-filter": "^3.0.0", - "conventional-commits-parser": "^4.0.0", - "debug": "^4.0.0", - "get-stream": "^7.0.0", - "import-from": "^4.0.0", - "into-stream": "^7.0.0", - "lodash-es": "^4.17.21", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-changelog-angular": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-changelog-writer": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "conventional-commits-filter": "^3.0.0", - "dateformat": "^3.0.3", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "meow": "^8.1.2", - "semver": "^7.0.0", - "split": "^1.0.1" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-commits-filter": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-commits-parser": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.3.5", - "meow": "^8.1.2", - "split2": "^3.2.2" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/find-up": { - "version": "6.3.0", - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { - "version": "7.0.1", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/into-stream": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/locate-path": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/p-limit": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/p-locate": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/path-exists": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg-up": { - "version": "10.0.0", - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.0.0", - "type-fest": "^3.12.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/type-fest": { - "version": "3.13.1", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/yocto-queue": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "license": "BSD-3-Clause" - }, - "node_modules/@sigstore/bundle": { - "version": "1.0.0", - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.0", - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "1.0.2", - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf/node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@storybook/addon-actions": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "polished": "^4.2.2", - "prop-types": "^15.7.2", - "react-inspector": "^5.1.0", - "regenerator-runtime": "^0.13.7", - "telejson": "^6.0.8", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "uuid-browser": "^3.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-backgrounds": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "global": "^4.4.0", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-controls": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-common": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/node-logger": "6.5.16", - "@storybook/store": "6.5.16", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "lodash": "^4.17.21", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-docs": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.12.12", - "@babel/preset-env": "^7.12.11", - "@jest/transform": "^26.6.2", - "@mdx-js/react": "^1.6.22", - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-common": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/docs-tools": "6.5.16", - "@storybook/mdx1-csf": "^0.0.1", - "@storybook/node-logger": "6.5.16", - "@storybook/postinstall": "6.5.16", - "@storybook/preview-web": "6.5.16", - "@storybook/source-loader": "6.5.16", - "@storybook/store": "6.5.16", - "@storybook/theming": "6.5.16", - "babel-loader": "^8.0.0", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "regenerator-runtime": "^0.13.7", - "remark-external-links": "^8.0.0", - "remark-slug": "^6.0.0", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@storybook/mdx2-csf": "^0.0.3", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@storybook/mdx2-csf": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-essentials": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addon-actions": "6.5.16", - "@storybook/addon-backgrounds": "6.5.16", - "@storybook/addon-controls": "6.5.16", - "@storybook/addon-docs": "6.5.16", - "@storybook/addon-measure": "6.5.16", - "@storybook/addon-outline": "6.5.16", - "@storybook/addon-toolbars": "6.5.16", - "@storybook/addon-viewport": "6.5.16", - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/core-common": "6.5.16", - "@storybook/node-logger": "6.5.16", - "core-js": "^3.8.2", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@babel/core": "^7.9.6" - }, - "peerDependenciesMeta": { - "@storybook/angular": { - "optional": true - }, - "@storybook/builder-manager4": { - "optional": true - }, - "@storybook/builder-manager5": { - "optional": true - }, - "@storybook/builder-webpack4": { - "optional": true - }, - "@storybook/builder-webpack5": { - "optional": true - }, - "@storybook/html": { - "optional": true - }, - "@storybook/vue": { - "optional": true - }, - "@storybook/vue3": { - "optional": true - }, - "@storybook/web-components": { - "optional": true - }, - "lit": { - "optional": true - }, - "lit-html": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "svelte": { - "optional": true - }, - "sveltedoc-parser": { - "optional": true - }, - "vue": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-interactions": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@devtools-ds/object-inspector": "^1.1.2", - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-common": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/instrumenter": "6.5.16", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "global": "^4.4.0", - "jest-mock": "^27.0.6", - "polished": "^4.2.2", - "ts-dedent": "^2.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-interactions/node_modules/@jest/types": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "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/@storybook/addon-interactions/node_modules/@storybook/instrumenter": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "core-js": "^3.8.2", - "global": "^4.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-interactions/node_modules/@types/yargs": { - "version": "16.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@storybook/addon-interactions/node_modules/jest-mock": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@storybook/addon-links": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.16", - "@types/qs": "^6.9.5", - "core-js": "^3.8.2", - "global": "^4.4.0", - "prop-types": "^15.7.2", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-measure": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "core-js": "^3.8.2", - "global": "^4.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-outline": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "core-js": "^3.8.2", - "global": "^4.4.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-toolbars": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-viewport": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "global": "^4.4.0", - "memoizerific": "^1.11.3", - "prop-types": "^15.7.2", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addons": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/api": "6.5.16", - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.16", - "@storybook/theming": "6.5.16", - "@types/webpack-env": "^1.16.0", - "core-js": "^3.8.2", - "global": "^4.4.0", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/api": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.16", - "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "store2": "^2.12.0", - "telejson": "^6.0.8", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/builder-webpack4": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.10", - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/channel-postmessage": "6.5.16", - "@storybook/channels": "6.5.16", - "@storybook/client-api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-common": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/node-logger": "6.5.16", - "@storybook/preview-web": "6.5.16", - "@storybook/router": "6.5.16", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.16", - "@storybook/theming": "6.5.16", - "@storybook/ui": "6.5.16", - "@types/node": "^14.0.10 || ^16.0.0", - "@types/webpack": "^4.41.26", - "autoprefixer": "^9.8.6", - "babel-loader": "^8.0.0", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "core-js": "^3.8.2", - "css-loader": "^3.6.0", - "file-loader": "^6.2.0", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^4.1.6", - "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "global": "^4.4.0", - "html-webpack-plugin": "^4.0.0", - "pnp-webpack-plugin": "1.6.4", - "postcss": "^7.0.36", - "postcss-flexbugs-fixes": "^4.2.1", - "postcss-loader": "^4.2.0", - "raw-loader": "^4.0.2", - "stable": "^0.1.8", - "style-loader": "^1.3.0", - "terser-webpack-plugin": "^4.2.3", - "ts-dedent": "^2.0.0", - "url-loader": "^4.1.1", - "util-deprecate": "^1.0.2", - "webpack": "4", - "webpack-dev-middleware": "^3.7.3", - "webpack-filter-warnings-plugin": "^1.2.1", - "webpack-hot-middleware": "^2.25.1", - "webpack-virtual-modules": "^0.2.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/@npmcli/fs": { - "version": "1.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/@types/html-minifier-terser": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/builder-webpack4/node_modules/@types/node": { - "version": "16.18.38", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/builder-webpack4/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/babel-loader": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "dev": true, - "license": "MIT", - "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/@storybook/builder-webpack4/node_modules/braces": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/cacache": { - "version": "15.3.0", - "dev": true, - "license": "ISC", - "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/@storybook/builder-webpack4/node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/clean-css": { - "version": "4.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/cosmiconfig": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/css-loader": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "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.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/css-loader/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/css-loader/node_modules/schema-utils": { - "version": "2.7.1", - "dev": true, - "license": "MIT", - "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/@storybook/builder-webpack4/node_modules/css-loader/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/define-property": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/enhanced-resolve": { - "version": "4.5.0", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/eslint-scope": { - "version": "4.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/file-loader": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "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/@storybook/builder-webpack4/node_modules/fill-range": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "engines": { - "node": ">=6.11.5", - "yarn": ">=1.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/html-minifier-terser": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "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" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/html-minifier-terser/node_modules/commander": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/html-minifier-terser/node_modules/terser": { - "version": "4.8.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/builder-webpack4/node_modules/html-webpack-plugin": { - "version": "4.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "engines": { - "node": ">=6.9" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/icss-utils": { - "version": "4.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss": "^7.0.14" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/is-extendable": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/is-plain-object": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/is-wsl": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/micromatch": { - "version": "3.1.10", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/mime": { - "version": "2.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/picocolors": { - "version": "0.2.1", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/builder-webpack4/node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/pkg-dir": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/pkg-dir/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss": { - "version": "7.0.39", - "dev": true, - "license": "MIT", - "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/@storybook/builder-webpack4/node_modules/postcss-loader": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss": "^7.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss-modules-local-by-default": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss-modules-scope": { - "version": "2.2.0", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss-modules-values": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/pretty-error": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/raw-loader": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "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/@storybook/builder-webpack4/node_modules/renderkid": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/serialize-javascript": { - "version": "5.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/ssri": { - "version": "8.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/strip-ansi": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/style-loader": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/style-loader/node_modules/schema-utils": { - "version": "2.7.1", - "dev": true, - "license": "MIT", - "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/@storybook/builder-webpack4/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/terser-webpack-plugin": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/terser-webpack-plugin/node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/to-regex-range": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/url-loader": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/watchpack": { - "version": "1.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack": { - "version": "4.46.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.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.3", - "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.7.4", - "webpack-sources": "^1.4.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - }, - "webpack-command": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack-dev-middleware": { - "version": "3.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack-filter-warnings-plugin": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.3 < 5.0.0 || >= 5.10" - }, - "peerDependencies": { - "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack-virtual-modules": { - "version": "0.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/cacache": { - "version": "12.0.4", - "dev": true, - "license": "ISC", - "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" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/chownr": { - "version": "1.1.4", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/find-cache-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/make-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/schema-utils": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/serialize-javascript": { - "version": "4.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/ssri": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/terser": { - "version": "4.8.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/webpack/node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/builder-webpack4/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/builder-webpack5": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.10", - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/channel-postmessage": "6.5.16", - "@storybook/channels": "6.5.16", - "@storybook/client-api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-common": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/node-logger": "6.5.16", - "@storybook/preview-web": "6.5.16", - "@storybook/router": "6.5.16", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.16", - "@storybook/theming": "6.5.16", - "@types/node": "^14.0.10 || ^16.0.0", - "babel-loader": "^8.0.0", - "babel-plugin-named-exports-order": "^0.0.2", - "browser-assert": "^1.2.1", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "core-js": "^3.8.2", - "css-loader": "^5.0.1", - "fork-ts-checker-webpack-plugin": "^6.0.4", - "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "html-webpack-plugin": "^5.0.0", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "stable": "^0.1.8", - "style-loader": "^2.0.0", - "terser-webpack-plugin": "^5.0.3", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "webpack": "^5.9.0", - "webpack-dev-middleware": "^4.1.0", - "webpack-hot-middleware": "^2.25.1", - "webpack-virtual-modules": "^0.4.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { - "version": "16.18.38", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/builder-webpack5/node_modules/cosmiconfig": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "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/@storybook/builder-webpack5/node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "dev": true, - "license": "MIT", - "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/@storybook/builder-webpack5/node_modules/schema-utils": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "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/@storybook/channel-postmessage": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "core-js": "^3.8.2", - "global": "^4.4.0", - "qs": "^6.10.0", - "telejson": "^6.0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/channel-websocket": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "global": "^4.4.0", - "telejson": "^6.0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/channels": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js": "^3.8.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/client-api": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/channel-postmessage": "6.5.16", - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/store": "6.5.16", - "@types/qs": "^6.9.5", - "@types/webpack-env": "^1.16.0", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "store2": "^2.12.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/client-logger": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js": "^3.8.2", - "global": "^4.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/components": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/core": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/core-client": "6.5.16", - "@storybook/core-server": "6.5.16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "webpack": "*" - }, - "peerDependenciesMeta": { - "@storybook/builder-webpack5": { - "optional": true - }, - "@storybook/manager-webpack5": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/core-client": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/channel-postmessage": "6.5.16", - "@storybook/channel-websocket": "6.5.16", - "@storybook/client-api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/preview-web": "6.5.16", - "@storybook/store": "6.5.16", - "@storybook/ui": "6.5.16", - "airbnb-js-shims": "^2.2.1", - "ansi-to-html": "^0.6.11", - "core-js": "^3.8.2", - "global": "^4.4.0", - "lodash": "^4.17.21", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "unfetch": "^4.2.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "webpack": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/core-common": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-decorators": "^7.12.12", - "@babel/plugin-proposal-export-default-from": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-private-property-in-object": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.12", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/preset-env": "^7.12.11", - "@babel/preset-react": "^7.12.10", - "@babel/preset-typescript": "^7.12.7", - "@babel/register": "^7.12.1", - "@storybook/node-logger": "6.5.16", - "@storybook/semver": "^7.3.2", - "@types/node": "^14.0.10 || ^16.0.0", - "@types/pretty-hrtime": "^1.0.0", - "babel-loader": "^8.0.0", - "babel-plugin-macros": "^3.0.1", - "babel-plugin-polyfill-corejs3": "^0.1.0", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "express": "^4.17.1", - "file-system-cache": "^1.0.5", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.0.4", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "handlebars": "^4.7.7", - "interpret": "^2.2.0", - "json5": "^2.2.3", - "lazy-universal-dotenv": "^3.0.1", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "slash": "^3.0.0", - "telejson": "^6.0.8", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "webpack": "4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/core-common/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "dev": true, - "license": "MIT", - "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" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@storybook/core-common/node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "16.18.38", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/core-common/node_modules/acorn": { - "version": "6.4.2", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@storybook/core-common/node_modules/babel-loader": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/@storybook/core-common/node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "dev": true, - "license": "MIT", - "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/@storybook/core-common/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.1.5", - "core-js-compat": "^3.8.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@storybook/core-common/node_modules/braces": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-common/node_modules/cacache": { - "version": "12.0.4", - "dev": true, - "license": "ISC", - "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" - } - }, - "node_modules/@storybook/core-common/node_modules/chownr": { - "version": "1.1.4", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/core-common/node_modules/cosmiconfig": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "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/@storybook/core-common/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@storybook/core-common/node_modules/define-property": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-common/node_modules/enhanced-resolve": { - "version": "4.5.0", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/core-common/node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/@storybook/core-common/node_modules/eslint-scope": { - "version": "4.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/core-common/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@storybook/core-common/node_modules/file-system-cache": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fs-extra": "^10.1.0", - "ramda": "^0.28.0" - } - }, - "node_modules/@storybook/core-common/node_modules/file-system-cache/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/fill-range": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-common/node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "dev": true, - "license": "MIT", - "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/@storybook/core-common/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "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/@storybook/core-common/node_modules/is-extendable": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-common/node_modules/is-plain-object": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-common/node_modules/is-wsl": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/core-common/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-common/node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@storybook/core-common/node_modules/micromatch": { - "version": "3.1.10", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-common/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-common/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/core-common/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-common/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/core-common/node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-common/node_modules/pkg-dir": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/core-common/node_modules/ramda": { - "version": "0.28.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } - }, - "node_modules/@storybook/core-common/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/@storybook/core-common/node_modules/schema-utils": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@storybook/core-common/node_modules/serialize-javascript": { - "version": "4.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/@storybook/core-common/node_modules/ssri": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/@storybook/core-common/node_modules/terser": { - "version": "4.8.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@storybook/core-common/node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/@storybook/core-common/node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-common/node_modules/terser-webpack-plugin/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-common/node_modules/terser-webpack-plugin/node_modules/make-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-common/node_modules/terser-webpack-plugin/node_modules/pkg-dir": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-common/node_modules/terser-webpack-plugin/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@storybook/core-common/node_modules/to-regex-range": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-common/node_modules/watchpack": { - "version": "1.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/@storybook/core-common/node_modules/webpack": { - "version": "4.46.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.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.3", - "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.7.4", - "webpack-sources": "^1.4.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - }, - "webpack-command": { - "optional": true - } - } - }, - "node_modules/@storybook/core-common/node_modules/webpack/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/@storybook/core-common/node_modules/webpack/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/core-common/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/core-common/node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/core-events": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js": "^3.8.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-webpack4": "6.5.16", - "@storybook/core-client": "6.5.16", - "@storybook/core-common": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/csf-tools": "6.5.16", - "@storybook/manager-webpack4": "6.5.16", - "@storybook/node-logger": "6.5.16", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.16", - "@storybook/telemetry": "6.5.16", - "@types/node": "^14.0.10 || ^16.0.0", - "@types/node-fetch": "^2.5.7", - "@types/pretty-hrtime": "^1.0.0", - "@types/webpack": "^4.41.26", - "better-opn": "^2.1.1", - "boxen": "^5.1.2", - "chalk": "^4.1.0", - "cli-table3": "^0.6.1", - "commander": "^6.2.1", - "compression": "^1.7.4", - "core-js": "^3.8.2", - "cpy": "^8.1.2", - "detect-port": "^1.3.0", - "express": "^4.17.1", - "fs-extra": "^9.0.1", - "global": "^4.4.0", - "globby": "^11.0.2", - "ip": "^2.0.0", - "lodash": "^4.17.21", - "node-fetch": "^2.6.7", - "open": "^8.4.0", - "pretty-hrtime": "^1.0.3", - "prompts": "^2.4.0", - "regenerator-runtime": "^0.13.7", - "serve-favicon": "^2.5.0", - "slash": "^3.0.0", - "telejson": "^6.0.8", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "watchpack": "^2.2.0", - "webpack": "4", - "ws": "^8.2.3", - "x-default-browser": "^0.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@storybook/builder-webpack5": { - "optional": true - }, - "@storybook/manager-webpack5": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/core-server/node_modules/@storybook/core-client": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/channel-postmessage": "6.5.16", - "@storybook/channel-websocket": "6.5.16", - "@storybook/client-api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/preview-web": "6.5.16", - "@storybook/store": "6.5.16", - "@storybook/ui": "6.5.16", - "airbnb-js-shims": "^2.2.1", - "ansi-to-html": "^0.6.11", - "core-js": "^3.8.2", - "global": "^4.4.0", - "lodash": "^4.17.21", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "unfetch": "^4.2.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "webpack": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "16.18.38", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/core-server/node_modules/acorn": { - "version": "6.4.2", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@storybook/core-server/node_modules/braces": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-server/node_modules/cacache": { - "version": "12.0.4", - "dev": true, - "license": "ISC", - "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" - } - }, - "node_modules/@storybook/core-server/node_modules/chownr": { - "version": "1.1.4", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/core-server/node_modules/commander": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/core-server/node_modules/define-property": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-server/node_modules/enhanced-resolve": { - "version": "4.5.0", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/core-server/node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/@storybook/core-server/node_modules/eslint-scope": { - "version": "4.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/core-server/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@storybook/core-server/node_modules/fill-range": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-server/node_modules/find-cache-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-server/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-server/node_modules/is-extendable": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-server/node_modules/is-plain-object": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-server/node_modules/is-wsl": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/core-server/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/@storybook/core-server/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/core-server/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-server/node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@storybook/core-server/node_modules/make-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-server/node_modules/micromatch": { - "version": "3.1.10", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-server/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-server/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-server/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/core-server/node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-server/node_modules/pkg-dir": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-server/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/@storybook/core-server/node_modules/schema-utils": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@storybook/core-server/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@storybook/core-server/node_modules/serialize-javascript": { - "version": "4.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/@storybook/core-server/node_modules/ssri": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/@storybook/core-server/node_modules/terser": { - "version": "4.8.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@storybook/core-server/node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/@storybook/core-server/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/core-server/node_modules/to-regex-range": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/core-server/node_modules/webpack": { - "version": "4.46.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.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.3", - "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.7.4", - "webpack-sources": "^1.4.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - }, - "webpack-command": { - "optional": true - } - } - }, - "node_modules/@storybook/core-server/node_modules/webpack/node_modules/watchpack": { - "version": "1.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/@storybook/core-server/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/core-server/node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/csf": { - "version": "0.0.2--canary.4566f4d.1", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/@storybook/csf-tools": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.10", - "@babel/generator": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/plugin-transform-react-jsx": "^7.12.12", - "@babel/preset-env": "^7.12.11", - "@babel/traverse": "^7.12.11", - "@babel/types": "^7.12.11", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/mdx1-csf": "^0.0.1", - "core-js": "^3.8.2", - "fs-extra": "^9.0.1", - "global": "^4.4.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@storybook/mdx2-csf": "^0.0.3" - }, - "peerDependenciesMeta": { - "@storybook/mdx2-csf": { - "optional": true - } - } - }, - "node_modules/@storybook/docs-tools": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.10", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/store": "6.5.16", - "core-js": "^3.8.2", - "doctrine": "^3.0.0", - "lodash": "^4.17.21", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/global": { - "version": "5.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/instrumenter": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.0.27", - "@storybook/client-logger": "7.0.27", - "@storybook/core-events": "7.0.27", - "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.0.27" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/instrumenter/node_modules/@storybook/channels": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/instrumenter/node_modules/@storybook/client-logger": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/instrumenter/node_modules/@storybook/core-events": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/manager-webpack4": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.10", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.5.16", - "@storybook/core-client": "6.5.16", - "@storybook/core-common": "6.5.16", - "@storybook/node-logger": "6.5.16", - "@storybook/theming": "6.5.16", - "@storybook/ui": "6.5.16", - "@types/node": "^14.0.10 || ^16.0.0", - "@types/webpack": "^4.41.26", - "babel-loader": "^8.0.0", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "css-loader": "^3.6.0", - "express": "^4.17.1", - "file-loader": "^6.2.0", - "find-up": "^5.0.0", - "fs-extra": "^9.0.1", - "html-webpack-plugin": "^4.0.0", - "node-fetch": "^2.6.7", - "pnp-webpack-plugin": "1.6.4", - "read-pkg-up": "^7.0.1", - "regenerator-runtime": "^0.13.7", - "resolve-from": "^5.0.0", - "style-loader": "^1.3.0", - "telejson": "^6.0.8", - "terser-webpack-plugin": "^4.2.3", - "ts-dedent": "^2.0.0", - "url-loader": "^4.1.1", - "util-deprecate": "^1.0.2", - "webpack": "4", - "webpack-dev-middleware": "^3.7.3", - "webpack-virtual-modules": "^0.2.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/@npmcli/fs": { - "version": "1.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/@storybook/core-client": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/channel-postmessage": "6.5.16", - "@storybook/channel-websocket": "6.5.16", - "@storybook/client-api": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/preview-web": "6.5.16", - "@storybook/store": "6.5.16", - "@storybook/ui": "6.5.16", - "airbnb-js-shims": "^2.2.1", - "ansi-to-html": "^0.6.11", - "core-js": "^3.8.2", - "global": "^4.4.0", - "lodash": "^4.17.21", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "unfetch": "^4.2.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "webpack": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/@types/html-minifier-terser": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/manager-webpack4/node_modules/@types/node": { - "version": "16.18.38", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/manager-webpack4/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/babel-loader": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "dev": true, - "license": "MIT", - "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/@storybook/manager-webpack4/node_modules/braces": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/cacache": { - "version": "15.3.0", - "dev": true, - "license": "ISC", - "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/@storybook/manager-webpack4/node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/clean-css": { - "version": "4.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/css-loader": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "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.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/css-loader/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/css-loader/node_modules/schema-utils": { - "version": "2.7.1", - "dev": true, - "license": "MIT", - "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/@storybook/manager-webpack4/node_modules/css-loader/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/define-property": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/enhanced-resolve": { - "version": "4.5.0", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/eslint-scope": { - "version": "4.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/file-loader": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "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/@storybook/manager-webpack4/node_modules/fill-range": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/html-minifier-terser": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "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" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/html-minifier-terser/node_modules/commander": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/html-minifier-terser/node_modules/terser": { - "version": "4.8.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/manager-webpack4/node_modules/html-webpack-plugin": { - "version": "4.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "engines": { - "node": ">=6.9" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/icss-utils": { - "version": "4.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss": "^7.0.14" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/is-extendable": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/is-plain-object": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/is-wsl": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/micromatch": { - "version": "3.1.10", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/mime": { - "version": "2.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/picocolors": { - "version": "0.2.1", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/manager-webpack4/node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/pkg-dir": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/pkg-dir/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/postcss": { - "version": "7.0.39", - "dev": true, - "license": "MIT", - "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/@storybook/manager-webpack4/node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss": "^7.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/postcss-modules-local-by-default": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/postcss-modules-scope": { - "version": "2.2.0", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/postcss-modules-values": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/pretty-error": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/renderkid": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/serialize-javascript": { - "version": "5.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/ssri": { - "version": "8.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/strip-ansi": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/style-loader": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/style-loader/node_modules/schema-utils": { - "version": "2.7.1", - "dev": true, - "license": "MIT", - "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/@storybook/manager-webpack4/node_modules/terser-webpack-plugin": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/terser-webpack-plugin/node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/to-regex-range": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/url-loader": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/watchpack": { - "version": "1.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack": { - "version": "4.46.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.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.3", - "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.7.4", - "webpack-sources": "^1.4.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - }, - "webpack-command": { - "optional": true - } - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack-dev-middleware": { - "version": "3.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack-virtual-modules": { - "version": "0.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/cacache": { - "version": "12.0.4", - "dev": true, - "license": "ISC", - "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" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/chownr": { - "version": "1.1.4", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/find-cache-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/make-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/schema-utils": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/serialize-javascript": { - "version": "4.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/ssri": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/terser": { - "version": "4.8.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/@storybook/manager-webpack4/node_modules/webpack/node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/manager-webpack4/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/manager-webpack5": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.10", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.5.16", - "@storybook/core-client": "6.5.16", - "@storybook/core-common": "6.5.16", - "@storybook/node-logger": "6.5.16", - "@storybook/theming": "6.5.16", - "@storybook/ui": "6.5.16", - "@types/node": "^14.0.10 || ^16.0.0", - "babel-loader": "^8.0.0", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "css-loader": "^5.0.1", - "express": "^4.17.1", - "find-up": "^5.0.0", - "fs-extra": "^9.0.1", - "html-webpack-plugin": "^5.0.0", - "node-fetch": "^2.6.7", - "process": "^0.11.10", - "read-pkg-up": "^7.0.1", - "regenerator-runtime": "^0.13.7", - "resolve-from": "^5.0.0", - "style-loader": "^2.0.0", - "telejson": "^6.0.8", - "terser-webpack-plugin": "^5.0.3", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "webpack": "^5.9.0", - "webpack-dev-middleware": "^4.1.0", - "webpack-virtual-modules": "^0.4.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/manager-webpack5/node_modules/@types/node": { - "version": "16.18.38", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/mdx1-csf": { - "version": "0.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/preset-env": "^7.12.11", - "@babel/types": "^7.12.11", - "@mdx-js/mdx": "^1.6.22", - "@types/lodash": "^4.14.167", - "js-string-escape": "^1.0.1", - "loader-utils": "^2.0.0", - "lodash": "^4.17.21", - "prettier": ">=2.2.1 <=2.3.0", - "ts-dedent": "^2.0.0" - } - }, - "node_modules/@storybook/mdx1-csf/node_modules/prettier": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@storybook/node-logger": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/npmlog": "^4.1.2", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "npmlog": "^5.0.1", - "pretty-hrtime": "^1.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/node-logger/node_modules/are-we-there-yet": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/node-logger/node_modules/gauge": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/node-logger/node_modules/npmlog": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/@storybook/node-logger/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/postinstall": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js": "^3.8.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/preview-api": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channel-postmessage": "7.0.27", - "@storybook/channels": "7.0.27", - "@storybook/client-logger": "7.0.27", - "@storybook/core-events": "7.0.27", - "@storybook/csf": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.0.27", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/preview-api/node_modules/@storybook/channel-postmessage": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.0.27", - "@storybook/client-logger": "7.0.27", - "@storybook/core-events": "7.0.27", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/preview-api/node_modules/@storybook/channels": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/preview-api/node_modules/@storybook/client-logger": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/preview-api/node_modules/@storybook/core-events": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/preview-api/node_modules/@storybook/csf": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^2.19.0" - } - }, - "node_modules/@storybook/preview-api/node_modules/telejson": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "memoizerific": "^1.11.3" - } - }, - "node_modules/@storybook/preview-web": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/channel-postmessage": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/store": "6.5.16", - "ansi-to-html": "^0.6.11", - "core-js": "^3.8.2", - "global": "^4.4.0", - "lodash": "^4.17.21", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "unfetch": "^4.2.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/react": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/preset-flow": "^7.12.1", - "@babel/preset-react": "^7.12.10", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@storybook/addons": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core": "6.5.16", - "@storybook/core-common": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/docs-tools": "6.5.16", - "@storybook/node-logger": "6.5.16", - "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.16", - "@types/estree": "^0.0.51", - "@types/node": "^14.14.20 || ^16.0.0", - "@types/webpack-env": "^1.16.0", - "acorn": "^7.4.1", - "acorn-jsx": "^5.3.1", - "acorn-walk": "^7.2.0", - "babel-plugin-add-react-displayname": "^0.0.5", - "babel-plugin-react-docgen": "^4.2.1", - "core-js": "^3.8.2", - "escodegen": "^2.0.0", - "fs-extra": "^9.0.1", - "global": "^4.4.0", - "html-tags": "^3.1.0", - "lodash": "^4.17.21", - "prop-types": "^15.7.2", - "react-element-to-jsx-string": "^14.3.4", - "react-refresh": "^0.11.0", - "read-pkg-up": "^7.0.1", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "webpack": ">=4.43.0 <6.0.0" - }, - "bin": { - "build-storybook": "bin/build.js", - "start-storybook": "bin/index.js", - "storybook-server": "bin/index.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@babel/core": "^7.11.5", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "require-from-string": "^2.0.2" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@storybook/builder-webpack4": { - "optional": true - }, - "@storybook/builder-webpack5": { - "optional": true - }, - "@storybook/manager-webpack4": { - "optional": true - }, - "@storybook/manager-webpack5": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin": { - "version": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "endent": "^2.0.1", - "find-cache-dir": "^3.3.1", - "flat-cache": "^3.0.4", - "micromatch": "^4.0.2", - "react-docgen-typescript": "^2.1.1", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "typescript": ">= 3.x", - "webpack": ">= 4" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/react/node_modules/@types/estree": { - "version": "0.0.51", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/react/node_modules/@types/node": { - "version": "16.18.38", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/react/node_modules/acorn": { - "version": "7.4.1", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@storybook/react/node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@storybook/router": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/semver": { - "version": "7.3.2", - "dev": true, - "license": "ISC", - "dependencies": { - "core-js": "^3.6.5", - "find-up": "^4.1.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/semver/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/source-loader": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "core-js": "^3.8.2", - "estraverse": "^5.2.0", - "global": "^4.4.0", - "loader-utils": "^2.0.4", - "lodash": "^4.17.21", - "prettier": ">=2.2.1 <=2.3.0", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/source-loader/node_modules/prettier": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@storybook/store": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "slash": "^3.0.0", - "stable": "^0.1.8", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/telemetry": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "6.5.16", - "@storybook/core-common": "6.5.16", - "chalk": "^4.1.0", - "core-js": "^3.8.2", - "detect-package-manager": "^2.0.1", - "fetch-retry": "^5.0.2", - "fs-extra": "^9.0.1", - "global": "^4.4.0", - "isomorphic-unfetch": "^3.1.0", - "nanoid": "^3.3.1", - "read-pkg-up": "^7.0.1", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/testing-library": { - "version": "0.0.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "^6.4.0 || >=6.5.0-0", - "@storybook/instrumenter": "^6.4.0 || >=6.5.0-0", - "@testing-library/dom": "^8.3.0", - "@testing-library/user-event": "^13.2.1", - "ts-dedent": "^2.2.0" - } - }, - "node_modules/@storybook/testing-library/node_modules/@storybook/client-logger": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/theming": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/types": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.0.27", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/types/node_modules/@storybook/channels": { - "version": "7.0.27", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/ui": { - "version": "6.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addons": "6.5.16", - "@storybook/api": "6.5.16", - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/components": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/router": "6.5.16", - "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "resolve-from": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@testing-library/dom": { - "version": "8.20.1", - "dev": true, - "license": "MIT", - "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/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/dom/node_modules/pretty-format": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "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/@testing-library/jest-dom": { - "version": "5.16.5", - "license": "MIT", - "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/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "10.4.9", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.3", - "@testing-library/dom": "^7.22.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@testing-library/react-hooks": { - "version": "7.0.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@types/react": ">=16.9.0", - "@types/react-dom": ">=16.9.0", - "@types/react-test-renderer": ">=16.9.0", - "react-error-boundary": "^3.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0", - "react-test-renderer": ">=16.9.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-test-renderer": { - "optional": true - } - } - }, - "node_modules/@testing-library/react/node_modules/@testing-library/dom": { - "version": "7.31.2", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^4.2.2", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.6", - "lz-string": "^1.4.4", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@testing-library/react/node_modules/@types/aria-query": { - "version": "4.2.2", - "license": "MIT" - }, - "node_modules/@testing-library/react/node_modules/aria-query": { - "version": "4.2.2", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@testing-library/user-event": { - "version": "13.5.0", - "dev": true, - "license": "MIT", - "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", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.1", - "license": "MIT", - "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.6.4", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/@types/eslint": { - "version": "8.44.0", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.17", - "license": "MIT", - "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": "4.17.35", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/glob": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/hast": { - "version": "2.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.11", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/is-function": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.3", - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/types": { - "version": "29.6.1", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/@types/yargs": { - "version": "17.0.24", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/expect": { - "version": "29.6.1", - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.6.1", - "@types/node": "*", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-diff": { - "version": "29.6.1", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-get-type": { - "version": "29.4.3", - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-matcher-utils": { - "version": "29.6.1", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.6.1", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-message-util": { - "version": "29.6.1", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-util": { - "version": "29.6.1", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.6.1", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/react-is": { - "version": "18.2.0", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.14.195", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/long": { - "version": "3.0.32", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "3.0.12", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "license": "MIT" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "license": "MIT" - }, - "node_modules/@types/morgan": { - "version": "1.9.4", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.4.2", - "license": "MIT" - }, - "node_modules/@types/node-fetch": { - "version": "2.6.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "license": "MIT" - }, - "node_modules/@types/npmlog": { - "version": "4.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/@types/parse5": { - "version": "5.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "license": "MIT" - }, - "node_modules/@types/pretty-hrtime": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "16.14.43", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.43.tgz", - "integrity": "sha512-7zdjv7jvoLLQg1tTvpQsm+hyNUMT2mPlNV1+d0I8fbGhkJl82spopMyBlu4wb1dviZAxpGdk5eHu/muacknnfw==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "16.9.19", - "license": "MIT", - "dependencies": { - "@types/react": "^16" - } - }, - "node_modules/@types/react-test-renderer": { - "version": "18.0.0", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.6", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "license": "MIT" - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.1", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.2", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static/node_modules/@types/mime": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/source-list-map": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/@types/tapable": { - "version": "1.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.8", - "license": "MIT", - "dependencies": { - "@types/jest": "*" - } - }, - "node_modules/@types/traverse": { - "version": "0.6.32", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/uglify-js": { - "version": "3.17.1", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/@types/unist": { - "version": "2.0.7", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/webpack": { - "version": "4.41.33", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "anymatch": "^3.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@types/webpack-env": { - "version": "1.18.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/webpack-sources": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - } - }, - "node_modules/@types/webpack-sources/node_modules/source-map": { - "version": "0.7.4", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/ws": { - "version": "8.5.5", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "15.0.15", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "license": "MIT", - "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/eslint-plugin/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "license": "BSD-2-Clause", - "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/parser/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "license": "MIT", - "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", - "license": "MIT", - "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/type-utils/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "license": "MIT", - "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", - "license": "BSD-2-Clause", - "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/typescript-estree/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "license": "MIT", - "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/visitor-keys": { - "version": "5.62.0", - "license": "MIT", - "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/@webassemblyjs/ast": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "license": "MIT", - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "license": "MIT", - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "license": "Apache-2.0" - }, - "node_modules/abab": { - "version": "2.0.6", - "license": "BSD-3-Clause" - }, - "node_modules/abbrev": { - "version": "2.0.0", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/agentkeepalive": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/agentkeepalive/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agentkeepalive/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/airbnb-js-shims": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "array.prototype.flatmap": "^1.2.1", - "es5-shim": "^4.5.13", - "es6-shim": "^0.35.5", - "function.prototype.name": "^1.1.0", - "globalthis": "^1.0.0", - "object.entries": "^1.1.0", - "object.fromentries": "^2.0.0 || ^1.0.0", - "object.getownpropertydescriptors": "^2.0.3", - "object.values": "^1.1.0", - "promise.allsettled": "^1.0.0", - "promise.prototype.finally": "^3.1.0", - "string.prototype.matchall": "^4.0.0 || ^3.0.1", - "string.prototype.padend": "^3.0.0", - "string.prototype.padstart": "^3.0.0", - "symbol.prototype.description": "^1.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": ">=5.0.0" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ajv/node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-colors": { - "version": "3.2.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-styles/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ansi-styles/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/ansi-to-html": { - "version": "0.6.15", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^2.0.0" - }, - "bin": { - "ansi-to-html": "bin/ansi-to-html" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ansi-to-html/node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-root-dir": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/aproba": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/archy": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/aria-query": { - "version": "5.3.0", - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/array-ify": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/array-includes": { - "version": "3.1.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.map": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/assert": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ast-types": { - "version": "0.14.2", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "license": "ISC" - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async-each": { - "version": "1.0.6", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "license": "(MIT OR Apache-2.0)", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "9.8.8", - "dev": true, - "license": "MIT", - "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" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - }, - "node_modules/autoprefixer/node_modules/picocolors": { - "version": "0.2.1", - "dev": true, - "license": "ISC" - }, - "node_modules/autoprefixer/node_modules/postcss": { - "version": "7.0.39", - "dev": true, - "license": "MIT", - "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/available-typed-arrays": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.2", - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "0.25.0", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.7" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/babel-jest": { - "version": "26.6.3", - "license": "MIT", - "dependencies": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "license": "MIT", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "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/schema-utils": { - "version": "2.7.1", - "license": "MIT", - "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-add-react-displayname": { - "version": "0.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@babel/core": "^7.11.6" - } - }, - "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-plugin-extract-import-names": { - "version": "1.6.22", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "license": "BSD-3-Clause", - "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": "26.6.2", - "license": "MIT", - "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.14.2" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/babel-plugin-named-exports-order": { - "version": "0.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-react-docgen": { - "version": "4.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.14.2", - "lodash": "^4.17.15", - "react-docgen": "^5.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/bail": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/base": { - "version": "0.11.2", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/batch": { - "version": "0.6.1", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "license": "Apache-2.0" - }, - "node_modules/better-opn": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "open": "^7.0.3" - }, - "engines": { - "node": ">8.0.0" - } - }, - "node_modules/better-opn/node_modules/open": { - "version": "7.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/big-integer": { - "version": "1.6.51", - "dev": true, - "license": "Unlicense", - "optional": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/bin-links": { - "version": "4.0.2", - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "dev": true, - "license": "MIT" - }, - "node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.1", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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.1", - "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/qs": { - "version": "6.11.0", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/bonjour-service/node_modules/array-flatten": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "license": "MIT" - }, - "node_modules/boxen": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bplist-parser": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "big-integer": "^1.6.7" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/browser-assert": { - "version": "1.2.1", - "dev": true - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "license": "BSD-2-Clause" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "5.2.1", - "license": "MIT" - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "license": "ISC", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.2.1", - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.21.9", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/builtins": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/c8": { - "version": "7.14.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/c8/node_modules/cliui": { - "version": "7.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/c8/node_modules/foreground-child": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/c8/node_modules/v8-to-istanbul": { - "version": "9.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/c8/node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "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/cacache": { - "version": "17.1.3", - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.3", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/glob/node_modules/minipass": { - "version": "7.0.2", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/unique-filename": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "license": "MIT", - "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-lite": { - "version": "1.0.30001515", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/capture-exit": { - "version": "2.0.0", - "license": "ISC", - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/cardinal": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ccount": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/character-entities": { - "version": "1.2.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chart.js": { - "version": "3.6.2", - "license": "MIT" - }, - "node_modules/chartjs-plugin-datalabels": { - "version": "2.0.0", - "license": "MIT", - "peerDependencies": { - "chart.js": "^3.0.0" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.1.0", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio/node_modules/htmlparser2": { - "version": "8.0.2", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cidr-regex": { - "version": "3.1.1", - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/cjs-module-lexer": { - "version": "0.6.0", - "license": "MIT" - }, - "node_modules/class-utils": { - "version": "0.3.6", - "license": "MIT", - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-css": { - "version": "5.3.2", - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-columns": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "5.1.2", - "license": "MIT", - "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/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmd-shim": { - "version": "6.0.1", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collapse-white-space": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/color-support": { - "version": "1.1.3", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/colorette": { - "version": "2.0.20", - "license": "MIT" - }, - "node_modules/columnify": { - "version": "1.6.0", - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/commondir": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/compare-func": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/compressible": { - "version": "2.0.18", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression-webpack-plugin": { - "version": "9.2.0", - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/compression-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/compression-webpack-plugin/node_modules/ajv-formats": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/compression-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/compression-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "license": "MIT" - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "license": "ISC" - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "5.0.0", - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "license": "MIT", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "license": "MIT", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.4.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.6", - "license": "MIT", - "dependencies": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "dev": true, - "license": "ISC", - "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" - } - }, - "node_modules/copy-concurrently/node_modules/aproba": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/copy-concurrently/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-formats": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.31.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.31.1", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.9" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.31.1", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "8.2.0", - "license": "MIT", - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/cp-file": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "nested-error-stacks": "^2.0.0", - "p-event": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cpy": { - "version": "8.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "arrify": "^2.0.1", - "cp-file": "^7.0.0", - "globby": "^9.2.0", - "has-glob": "^1.0.0", - "junk": "^3.1.0", - "nested-error-stacks": "^2.1.0", - "p-all": "^2.1.0", - "p-filter": "^2.1.0", - "p-map": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cpy/node_modules/@nodelib/fs.stat": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/cpy/node_modules/@types/glob": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/cpy/node_modules/array-union": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/arrify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cpy/node_modules/braces": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/define-property": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/dir-glob": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cpy/node_modules/fast-glob": { - "version": "2.2.7", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/cpy/node_modules/fill-range": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/glob-parent": { - "version": "3.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/cpy/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/globby": { - "version": "9.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cpy/node_modules/globby/node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cpy/node_modules/ignore": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/cpy/node_modules/is-extendable": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/is-plain-object": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/micromatch": { - "version": "3.1.10", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cpy/node_modules/p-map": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cpy/node_modules/path-type": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cpy/node_modules/slash": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cpy/node_modules/to-regex-range": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "license": "MIT", - "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" - }, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-loader": { - "version": "5.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "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/node_modules/dom-serializer": { - "version": "1.4.1", - "license": "MIT", - "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/css-select/node_modules/domhandler": { - "version": "4.3.1", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/css-select/node_modules/domutils": { - "version": "2.8.0", - "license": "BSD-2-Clause", - "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/css-select/node_modules/entities": { - "version": "2.2.0", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/css-vendor": { - "version": "2.0.8", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "license": "MIT" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.1.2", - "license": "MIT" - }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cyclist": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "license": "BSD-2-Clause" - }, - "node_modules/dargs": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/data-urls": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/decamelize": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "license": "MIT", - "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", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "license": "MIT" - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-equal": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.1", - "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.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bplist-parser": "^0.1.0", - "meow": "^3.1.0", - "untildify": "^2.0.0" - }, - "bin": { - "default-browser-id": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/camelcase": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/camelcase-keys": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/find-up": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/default-browser-id/node_modules/indent-string": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/load-json-file": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/map-obj": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/meow": { - "version": "3.7.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "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/default-browser-id/node_modules/parse-json": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/path-exists": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/path-type": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/pify": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/read-pkg": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/read-pkg-up": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/redent": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/default-browser-id/node_modules/strip-bom": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/strip-indent": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id/node_modules/trim-newlines": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/node_modules/npm-run-path": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-property": { - "version": "0.2.5", - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "0.1.4", - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "0.1.6", - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/kind-of": { - "version": "3.2.2", - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/depd": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "license": "ISC" - }, - "node_modules/dequal": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detab": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "repeat-string": "^1.5.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/detect-package-manager": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/detect-package-manager/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/detect-package-manager/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/detect-package-manager/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detect-package-manager/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-package-manager/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-port": { - "version": "1.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, - "node_modules/detect-port/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/detect-port/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/diff": { - "version": "4.0.2", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.4.3", - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/dns-packet": { - "version": "5.6.0", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "license": "MIT" - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-walk": { - "version": "0.1.2", - "dev": true - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domexception": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/domhandler": { - "version": "5.0.3", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "5.0.1", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.6.0" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/duplexer": { - "version": "0.1.2", - "license": "MIT" - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexify": { - "version": "3.7.1", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.461", - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "license": "MIT", - "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" - } - }, - "node_modules/emittery": { - "version": "0.7.2", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/endent": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "dedent": "^0.7.0", - "fast-json-parse": "^1.0.3", - "objectorarray": "^1.0.5" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/enhanced-resolve/node_modules/tapable": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-ci": { - "version": "8.0.0", - "license": "MIT", - "dependencies": { - "execa": "^6.1.0", - "java-properties": "^1.0.2" - }, - "engines": { - "node": "^16.10 || >=18" - } - }, - "node_modules/env-ci/node_modules/execa": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/env-ci/node_modules/human-signals": { - "version": "3.0.1", - "license": "Apache-2.0", - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/env-ci/node_modules/mimic-fn": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/onetime": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/envinfo": { - "version": "7.10.0", - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "license": "MIT" - }, - "node_modules/errno": { - "version": "0.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-abstract": { - "version": "1.21.3", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-module-lexer": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-shim": { - "version": "4.6.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/es6-shim": { - "version": "0.35.8", - "dev": true, - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "license": "BSD-2-Clause", - "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/eslint": { - "version": "8.45.0", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "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-airbnb": { - "version": "19.0.4", - "license": "MIT", - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - }, - "engines": { - "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "license": "MIT", - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "license": "MIT", - "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", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.9.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/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.1", - "license": "BSD-2-Clause", - "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/node_modules/globals": { - "version": "13.20.0", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "license": "BSD-2-Clause", - "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", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-to-babel": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.1.6", - "@babel/types": "^7.2.0", - "c8": "^7.6.0" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-stream": { - "version": "3.3.4", - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "node_modules/event-stream/node_modules/split": { - "version": "0.3.3", - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/exec-sh": { - "version": "0.3.6", - "license": "MIT" - }, - "node_modules/execa": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "license": "Apache-2.0" - }, - "node_modules/express": { - "version": "4.18.2", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.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" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express-static-gzip": { - "version": "2.1.7", - "license": "MIT", - "dependencies": { - "serve-static": "^1.14.1" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-parse": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "license": "MIT" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fetch-retry": { - "version": "5.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "dev": true, - "license": "ISC" - }, - "node_modules/figures": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-system-cache": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fs-extra": "11.1.1", - "ramda": "0.29.0" - } - }, - "node_modules/file-system-cache/node_modules/fs-extra": { - "version": "11.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/fill-range": { - "version": "7.0.1", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/filter-obj": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "license": "MIT", - "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", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up/node_modules/locate-path": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up/node_modules/p-limit": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up/node_modules/p-locate": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-versions": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "semver-regex": "^4.0.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "license": "ISC" - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/focus-lock": { - "version": "0.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/focus-lock/node_modules/tslib": { - "version": "1.14.1", - "dev": true, - "license": "0BSD" - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "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.0.2", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.3.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">=12.13.0", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "typescript": ">3.6.0", - "vue-template-compiler": "*", - "webpack": "^5.11.0" - }, - "peerDependenciesMeta": { - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "10.1.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "license": "MIT", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from": { - "version": "0.1.7", - "license": "MIT" - }, - "node_modules/from2": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "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/fs-minipass": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.4", - "license": "Unlicense" - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "license": "ISC", - "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/gensync": { - "version": "1.0.0-beta.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stdin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/git-log-parser": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } - }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "license": "MIT", - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "dev": true, - "license": "ISC" - }, - "node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "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", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-promise": { - "version": "3.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@types/glob": "*" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "glob": "*" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "license": "BSD-2-Clause" - }, - "node_modules/global": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "node_modules/global-dirs": { - "version": "0.1.1", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "license": "MIT", - "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/gopd": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/graphql": { - "version": "15.8.0", - "license": "MIT", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/growly": { - "version": "1.3.0", - "license": "MIT", - "optional": true - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/handlebars": { - "version": "4.7.7", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-glob": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-glob": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-glob/node_modules/is-glob": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "license": "ISC" - }, - "node_modules/has-value": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hast-to-hyperscript": { - "version": "9.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw/node_modules/parse5": { - "version": "6.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/hast-util-to-parse5": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/headers-utils": { - "version": "1.2.5", - "license": "MIT" - }, - "node_modules/history": { - "version": "4.10.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/hook-std": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hosted-git-info": { - "version": "6.1.1", - "license": "ISC", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "2.4.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "license": "MIT" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "license": "MIT", - "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-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-void-elements": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.3", - "license": "MIT", - "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": { - "webpack": "^5.20.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/tapable": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/dom-serializer": { - "version": "1.4.1", - "license": "MIT", - "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/htmlparser2/node_modules/domhandler": { - "version": "4.3.1", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domutils": { - "version": "2.8.0", - "license": "BSD-2-Clause", - "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/htmlparser2/node_modules/entities": { - "version": "2.2.0", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "license": "BSD-2-Clause" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "license": "MIT", - "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.8", - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "license": "MIT", - "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": "7.0.0", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "license": "MIT", - "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/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "4.3.1", - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/husky": { - "version": "8.0.3", - "license": "MIT", - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/hyphenate-style-name": { - "version": "1.0.4", - "license": "BSD-3-Clause" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/iferr": { - "version": "0.1.5", - "dev": true, - "license": "MIT" - }, - "node_modules/ignore": { - "version": "5.2.4", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.3", - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "license": "MIT", - "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", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "license": "ISC" - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "license": "ISC" - }, - "node_modules/init-package-json": { - "version": "5.0.0", - "license": "ISC", - "dependencies": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/into-stream": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute-url": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "license": "MIT" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/is-cidr": { - "version": "4.0.2", - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-dom": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-object": "^1.0.1", - "is-window": "^1.0.2" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finite": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-function": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-in-browser": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/is-map": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-object": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-whitespace-character": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-window": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/is-windows": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-word-character": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isomorphic-unfetch": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" - } - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "license": "BSD-3-Clause", - "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", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "license": "BSD-3-Clause", - "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/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/iterate-value": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jackspeak": { - "version": "2.2.1", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/java-properties": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/jest": { - "version": "26.6.3", - "license": "MIT", - "dependencies": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-changed-files": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-changed-files/node_modules/execa": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/human-signals": { - "version": "1.1.1", - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/jest-changed-files/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/npm-run-path": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/strip-final-newline": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-cli": { - "version": "26.6.3", - "license": "MIT", - "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/jest-cli/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/y18n": { - "version": "4.0.3", - "license": "ISC" - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "15.4.1", - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.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": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "18.1.3", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-config": { - "version": "26.6.3", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-diff/node_modules/diff-sequences": { - "version": "26.6.2", - "license": "MIT", - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-docblock": { - "version": "26.0.0", - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-each": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-environment-node": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-get-type": { - "version": "26.3.0", - "license": "MIT", - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-haste-map": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "fsevents": "^2.1.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "26.6.3", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-matcher-utils": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-message-util": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-mock": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "26.0.0", - "license": "MIT", - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "26.6.3", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runner": { - "version": "26.6.3", - "license": "MIT", - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runtime": { - "version": "26.6.3", - "license": "MIT", - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runtime/node_modules/cliui": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/jest-runtime/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/wrap-ansi": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/y18n": { - "version": "4.0.3", - "license": "ISC" - }, - "node_modules/jest-runtime/node_modules/yargs": { - "version": "15.4.1", - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.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": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/yargs-parser": { - "version": "18.1.3", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-serializer": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-transformer-svg": { - "version": "2.0.1", - "license": "MIT", - "peerDependencies": { - "jest": ">= 28.1.0", - "react": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/jest-util": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-validate": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/joi": { - "version": "17.9.2", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js-yaml/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "license": "MIT", - "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", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/http-proxy-agent": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/jsdom/node_modules/parse5": { - "version": "6.0.1", - "license": "MIT" - }, - "node_modules/jsdom/node_modules/ws": { - "version": "7.5.9", - "license": "MIT", - "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/jsesc": { - "version": "2.5.2", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/json-stringify-nice": { - "version": "1.1.4", - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "license": "ISC" - }, - "node_modules/json5": { - "version": "2.2.3", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jss": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" - } - }, - "node_modules/jss-plugin-camel-case": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-default-unit": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-global": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-nested": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-props-sort": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-rule-value-function": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.4", - "license": "MIT", - "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/junk": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/just-diff": { - "version": "6.0.2", - "license": "MIT" - }, - "node_modules/just-diff-apply": { - "version": "5.5.0", - "license": "MIT" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/launch-editor": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" - } - }, - "node_modules/lazy-universal-dotenv": { - "version": "3.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.5.0", - "app-root-dir": "^1.0.2", - "core-js": "^3.0.4", - "dotenv": "^8.0.0", - "dotenv-expand": "^5.1.0" - }, - "engines": { - "node": ">=6.0.0", - "npm": ">=6.0.0", - "yarn": ">=1.0.0" - } - }, - "node_modules/lazy-universal-dotenv/node_modules/dotenv": { - "version": "8.6.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libnpmaccess": { - "version": "7.0.2", - "license": "ISC", - "dependencies": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmdiff": { - "version": "5.0.19", - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.3.0", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^9.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmdiff/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/libnpmdiff/node_modules/diff": { - "version": "5.1.0", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/libnpmdiff/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/libnpmexec": { - "version": "6.0.3", - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.3.0", - "@npmcli/run-script": "^6.0.0", - "ci-info": "^3.7.1", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmfund": { - "version": "4.0.19", - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.3.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmhook": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmorg": { - "version": "5.0.4", - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmpack": { - "version": "5.0.19", - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.3.0", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmpublish": { - "version": "7.5.0", - "license": "ISC", - "dependencies": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.4.0", - "ssri": "^10.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmsearch": { - "version": "6.0.2", - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmteam": { - "version": "5.0.3", - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmversion": { - "version": "4.0.2", - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/lint-staged": { - "version": "13.2.3", - "license": "MIT", - "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "10.0.1", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/lint-staged/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/lint-staged/node_modules/execa": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/mimic-fn": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.1", - "license": "ISC", - "engines": { - "node": ">= 14" - } - }, - "node_modules/listr2": { - "version": "5.0.8", - "license": "MIT", - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-runner": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "license": "MIT", - "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": "5.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "license": "MIT" - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "license": "MIT" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "license": "MIT" - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "license": "MIT" - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "license": "MIT" - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "license": "MIT" - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "license": "MIT" - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "license": "MIT" - }, - "node_modules/lodash.upperfirst": { - "version": "4.3.1", - "license": "MIT" - }, - "node_modules/log-update": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/long": { - "version": "4.0.0", - "license": "Apache-2.0" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loud-rejection": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "license": "MIT", - "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", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "license": "ISC" - }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "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": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/map-or-similar": { - "version": "1.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/map-stream": { - "version": "0.1.0" - }, - "node_modules/map-visit": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-escapes": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.3.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.3.0", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/marked-terminal/node_modules/type-fest": { - "version": "3.13.1", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/mdast-squeeze-paragraphs": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "unist-util-remove": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mem": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" - } - }, - "node_modules/mem/node_modules/mimic-fn": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memoizerific": { - "version": "1.11.3", - "dev": true, - "license": "MIT", - "dependencies": { - "map-or-similar": "^1.5.0" - } - }, - "node_modules/memory-fs": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "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/hosted-git-info": { - "version": "4.1.0", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "license": "BSD-2-Clause", - "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/meow/node_modules/type-fest": { - "version": "0.18.1", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/microevent.ts": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.5", - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/min-document": { - "version": "2.19.0", - "dev": true, - "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "license": "MIT" - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mississippi": { - "version": "3.0.0", - "dev": true, - "license": "BSD-2-Clause", - "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" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mississippi/node_modules/through2": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/morgan": { - "version": "1.10.0", - "license": "MIT", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "dev": true, - "license": "ISC", - "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" - } - }, - "node_modules/move-concurrently/node_modules/aproba": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/move-concurrently/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "node_modules/msw": { - "version": "0.24.4", - "license": "MIT", - "dependencies": { - "@open-draft/until": "^1.0.3", - "@types/cookie": "^0.4.0", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cookie": "^0.4.1", - "graphql": "^15.4.0", - "headers-utils": "^1.2.0", - "node-fetch": "^2.6.1", - "node-match-path": "^0.6.0", - "node-request-interceptor": "^0.5.3", - "statuses": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "msw": "cli/index.js" - } - }, - "node_modules/msw/node_modules/cliui": { - "version": "7.0.4", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/msw/node_modules/cookie": { - "version": "0.4.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/msw/node_modules/yargs": { - "version": "16.2.0", - "license": "MIT", - "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/multicast-dns": { - "version": "7.2.5", - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/mylas": { - "version": "2.1.13", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/raouldeheer" - } - }, - "node_modules/nan": { - "version": "2.17.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/nanoid": { - "version": "3.3.6", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/define-property": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-extendable": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "license": "MIT" - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/nested-error-stacks": { - "version": "2.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "license": "MIT" - }, - "node_modules/no-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "license": "MIT" - }, - "node_modules/node-cleanup": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/node-dir": { - "version": "0.1.17", - "dev": true, - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.6.12", - "license": "MIT", - "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-fetch/node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "9.4.0", - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.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-gyp/node_modules/abbrev": { - "version": "1.1.1", - "license": "ISC" - }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "license": "ISC", - "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/node-gyp/node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "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_modules/node-libs-browser/node_modules/buffer": { - "version": "4.9.2", - "dev": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/node-libs-browser/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/node-libs-browser/node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/node-libs-browser/node_modules/path-browserify": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/node-libs-browser/node_modules/util": { - "version": "0.11.1", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/node-match-path": { - "version": "0.6.3", - "license": "MIT" - }, - "node_modules/node-notifier": { - "version": "8.0.2", - "license": "MIT", - "optional": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node_modules/node-notifier/node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "optional": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/node-polyfill-webpack-plugin": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "assert": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^6.0.3", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^4.22.0", - "events": "^3.3.0", - "filter-obj": "^2.0.2", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "punycode": "^2.1.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^4.0.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.12", - "tty-browserify": "^0.0.1", - "type-fest": "^2.14.0", - "url": "^0.11.0", - "util": "^0.12.4", - "vm-browserify": "^1.1.2" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "webpack": ">=5" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/assert": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/domain-browser": { - "version": "4.22.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/readable-stream": { - "version": "4.4.2", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/stream-browserify": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/stream-http": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/tty-browserify": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.13", - "license": "MIT" - }, - "node_modules/node-request-interceptor": { - "version": "0.5.9", - "license": "MIT", - "dependencies": { - "@open-draft/until": "^1.0.3", - "debug": "^4.3.0", - "headers-utils": "^1.2.0" - } - }, - "node_modules/node-request-interceptor/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/node-request-interceptor/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/nopt": { - "version": "7.2.0", - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "9.8.1", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "semver", - "sigstore", - "ssri", - "supports-color", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "license": "Artistic-2.0", - "workspaces": [ - "docs", - "smoke-tests", - "mock-globals", - "mock-registry", - "workspaces/*" - ], - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.3.0", - "@npmcli/config": "^6.2.1", - "@npmcli/fs": "^3.1.0", - "@npmcli/map-workspaces": "^3.0.4", - "@npmcli/package-json": "^4.0.1", - "@npmcli/promise-spawn": "^6.0.2", - "@npmcli/run-script": "^6.0.2", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^17.1.3", - "chalk": "^5.3.0", - "ci-info": "^3.8.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.2", - "glob": "^10.2.7", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.1", - "ini": "^4.1.1", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.19", - "libnpmexec": "^6.0.3", - "libnpmfund": "^4.0.19", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.4", - "libnpmpack": "^5.0.19", - "libnpmpublish": "^7.5.0", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.3", - "minipass": "^5.0.0", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^9.4.0", - "nopt": "^7.2.0", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.1.1", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.5", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.2.0", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "semver": "^7.5.4", - "sigstore": "^1.7.0", - "ssri": "^10.0.4", - "supports-color": "^9.4.0", - "tar": "^6.1.15", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.1", - "write-file-atomic": "^5.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-audit-report": { - "version": "5.0.0", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-install-checks": { - "version": "6.1.1", - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.1", - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-profile": { - "version": "7.0.1", - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-user-validate": { - "version": "2.0.0", - "license": "BSD-2-Clause", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "4.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.1.0", - "glob": "^10.2.2", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "proc-log": "^3.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "1.0.3", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "10.3.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/glob/node_modules/minipass": { - "version": "7.0.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/ini": { - "version": "4.1.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "9.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/sigstore": { - "version": "1.8.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^1.0.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "9.4.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/npmlog": { - "version": "7.0.1", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npmlog/node_modules/are-we-there-yet": { - "version": "4.0.0", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npmlog/node_modules/gauge": { - "version": "5.0.1", - "license": "ISC", - "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": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npmlog/node_modules/readable-stream": { - "version": "4.4.2", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/npmlog/node_modules/signal-exit": { - "version": "4.0.2", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/num2fraction": { - "version": "1.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", - "safe-array-concat": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/objectorarray": { - "version": "1.0.5", - "dev": true, - "license": "ISC" - }, - "node_modules/obuf": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "license": "MIT", - "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.3", - "license": "MIT", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "license": "MIT" - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-all": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-all/node_modules/p-map": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-defer": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-event": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-filter/node_modules/p-map": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-reduce": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pacote": { - "version": "15.2.0", - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "license": "(MIT AND Zlib)" - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "license": "ISC", - "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" - } - }, - "node_modules/parse-conflict-json": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "license": "MIT", - "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/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/parse5": { - "version": "7.1.2", - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.0", - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.2", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pause-stream": { - "version": "0.0.11", - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "license": "MIT", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plimit-lit": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "queue-lit": "^1.5.0" - } - }, - "node_modules/pnp-webpack-plugin": { - "version": "1.6.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ts-pnp": "^1.1.6" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/polished": { - "version": "4.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.8" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/popper.js": { - "version": "1.16.1-lts", - "license": "MIT" - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "8.4.26", - "dev": true, - "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" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-flexbugs-fixes": { - "version": "4.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss": "^7.0.26" - } - }, - "node_modules/postcss-flexbugs-fixes/node_modules/picocolors": { - "version": "0.2.1", - "dev": true, - "license": "ISC" - }, - "node_modules/postcss-flexbugs-fixes/node_modules/postcss": { - "version": "7.0.39", - "dev": true, - "license": "MIT", - "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/postcss-modules-extract-imports": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "26.6.2", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/proc-log": { - "version": "3.0.0", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-call-limit": { - "version": "1.0.2", - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/promise.allsettled": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "array.prototype.map": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "iterate-value": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.prototype.finally": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/promzard": { - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "read": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "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", - "license": "MIT" - }, - "node_modules/property-information": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "license": "ISC" - }, - "node_modules/protobufjs": { - "version": "6.11.3", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/protobufjs/node_modules/@types/long": { - "version": "4.0.2", - "license": "MIT" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ps-tree": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "event-stream": "=3.3.4" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qrcode-terminal": { - "version": "0.12.0", - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/qs": { - "version": "6.11.2", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/queue-lit": { - "version": "1.5.0", - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ramda": { - "version": "0.29.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "license": "MIT", - "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/rc": { - "version": "1.2.8", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "16.14.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-docgen": { - "version": "5.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.7.5", - "@babel/generator": "^7.12.11", - "@babel/runtime": "^7.7.6", - "ast-types": "^0.14.2", - "commander": "^2.19.0", - "doctrine": "^3.0.0", - "estree-to-babel": "^3.1.0", - "neo-async": "^2.6.1", - "node-dir": "^0.1.10", - "strip-indent": "^3.0.0" - }, - "bin": { - "react-docgen": "bin/react-docgen.js" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/react-docgen-typescript": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">= 4.3.x" - } - }, - "node_modules/react-dom": { - "version": "16.14.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/react-element-to-jsx-string": { - "version": "14.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@base2/pretty-print-object": "1.0.1", - "is-plain-object": "5.0.0", - "react-is": "17.0.2" - }, - "peerDependencies": { - "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1", - "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1" - } - }, - "node_modules/react-error-boundary": { - "version": "3.1.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-ga4": { - "version": "1.4.1", - "license": "MIT" - }, - "node_modules/react-inspector": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.0.0", - "is-dom": "^1.0.0", - "prop-types": "^15.0.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "license": "MIT" - }, - "node_modules/react-merge-refs": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/react-refresh": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.8.0", - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/react-router/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/read": { - "version": "2.1.0", - "license": "ISC", - "dependencies": { - "mute-stream": "~1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-cmd-shim": { - "version": "4.0.0", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json": { - "version": "6.0.4", - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.3", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minipass": { - "version": "7.0.2", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/read-pkg": { - "version": "8.0.0", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^5.0.0", - "parse-json": "^7.0.0", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "license": "MIT", - "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", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/hosted-git-info": { - "version": "2.8.9", - "license": "ISC" - }, - "node_modules/read-pkg-up/node_modules/normalize-package-data": { - "version": "2.5.0", - "license": "BSD-2-Clause", - "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-up/node_modules/read-pkg": { - "version": "5.2.0", - "license": "MIT", - "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/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/lines-and-columns": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "3.13.1", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "license": "MIT", - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "license": "MIT" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "license": "MIT", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-external-links": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "extend": "^3.0.0", - "is-absolute-url": "^3.0.0", - "mdast-util-definitions": "^4.0.0", - "space-separated-tokens": "^1.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-footnotes": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "1.6.22", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "dev": true, - "license": "MIT" - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/remark-mdx/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/remark-mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remark-parse": { - "version": "8.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-slug": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "github-slugger": "^1.0.0", - "mdast-util-to-string": "^1.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-squeeze-paragraphs": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mdast-squeeze-paragraphs": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "license": "ISC" - }, - "node_modules/renderkid": { - "version": "3.0.0", - "license": "MIT", - "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/repeat-element": { - "version": "1.1.4", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.3", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.12.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", - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-global": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "license": "MIT", - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rsvp": { - "version": "4.8.5", - "license": "MIT", - "engines": { - "node": "6.* || >= 7.*" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-queue": { - "version": "1.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.1.1" - } - }, - "node_modules/run-queue/node_modules/aproba": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/rxjs": { - "version": "7.8.1", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/sane": { - "version": "4.1.0", - "license": "MIT", - "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" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "license": "ISC", - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/cross-spawn": { - "version": "6.0.5", - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/sane/node_modules/define-property": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/execa": { - "version": "1.0.0", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/get-stream": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/is-extendable": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-stream": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/normalize-path": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/npm-run-path": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/sane/node_modules/shebang-command": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/shebang-regex": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/to-regex-range": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/saxes": { - "version": "5.0.1", - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/scheduler": { - "version": "0.19.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "license": "MIT", - "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/select-hose": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semantic-release": { - "version": "21.0.0", - "license": "MIT", - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^10.0.2", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^4.0.1", - "cosmiconfig": "^8.0.0", - "debug": "^4.0.0", - "env-ci": "^8.0.0", - "execa": "^7.0.0", - "figures": "^5.0.0", - "find-versions": "^5.1.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^3.0.0", - "hosted-git-info": "^6.0.0", - "lodash-es": "^4.17.21", - "marked": "^4.1.0", - "marked-terminal": "^5.1.1", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-pkg-up": "^9.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^4.0.0", - "signale": "^1.2.1", - "yargs": "^17.5.1" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/semantic-release/node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/semantic-release/node_modules/@semantic-release/github": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-retry": "^4.1.3", - "@octokit/plugin-throttling": "^5.2.3", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/aggregate-error": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/hosted-git-info": { - "version": "2.8.9", - "license": "ISC" - }, - "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/normalize-package-data": { - "version": "2.5.0", - "license": "BSD-2-Clause", - "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/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg": { - "version": "5.2.0", - "license": "MIT", - "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/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg-up": { - "version": "7.0.1", - "license": "MIT", - "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/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/type-fest": { - "version": "0.6.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/agent-base": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/semantic-release/node_modules/aggregate-error": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/aggregate-error/node_modules/clean-stack": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/aggregate-error/node_modules/indent-string": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/semantic-release/node_modules/escape-string-regexp": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/execa": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/semantic-release/node_modules/find-up": { - "version": "6.3.0", - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/find-up/node_modules/locate-path": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/find-up/node_modules/path-exists": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/semantic-release/node_modules/fs-extra": { - "version": "11.1.1", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/semantic-release/node_modules/https-proxy-agent": { - "version": "7.0.1", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/semantic-release/node_modules/mimic-fn": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/semantic-release/node_modules/normalize-package-data": { - "version": "3.0.3", - "license": "BSD-2-Clause", - "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/semantic-release/node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "4.1.0", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semantic-release/node_modules/onetime": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/p-each-series": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/p-limit": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/p-locate": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/read-pkg": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/read-pkg-up": { - "version": "9.1.0", - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/yocto-queue": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-regex": { - "version": "4.0.5", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/send": { - "version": "0.18.0", - "license": "MIT", - "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/mime": { - "version": "1.6.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-favicon": { - "version": "2.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "etag": "~1.8.1", - "fresh": "0.5.2", - "ms": "2.1.1", - "parseurl": "~1.3.2", - "safe-buffer": "5.1.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-favicon/node_modules/ms": { - "version": "2.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/serve-favicon/node_modules/safe-buffer": { - "version": "5.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/serve-index": { - "version": "1.9.1", - "license": "MIT", - "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/depd": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "license": "MIT", - "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", - "license": "ISC" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "license": "ISC" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/set-value": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shellwords": { - "version": "0.1.1", - "license": "MIT", - "optional": true - }, - "node_modules/side-channel": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/signale": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sigstore": { - "version": "1.7.0", - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "@sigstore/tuf": "^1.0.1", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "license": "MIT", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socks-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" - } - }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "license": "MIT", - "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" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/space-separated-tokens": { - "version": "1.1.5", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "license": "CC0-1.0" - }, - "node_modules/spdy": { - "version": "4.0.2", - "license": "MIT", - "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", - "license": "MIT", - "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/spdy-transport/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy-transport/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spdy/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/split": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-extendable": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "license": "ISC", - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/ssri": { - "version": "10.0.4", - "license": "ISC", - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "dev": true, - "license": "MIT" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "dev": true, - "license": "MIT" - }, - "node_modules/state-toggle": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "license": "MIT", - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/store2": { - "version": "2.14.2", - "dev": true, - "license": "(MIT OR GPL-3.0)" - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "dev": true, - "license": "MIT", - "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" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "MIT" - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.padend": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.padstart": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-loader": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "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/style-to-object": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "license": "MIT" - }, - "node_modules/symbol.prototype.description": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-symbol-description": "^1.0.0", - "has-symbols": "^1.0.2", - "object.getownpropertydescriptors": "^2.1.2" - }, - "engines": { - "node": ">= 0.11.15" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synchronous-promise": { - "version": "2.0.17", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/tapable": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.1.15", - "license": "ISC", - "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/fs-minipass": { - "version": "2.1.0", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/telejson": { - "version": "6.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/is-function": "^1.0.0", - "global": "^4.4.0", - "is-function": "^1.0.2", - "is-regex": "^1.1.2", - "is-symbol": "^1.0.3", - "isobject": "^4.0.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3" - } - }, - "node_modules/telejson/node_modules/isobject": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/temp-dir": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/tempy": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^3.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "license": "MIT", - "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.19.0", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "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.9", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "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-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/throat": { - "version": "5.0.0", - "license": "MIT" - }, - "node_modules/through": { - "version": "2.3.8", - "license": "MIT" - }, - "node_modules/through2": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "license": "MIT" - }, - "node_modules/tiny-relative-date": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/tmpl": { - "version": "1.0.5", - "license": "BSD-3-Clause" - }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/to-regex/node_modules/define-property": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-extendable": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "license": "BSD-3-Clause", - "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", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/traverse": { - "version": "0.6.7", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/treeverse": { - "version": "3.0.0", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/trim": { - "version": "0.0.1", - "dev": true - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/trim-trailing-lines": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/ts-jest": { - "version": "26.5.6", - "license": "MIT", - "dependencies": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "jest": ">=26 <27", - "typescript": ">=3.8 <5.0" - } - }, - "node_modules/ts-jest/node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-loader": { - "version": "9.4.4", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-node": { - "version": "8.10.2", - "license": "MIT", - "dependencies": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-pnp": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tsc-alias": { - "version": "1.8.7", - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.3", - "commander": "^9.0.0", - "globby": "^11.0.4", - "mylas": "^2.1.9", - "normalize-path": "^3.0.0", - "plimit-lit": "^1.2.6" - }, - "bin": { - "tsc-alias": "dist/bin/index.js" - } - }, - "node_modules/tsc-alias/node_modules/commander": { - "version": "9.5.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/tsc-watch": { - "version": "6.0.4", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "node-cleanup": "^2.1.2", - "ps-tree": "^1.2.0", - "string-argv": "^0.3.1" - }, - "bin": { - "tsc-watch": "dist/lib/tsc-watch.js" - }, - "engines": { - "node": ">=12.12.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "license": "MIT", - "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", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.6.0", - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "license": "MIT", - "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", - "license": "0BSD" - }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/tuf-js": { - "version": "1.1.7", - "license": "MIT", - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/tuf-js/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/type-check": { - "version": "0.4.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unfetch": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/unherit": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "license": "MIT", - "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.1.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "9.2.0", - "dev": true, - "license": "MIT", - "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" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unified/node_modules/is-buffer": { - "version": "2.0.5", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified/node_modules/is-plain-obj": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-filename/node_modules/unique-slug": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unist-builder": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-generated": { - "version": "1.1.6", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "license": "ISC" - }, - "node_modules/universalify": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "license": "MIT", - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/untildify": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "os-homedir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "license": "MIT" - }, - "node_modules/url": { - "version": "0.11.1", - "license": "MIT", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/url-parse": { - "version": "1.5.10", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "license": "MIT" - }, - "node_modules/use": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/use-force-update": { - "version": "1.0.11", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/CharlesStover" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-react-router": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "use-force-update": "^1.0.5" - }, - "peerDependencies": { - "react": "^16.8.0", - "react-router": "^5.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/util.promisify": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uuid-browser": { - "version": "3.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "7.1.2", - "license": "ISC", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.4", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "4.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile/node_modules/is-buffer": { - "version": "2.0.5", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wait-on": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "axios": "^0.25.0", - "joi": "^17.6.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.5.4" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/walk-up-path": { - "version": "3.0.1", - "license": "ISC" - }, - "node_modules/walker": { - "version": "1.0.8", - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "optional": true, - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "dev": true, - "license": "MIT", - "optional": true, - "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" - } - }, - "node_modules/watchpack-chokidar2/node_modules/define-property": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fsevents": { - "version": "1.2.13", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent": { - "version": "3.1.0", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-extendable": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-plain-object": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/micromatch": { - "version": "3.1.10", - "dev": true, - "license": "MIT", - "optional": true, - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readdirp": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-namespaces": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "5.88.1", - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "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.9", - "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": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.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-cli": { - "version": "4.10.0", - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "colorette": "^1.2.2", - "mem": "^8.1.1", - "memfs": "^3.2.2", - "mime-types": "^2.1.30", - "range-parser": "^1.2.1", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= v10.23.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/colorette": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", - "license": "MIT", - "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.1", - "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/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-formats": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "license": "MIT", - "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-hot-middleware": { - "version": "2.25.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-html-community": "0.0.8", - "html-entities": "^2.1.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/webpack-log": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-log/node_modules/uuid": { - "version": "3.4.0", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/webpack-merge": { - "version": "5.9.0", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-node-externals": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.4.6", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack/node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/webpack/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "license": "MIT" - }, - "node_modules/webpack/node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "license": "MIT" - }, - "node_modules/webpack/node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "license": "MIT" - }, - "node_modules/webpack/node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/webpack/node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/webpack/node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/webpack/node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "license": "MIT" - }, - "node_modules/webpack/node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/webpack/node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/webpack/node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/webpack/node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/webpack/node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/webpack/node_modules/loader-runner": { - "version": "4.3.0", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/webpack/node_modules/tapable": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.2.3", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "license": "Apache-2.0", - "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", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "license": "MIT", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "license": "MIT", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "license": "ISC" - }, - "node_modules/which-typed-array": { - "version": "1.1.10", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "~0.1.7" - } - }, - "node_modules/worker-rpc": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "microevent.ts": "~0.1.1" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.0.2", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ws": { - "version": "8.13.0", - "license": "MIT", - "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/x-default-browser": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "bin": { - "x-default-browser": "bin/x-default-browser.js" - }, - "optionalDependencies": { - "default-browser-id": "^1.0.4" - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "license": "Apache-2.0" - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", - "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/yargs-parser": { - "version": "20.2.9", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/common": { - "name": "@flyteorg/common", - "version": "0.0.4", - "license": "Apache-2.0" - }, - "packages/components": { - "name": "@flyteorg/components", - "version": "0.0.4", - "license": "Apache-2.0", - "dependencies": { - "@flyteorg/locale": "^0.0.2", - "@flyteorg/ui-atoms": "^0.0.4", - "@material-ui/core": "^4.0.0", - "@material-ui/icons": "^4.0.0", - "classnames": "^2.3.1" - }, - "devDependencies": { - "@types/react": "^16.9.34", - "@types/react-dom": "^16.9.7" - }, - "peerDependencies": { - "react": "^16.13.1", - "react-dom": "^16.13.1" - } - }, - "packages/components/node_modules/@babel/runtime": { - "version": "7.22.6", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/components/node_modules/@emotion/hash": { - "version": "0.8.0", - "license": "MIT" - }, - "packages/components/node_modules/@material-ui/core": { - "version": "4.12.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/components/node_modules/@material-ui/core/node_modules/react-is": { - "version": "17.0.2", - "license": "MIT" - }, - "packages/components/node_modules/@material-ui/icons": { - "version": "4.11.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@material-ui/core": "^4.0.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/components/node_modules/@material-ui/styles": { - "version": "4.11.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/components/node_modules/@material-ui/styles/node_modules/csstype": { - "version": "2.6.21", - "license": "MIT" - }, - "packages/components/node_modules/@material-ui/system": { - "version": "4.12.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/components/node_modules/@material-ui/system/node_modules/csstype": { - "version": "2.6.21", - "license": "MIT" - }, - "packages/components/node_modules/@material-ui/types": { - "version": "5.1.0", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/components/node_modules/@material-ui/utils": { - "version": "4.11.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "packages/components/node_modules/@material-ui/utils/node_modules/react-is": { - "version": "17.0.2", - "license": "MIT" - }, - "packages/components/node_modules/@types/react-dom": { - "version": "16.9.19", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "^16" - } - }, - "packages/components/node_modules/@types/react-transition-group": { - "version": "4.4.6", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "packages/components/node_modules/classnames": { - "version": "2.3.2", - "license": "MIT" - }, - "packages/components/node_modules/clsx": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/components/node_modules/css-vendor": { - "version": "2.0.8", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, - "packages/components/node_modules/csstype": { - "version": "3.1.2", - "license": "MIT" - }, - "packages/components/node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "packages/components/node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "packages/components/node_modules/hyphenate-style-name": { - "version": "1.0.4", - "license": "BSD-3-Clause" - }, - "packages/components/node_modules/is-in-browser": { - "version": "1.1.3", - "license": "MIT" - }, - "packages/components/node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "packages/components/node_modules/jss": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" - } - }, - "packages/components/node_modules/jss-plugin-camel-case": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "packages/components/node_modules/jss-plugin-default-unit": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "packages/components/node_modules/jss-plugin-global": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "packages/components/node_modules/jss-plugin-nested": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "packages/components/node_modules/jss-plugin-props-sort": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "packages/components/node_modules/jss-plugin-rule-value-function": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "packages/components/node_modules/jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" - } - }, - "packages/components/node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "packages/components/node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/components/node_modules/popper.js": { - "version": "1.16.1-lts", - "license": "MIT" - }, - "packages/components/node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "packages/components/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "packages/components/node_modules/react-transition-group": { - "version": "4.4.5", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "packages/components/node_modules/regenerator-runtime": { - "version": "0.13.11", - "license": "MIT" - }, - "packages/components/node_modules/tiny-warning": { - "version": "1.0.3", - "license": "MIT" - }, - "packages/console": { - "name": "@flyteorg/console", - "version": "0.0.47", - "license": "Apache-2.0", - "dependencies": { - "@date-io/moment": "1.3.9", - "@emotion/core": "10.1.1", - "@flyteorg/common": "^0.0.4", - "@flyteorg/components": "^0.0.4", - "@flyteorg/flyte-api": "^0.0.2", - "@flyteorg/flyteidl-types": "^0.0.4", - "@flyteorg/locale": "^0.0.2", - "@flyteorg/ui-atoms": "^0.0.4", - "@material-ui/core": "^4.12.4", - "@material-ui/icons": "^4.11.3", - "@material-ui/pickers": "^3.2.2", - "@rjsf/core": "^5.1.0", - "@rjsf/material-ui": "^5.1.0", - "@rjsf/utils": "^5.1.0", - "@rjsf/validator-ajv8": "^5.1.0", - "@types/d3-shape": "^1.2.6", - "@xstate/react": "^1.0.0", - "axios": "^0.27.2", - "chart.js": "3.6.2", - "chartjs-plugin-datalabels": "2.0.0", - "classnames": "^2.3.1", - "copy-to-clipboard": "^3.0.8", - "cronstrue": "^1.31.0", - "d3-dag": "^0.3.4", - "d3-shape": "^1.2.2", - "dagre": "0.8.5", - "dagre-d3": "^0.6.4", - "debug": "2.6.9", - "dom-helpers": "5.2.1", - "fuzzysort": "^1.1.1", - "intersection-observer": "^0.7.0", - "js-yaml": "^3.13.1", - "linkify-it": "^2.2.0", - "lodash": "^4.17.21", - "lossless-json": "^1.0.3", - "memoize-one": "^5.0.0", - "moment": "^2.29.4", - "moment-timezone": "^0.5.28", - "notistack": "^1.0.10", - "object-hash": "^1.3.1", - "prop-types": "15.6.0", - "query-string": "^6.5.0", - "react-chartjs-2": "^4.3.1", - "react-dropzone": "^14.2.3", - "react-flow-renderer": "10.3.8", - "react-ga4": "^1.4.1", - "react-intersection-observer": "^8.25.1", - "react-json-view": "^1.21.3", - "react-loading-skeleton": "^1.1.2", - "react-query": "3.3.0", - "react-query-devtools": "3.0.0-beta.1", - "react-virtualized": "^9.21.1", - "shallowequal": "^1.1.0", - "traverse": "^0.6.7", - "url-search-params": "^0.10.0", - "xstate": "4.33.6" - }, - "devDependencies": { - "@types/debug": "^0.0.30", - "@types/dom-helpers": "^5.0.1", - "@types/js-yaml": "^3.10.1", - "@types/linkify-it": "^2.1.0", - "@types/lodash": "^4.14.68", - "@types/long": "^3.0.32", - "@types/lossless-json": "^1.0.0", - "@types/memoize-one": "^4.1.0", - "@types/memory-fs": "^0.3.0", - "@types/moment-timezone": "^0.5.13", - "@types/object-hash": "^1.2.0", - "@types/pure-render-decorator": "^0.2.27", - "@types/react": "^16.9.34", - "@types/react-dom": "^16.9.7", - "@types/react-router-dom": "^5.3.3", - "@types/react-virtualized": "^9.21.4", - "@types/serve-static": "^1.7.31", - "@types/shallowequal": "^0.2.3" - }, - "peerDependencies": { - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "react": "^16.14.0", - "react-dom": "^16.14.0", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "use-react-router": "^1.0.7" - } - }, - "packages/console/node_modules/@babel/code-frame": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/console/node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/console/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/console/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/console/node_modules/@babel/highlight": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/console/node_modules/@babel/runtime": { - "version": "7.22.6", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/console/node_modules/@babel/types": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/console/node_modules/@date-io/core": { - "version": "1.3.13", - "license": "MIT" - }, - "packages/console/node_modules/@date-io/moment": { - "version": "1.3.9", - "license": "MIT", - "dependencies": { - "@date-io/core": "^1.3.9" - }, - "peerDependencies": { - "moment": "^2.24.0" - } - }, - "packages/console/node_modules/@emotion/cache": { - "version": "10.0.29", - "license": "MIT", - "dependencies": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" - } - }, - "packages/console/node_modules/@emotion/core": { - "version": "10.1.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "@emotion/cache": "^10.0.27", - "@emotion/css": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "packages/console/node_modules/@emotion/css": { - "version": "10.0.27", - "license": "MIT", - "dependencies": { - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3", - "babel-plugin-emotion": "^10.0.27" - } - }, - "packages/console/node_modules/@emotion/hash": { - "version": "0.8.0", - "license": "MIT" - }, - "packages/console/node_modules/@emotion/memoize": { - "version": "0.7.4", - "license": "MIT" - }, - "packages/console/node_modules/@emotion/serialize": { - "version": "0.11.16", - "license": "MIT", - "dependencies": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" - } - }, - "packages/console/node_modules/@emotion/serialize/node_modules/csstype": { - "version": "2.6.21", - "license": "MIT" - }, - "packages/console/node_modules/@emotion/sheet": { - "version": "0.9.4", - "license": "MIT" - }, - "packages/console/node_modules/@emotion/stylis": { - "version": "0.8.5", - "license": "MIT" - }, - "packages/console/node_modules/@emotion/unitless": { - "version": "0.7.5", - "license": "MIT" - }, - "packages/console/node_modules/@emotion/utils": { - "version": "0.11.3", - "license": "MIT" - }, - "packages/console/node_modules/@emotion/weak-memoize": { - "version": "0.2.5", - "license": "MIT" - }, - "packages/console/node_modules/@flyteorg/common": { - "resolved": "packages/common", - "link": true - }, - "packages/console/node_modules/@material-ui/core": { - "version": "4.12.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/console/node_modules/@material-ui/core/node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "packages/console/node_modules/@material-ui/core/node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "packages/console/node_modules/@material-ui/core/node_modules/react-is": { - "version": "17.0.2", - "license": "MIT" - }, - "packages/console/node_modules/@material-ui/icons": { - "version": "4.11.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@material-ui/core": "^4.0.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/console/node_modules/@material-ui/pickers": { - "version": "3.3.10", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.6.0", - "@date-io/core": "1.x", - "@types/styled-jsx": "^2.2.8", - "clsx": "^1.0.2", - "react-transition-group": "^4.0.0", - "rifm": "^0.7.0" - }, - "peerDependencies": { - "@date-io/core": "^1.3.6", - "@material-ui/core": "^4.0.0", - "prop-types": "^15.6.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "packages/console/node_modules/@material-ui/styles": { - "version": "4.11.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/console/node_modules/@material-ui/styles/node_modules/csstype": { - "version": "2.6.21", - "license": "MIT" - }, - "packages/console/node_modules/@material-ui/styles/node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "packages/console/node_modules/@material-ui/system": { - "version": "4.12.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/console/node_modules/@material-ui/system/node_modules/csstype": { - "version": "2.6.21", - "license": "MIT" - }, - "packages/console/node_modules/@material-ui/system/node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "packages/console/node_modules/@material-ui/types": { - "version": "5.1.0", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/console/node_modules/@material-ui/utils": { - "version": "4.11.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "packages/console/node_modules/@material-ui/utils/node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "packages/console/node_modules/@material-ui/utils/node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "packages/console/node_modules/@material-ui/utils/node_modules/react-is": { - "version": "17.0.2", - "license": "MIT" - }, - "packages/console/node_modules/@rjsf/core": { - "version": "5.10.0", - "license": "Apache-2.0", - "dependencies": { - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "markdown-to-jsx": "^7.2.1", - "nanoid": "^3.3.6", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@rjsf/utils": "^5.8.x", - "react": "^16.14.0 || >=17" - } - }, - "packages/console/node_modules/@rjsf/core/node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "packages/console/node_modules/@rjsf/material-ui": { - "version": "5.10.0", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@material-ui/core": "^4.12.3", - "@material-ui/icons": "^4.11.2", - "@rjsf/core": "^5.8.x", - "@rjsf/utils": "^5.8.x", - "react": "^16.14.0 || >=17" - } - }, - "packages/console/node_modules/@rjsf/utils": { - "version": "5.10.0", - "license": "Apache-2.0", - "dependencies": { - "json-schema-merge-allof": "^0.8.1", - "jsonpointer": "^5.0.1", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-is": "^18.2.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.14.0 || >=17" - } - }, - "packages/console/node_modules/@rjsf/utils/node_modules/react-is": { - "version": "18.2.0", - "license": "MIT" - }, - "packages/console/node_modules/@rjsf/validator-ajv8": { - "version": "5.10.0", - "license": "Apache-2.0", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@rjsf/utils": "^5.8.x" - } - }, - "packages/console/node_modules/@types/d3-path": { - "version": "1.0.9", - "license": "MIT" - }, - "packages/console/node_modules/@types/d3-shape": { - "version": "1.3.8", - "license": "MIT", - "dependencies": { - "@types/d3-path": "^1" - } - }, - "packages/console/node_modules/@types/debug": { - "version": "0.0.30", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/dom-helpers": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "dom-helpers": "*" - } - }, - "packages/console/node_modules/@types/history": { - "version": "4.7.11", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/http-errors": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/js-yaml": { - "version": "3.12.7", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/linkify-it": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/lodash": { - "version": "4.14.195", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/long": { - "version": "3.0.32", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/lossless-json": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/memoize-one": { - "version": "4.1.1", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/memory-fs": { - "version": "0.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "packages/console/node_modules/@types/mime": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/moment-timezone": { - "version": "0.5.13", - "dev": true, - "license": "MIT", - "dependencies": { - "moment": ">=2.14.0" - } - }, - "packages/console/node_modules/@types/node": { - "version": "20.4.2", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/object-hash": { - "version": "1.3.4", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/parse-json": { - "version": "4.0.0", - "license": "MIT" - }, - "packages/console/node_modules/@types/prop-types": { - "version": "15.7.5", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/pure-render-decorator": { - "version": "0.2.28", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/react-dom": { - "version": "16.9.19", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "^16" - } - }, - "packages/console/node_modules/@types/react-router": { - "version": "5.1.20", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "packages/console/node_modules/@types/react-router-dom": { - "version": "5.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "packages/console/node_modules/@types/react-transition-group": { - "version": "4.4.6", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "packages/console/node_modules/@types/react-virtualized": { - "version": "9.21.22", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "@types/react": "*" - } - }, - "packages/console/node_modules/@types/serve-static": { - "version": "1.15.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "packages/console/node_modules/@types/shallowequal": { - "version": "0.2.4", - "dev": true, - "license": "MIT" - }, - "packages/console/node_modules/@types/styled-jsx": { - "version": "2.2.9", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "packages/console/node_modules/@xstate/react": { - "version": "1.6.3", - "license": "MIT", - "dependencies": { - "use-isomorphic-layout-effect": "^1.0.0", - "use-subscription": "^1.3.0" - }, - "peerDependencies": { - "@xstate/fsm": "^1.0.0", - "react": "^16.8.0 || ^17.0.0", - "xstate": "^4.11.0" - }, - "peerDependenciesMeta": { - "@xstate/fsm": { - "optional": true - }, - "xstate": { - "optional": true - } - } - }, - "packages/console/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "packages/console/node_modules/ajv-formats": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "packages/console/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/console/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "packages/console/node_modules/asap": { - "version": "2.0.6", - "license": "MIT" - }, - "packages/console/node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "packages/console/node_modules/attr-accept": { - "version": "2.2.2", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/console/node_modules/axios": { - "version": "0.27.2", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "packages/console/node_modules/babel-plugin-emotion": { - "version": "10.2.2", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - } - }, - "packages/console/node_modules/babel-plugin-macros": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "packages/console/node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "license": "MIT" - }, - "packages/console/node_modules/base16": { - "version": "1.0.0", - "license": "MIT" - }, - "packages/console/node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/console/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/console/node_modules/chart.js": { - "version": "3.6.2", - "license": "MIT" - }, - "packages/console/node_modules/chartjs-plugin-datalabels": { - "version": "2.0.0", - "license": "MIT", - "peerDependencies": { - "chart.js": "^3.0.0" - } - }, - "packages/console/node_modules/classcat": { - "version": "5.0.4", - "license": "MIT" - }, - "packages/console/node_modules/classnames": { - "version": "2.3.2", - "license": "MIT" - }, - "packages/console/node_modules/clsx": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/console/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "packages/console/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "packages/console/node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "packages/console/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "packages/console/node_modules/compute-gcd": { - "version": "1.2.1", - "dependencies": { - "validate.io-array": "^1.0.3", - "validate.io-function": "^1.0.2", - "validate.io-integer-array": "^1.0.0" - } - }, - "packages/console/node_modules/compute-lcm": { - "version": "1.1.2", - "dependencies": { - "compute-gcd": "^1.2.1", - "validate.io-array": "^1.0.3", - "validate.io-function": "^1.0.2", - "validate.io-integer-array": "^1.0.0" - } - }, - "packages/console/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "packages/console/node_modules/copy-to-clipboard": { - "version": "3.3.3", - "license": "MIT", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "packages/console/node_modules/core-js": { - "version": "1.2.7", - "license": "MIT" - }, - "packages/console/node_modules/cosmiconfig": { - "version": "6.0.0", - "license": "MIT", - "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" - } - }, - "packages/console/node_modules/create-emotion": { - "version": "10.0.27", - "license": "MIT", - "dependencies": { - "@emotion/cache": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" - } - }, - "packages/console/node_modules/cronstrue": { - "version": "1.125.0", - "license": "MIT" - }, - "packages/console/node_modules/cross-fetch": { - "version": "3.1.8", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "packages/console/node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.6.12", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "packages/console/node_modules/css-vendor": { - "version": "2.0.8", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, - "packages/console/node_modules/csstype": { - "version": "3.1.2", - "license": "MIT" - }, - "packages/console/node_modules/d3": { - "version": "5.16.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" - } - }, - "packages/console/node_modules/d3-array": { - "version": "1.2.4", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-axis": { - "version": "1.0.12", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-brush": { - "version": "1.1.6", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "packages/console/node_modules/d3-brush/node_modules/d3-selection": { - "version": "1.4.2", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-chord": { - "version": "1.0.6", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1", - "d3-path": "1" - } - }, - "packages/console/node_modules/d3-collection": { - "version": "1.0.7", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-color": { - "version": "1.4.1", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-contour": { - "version": "1.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "^1.1.1" - } - }, - "packages/console/node_modules/d3-dag": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "d3-array": "^1.2.1", - "fastpriorityqueue": "^0.5.0", - "javascript-lp-solver": "0.4.17", - "quadprog-js": "^0.1.3" - } - }, - "packages/console/node_modules/d3-dispatch": { - "version": "1.0.6", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-drag": { - "version": "1.2.5", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "packages/console/node_modules/d3-drag/node_modules/d3-selection": { - "version": "1.4.2", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-dsv": { - "version": "1.2.0", - "license": "BSD-3-Clause", - "dependencies": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json", - "csv2tsv": "bin/dsv2dsv", - "dsv2dsv": "bin/dsv2dsv", - "dsv2json": "bin/dsv2json", - "json2csv": "bin/json2dsv", - "json2dsv": "bin/json2dsv", - "json2tsv": "bin/json2dsv", - "tsv2csv": "bin/dsv2dsv", - "tsv2json": "bin/dsv2json" - } - }, - "packages/console/node_modules/d3-ease": { - "version": "1.0.7", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-fetch": { - "version": "1.2.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dsv": "1" - } - }, - "packages/console/node_modules/d3-force": { - "version": "1.2.1", - "license": "BSD-3-Clause", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "packages/console/node_modules/d3-format": { - "version": "1.4.5", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-geo": { - "version": "1.12.1", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1" - } - }, - "packages/console/node_modules/d3-hierarchy": { - "version": "1.1.9", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-interpolate": { - "version": "1.4.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1" - } - }, - "packages/console/node_modules/d3-path": { - "version": "1.0.9", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-polygon": { - "version": "1.0.6", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-quadtree": { - "version": "1.0.7", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-random": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-scale": { - "version": "2.2.2", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "packages/console/node_modules/d3-scale-chromatic": { - "version": "1.5.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "packages/console/node_modules/d3-selection": { - "version": "3.0.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "packages/console/node_modules/d3-shape": { - "version": "1.3.7", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "packages/console/node_modules/d3-time": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-time-format": { - "version": "2.3.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-time": "1" - } - }, - "packages/console/node_modules/d3-timer": { - "version": "1.0.10", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-transition": { - "version": "1.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "packages/console/node_modules/d3-transition/node_modules/d3-selection": { - "version": "1.4.2", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-voronoi": { - "version": "1.1.4", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3-zoom": { - "version": "1.8.3", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "packages/console/node_modules/d3-zoom/node_modules/d3-selection": { - "version": "1.4.2", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/d3/node_modules/d3-selection": { - "version": "1.4.2", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/dagre": { - "version": "0.8.5", - "license": "MIT", - "dependencies": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "packages/console/node_modules/dagre-d3": { - "version": "0.6.4", - "license": "MIT", - "dependencies": { - "d3": "^5.14", - "dagre": "^0.8.5", - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "packages/console/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "packages/console/node_modules/decode-uri-component": { - "version": "0.2.2", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "packages/console/node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "packages/console/node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "packages/console/node_modules/emotion": { - "version": "10.0.27", - "license": "MIT", - "dependencies": { - "babel-plugin-emotion": "^10.0.27", - "create-emotion": "^10.0.27" - } - }, - "packages/console/node_modules/encoding": { - "version": "0.1.13", - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "packages/console/node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/console/node_modules/error-ex": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "packages/console/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "packages/console/node_modules/esprima": { - "version": "4.0.1", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "packages/console/node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "packages/console/node_modules/fastpriorityqueue": { - "version": "0.5.0", - "license": "Apache-2.0" - }, - "packages/console/node_modules/fbemitter": { - "version": "3.0.0", - "license": "BSD-3-Clause", - "dependencies": { - "fbjs": "^3.0.0" - } - }, - "packages/console/node_modules/fbjs": { - "version": "3.0.5", - "license": "MIT", - "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" - } - }, - "packages/console/node_modules/fbjs-css-vars": { - "version": "1.0.2", - "license": "MIT" - }, - "packages/console/node_modules/fbjs/node_modules/ua-parser-js": { - "version": "1.0.35", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT", - "engines": { - "node": "*" - } - }, - "packages/console/node_modules/file-selector": { - "version": "0.6.0", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 12" - } - }, - "packages/console/node_modules/filter-obj": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/console/node_modules/find-root": { - "version": "1.1.0", - "license": "MIT" - }, - "packages/console/node_modules/flux": { - "version": "4.0.4", - "license": "BSD-3-Clause", - "dependencies": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.1" - }, - "peerDependencies": { - "react": "^15.0.2 || ^16.0.0 || ^17.0.0" - } - }, - "packages/console/node_modules/follow-redirects": { - "version": "1.15.2", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "packages/console/node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/console/node_modules/function-bind": { - "version": "1.1.1", - "license": "MIT" - }, - "packages/console/node_modules/fuzzysort": { - "version": "1.9.0", - "license": "MIT" - }, - "packages/console/node_modules/graphlib": { - "version": "2.1.8", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "packages/console/node_modules/has": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "packages/console/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/console/node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "packages/console/node_modules/hyphenate-style-name": { - "version": "1.0.4", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/console/node_modules/import-fresh": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/console/node_modules/intersection-observer": { - "version": "0.7.0", - "license": "W3C-20150513" - }, - "packages/console/node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" - }, - "packages/console/node_modules/is-core-module": { - "version": "2.12.1", - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/console/node_modules/is-in-browser": { - "version": "1.1.3", - "license": "MIT" - }, - "packages/console/node_modules/is-stream": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/console/node_modules/isomorphic-fetch": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "packages/console/node_modules/javascript-lp-solver": { - "version": "0.4.17", - "license": "Unlicense" - }, - "packages/console/node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "packages/console/node_modules/js-yaml": { - "version": "3.14.1", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "packages/console/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "packages/console/node_modules/json-schema-compare": { - "version": "0.2.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.4" - } - }, - "packages/console/node_modules/json-schema-merge-allof": { - "version": "0.8.1", - "license": "MIT", - "dependencies": { - "compute-lcm": "^1.1.2", - "json-schema-compare": "^0.2.2", - "lodash": "^4.17.20" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "packages/console/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "packages/console/node_modules/jsonpointer": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/console/node_modules/jss": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" - } - }, - "packages/console/node_modules/jss-plugin-camel-case": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "packages/console/node_modules/jss-plugin-default-unit": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "packages/console/node_modules/jss-plugin-global": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "packages/console/node_modules/jss-plugin-nested": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "packages/console/node_modules/jss-plugin-props-sort": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "packages/console/node_modules/jss-plugin-rule-value-function": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "packages/console/node_modules/jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" - } - }, - "packages/console/node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "packages/console/node_modules/linkify-it": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "packages/console/node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "packages/console/node_modules/lodash-es": { - "version": "4.17.21", - "license": "MIT" - }, - "packages/console/node_modules/lodash.curry": { - "version": "4.1.1", - "license": "MIT" - }, - "packages/console/node_modules/lodash.flow": { - "version": "3.5.0", - "license": "MIT" - }, - "packages/console/node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "packages/console/node_modules/lossless-json": { - "version": "1.0.5", - "license": "MIT" - }, - "packages/console/node_modules/markdown-to-jsx": { - "version": "7.2.1", - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } - }, - "packages/console/node_modules/match-sorter": { - "version": "4.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.5", - "remove-accents": "0.4.2" - } - }, - "packages/console/node_modules/memoize-one": { - "version": "5.2.1", - "license": "MIT" - }, - "packages/console/node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "packages/console/node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "packages/console/node_modules/moment": { - "version": "2.29.4", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "packages/console/node_modules/moment-timezone": { - "version": "0.5.43", - "license": "MIT", - "dependencies": { - "moment": "^2.29.4" - }, - "engines": { - "node": "*" - } - }, - "packages/console/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "packages/console/node_modules/nanoid": { - "version": "3.3.6", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "packages/console/node_modules/node-fetch": { - "version": "1.7.3", - "license": "MIT", - "dependencies": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "packages/console/node_modules/notistack": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "clsx": "^1.1.0", - "hoist-non-react-statics": "^3.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/notistack" - }, - "peerDependencies": { - "@material-ui/core": "^4.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "packages/console/node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/console/node_modules/object-hash": { - "version": "1.3.1", - "license": "MIT", - "engines": { - "node": ">= 0.10.0" - } - }, - "packages/console/node_modules/parent-module": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "packages/console/node_modules/parse-json": { - "version": "5.2.0", - "license": "MIT", - "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" - } - }, - "packages/console/node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "packages/console/node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/console/node_modules/popper.js": { - "version": "1.16.1-lts", - "license": "MIT" - }, - "packages/console/node_modules/promise": { - "version": "7.3.1", - "license": "MIT", - "dependencies": { - "asap": "~2.0.3" - } - }, - "packages/console/node_modules/prop-types": { - "version": "15.6.0", - "license": "MIT", - "dependencies": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "packages/console/node_modules/prop-types/node_modules/fbjs": { - "version": "0.8.18", - "license": "MIT", - "dependencies": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "packages/console/node_modules/punycode": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/console/node_modules/pure-color": { - "version": "1.3.0", - "license": "MIT" - }, - "packages/console/node_modules/quadprog-js": { - "version": "0.1.3", - "license": "MIT", - "engines": { - "node": ">=8.x" - } - }, - "packages/console/node_modules/query-string": { - "version": "6.14.1", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/console/node_modules/react-base16-styling": { - "version": "0.6.0", - "license": "MIT", - "dependencies": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "packages/console/node_modules/react-chartjs-2": { - "version": "4.3.1", - "license": "MIT", - "peerDependencies": { - "chart.js": "^3.5.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "packages/console/node_modules/react-dropzone": { - "version": "14.2.3", - "license": "MIT", - "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "react": ">= 16.8 || 18.0.0" - } - }, - "packages/console/node_modules/react-dropzone/node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "packages/console/node_modules/react-flow-renderer": { - "version": "10.3.8", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.0", - "classcat": "^5.0.3", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^3.7.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "16 || 17 || 18", - "react-dom": "16 || 17 || 18" - } - }, - "packages/console/node_modules/react-flow-renderer/node_modules/d3-color": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "packages/console/node_modules/react-flow-renderer/node_modules/d3-dispatch": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "packages/console/node_modules/react-flow-renderer/node_modules/d3-drag": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "packages/console/node_modules/react-flow-renderer/node_modules/d3-ease": { - "version": "3.0.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "packages/console/node_modules/react-flow-renderer/node_modules/d3-interpolate": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "packages/console/node_modules/react-flow-renderer/node_modules/d3-timer": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "packages/console/node_modules/react-flow-renderer/node_modules/d3-transition": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "packages/console/node_modules/react-flow-renderer/node_modules/d3-zoom": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "packages/console/node_modules/react-ga4": { - "version": "1.4.1", - "license": "MIT" - }, - "packages/console/node_modules/react-intersection-observer": { - "version": "8.34.0", - "license": "MIT", - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0|| ^18.0.0" - } - }, - "packages/console/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "packages/console/node_modules/react-json-view": { - "version": "1.21.3", - "license": "MIT", - "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" - } - }, - "packages/console/node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "license": "MIT" - }, - "packages/console/node_modules/react-loading-skeleton": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "emotion": "^10.0.17" - }, - "peerDependencies": { - "react": "^15.6.1 || ^16.0.0" - } - }, - "packages/console/node_modules/react-query": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "match-sorter": "^6.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "packages/console/node_modules/react-query-devtools": { - "version": "3.0.0-beta.1", - "license": "MIT", - "dependencies": { - "match-sorter": "^4.1.0" - }, - "peerDependencies": { - "react": "^16.6.3 || ^17.0.0", - "react-query": "^3.2.0-beta.23" - } - }, - "packages/console/node_modules/react-query/node_modules/match-sorter": { - "version": "6.3.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "remove-accents": "0.4.2" - } - }, - "packages/console/node_modules/react-textarea-autosize": { - "version": "8.5.2", - "license": "MIT", - "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" - } - }, - "packages/console/node_modules/react-transition-group": { - "version": "4.4.5", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "packages/console/node_modules/react-transition-group/node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "packages/console/node_modules/react-virtualized": { - "version": "9.22.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.7.2", - "clsx": "^1.0.4", - "dom-helpers": "^5.1.3", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" - } - }, - "packages/console/node_modules/react-virtualized/node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "packages/console/node_modules/regenerator-runtime": { - "version": "0.13.11", - "license": "MIT" - }, - "packages/console/node_modules/remove-accents": { - "version": "0.4.2", - "license": "MIT" - }, - "packages/console/node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/console/node_modules/resolve": { - "version": "1.22.3", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.12.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/console/node_modules/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/console/node_modules/rifm": { - "version": "0.7.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "packages/console/node_modules/rw": { - "version": "1.3.3", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "packages/console/node_modules/setimmediate": { - "version": "1.0.5", - "license": "MIT" - }, - "packages/console/node_modules/shallowequal": { - "version": "1.1.0", - "license": "MIT" - }, - "packages/console/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/console/node_modules/split-on-first": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/console/node_modules/sprintf-js": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, - "packages/console/node_modules/strict-uri-encode": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/console/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/console/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/console/node_modules/tiny-warning": { - "version": "1.0.3", - "license": "MIT" - }, - "packages/console/node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/console/node_modules/toggle-selection": { - "version": "1.0.6", - "license": "MIT" - }, - "packages/console/node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "packages/console/node_modules/traverse": { - "version": "0.6.7", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/console/node_modules/tslib": { - "version": "2.6.0", - "license": "0BSD" - }, - "packages/console/node_modules/ua-parser-js": { - "version": "0.7.35", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT", - "engines": { - "node": "*" - } - }, - "packages/console/node_modules/uc.micro": { - "version": "1.0.6", - "license": "MIT" - }, - "packages/console/node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "packages/console/node_modules/url-search-params": { - "version": "0.10.2", - "license": "MIT" - }, - "packages/console/node_modules/use-composed-ref": { - "version": "1.3.0", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "packages/console/node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/console/node_modules/use-latest": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "use-isomorphic-layout-effect": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/console/node_modules/use-subscription": { - "version": "1.8.0", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.2.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "packages/console/node_modules/use-sync-external-store": { - "version": "1.2.0", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "packages/console/node_modules/validate.io-array": { - "version": "1.0.6", - "license": "MIT" - }, - "packages/console/node_modules/validate.io-function": { - "version": "1.0.2" - }, - "packages/console/node_modules/validate.io-integer": { - "version": "1.0.5", - "dependencies": { - "validate.io-number": "^1.0.3" - } - }, - "packages/console/node_modules/validate.io-integer-array": { - "version": "1.0.0", - "dependencies": { - "validate.io-array": "^1.0.3", - "validate.io-integer": "^1.0.4" - } - }, - "packages/console/node_modules/validate.io-number": { - "version": "1.0.3" - }, - "packages/console/node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "packages/console/node_modules/whatwg-fetch": { - "version": "3.6.2", - "license": "MIT" - }, - "packages/console/node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "packages/console/node_modules/xstate": { - "version": "4.33.6", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/xstate" - } - }, - "packages/console/node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "packages/console/node_modules/zustand": { - "version": "3.7.2", - "license": "MIT", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "packages/flyte-api": { - "name": "@flyteorg/flyte-api", - "version": "0.0.2", - "license": "Apache-2.0", - "dependencies": { - "axios": "^0.27.2", - "camelcase-keys": "^7.0.2", - "snakecase-keys": "^5.4.2" - }, - "devDependencies": { - "@types/react": "^16.9.34", - "@types/react-dom": "^16.9.7" - }, - "peerDependencies": { - "react": "^16.14.0", - "react-dom": "^16.14.0" - } - }, - "packages/flyte-api/node_modules/@types/react-dom": { - "version": "16.9.19", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "^16" - } - }, - "packages/flyte-api/node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "packages/flyte-api/node_modules/axios": { - "version": "0.27.2", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "packages/flyte-api/node_modules/camelcase": { - "version": "6.3.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/flyte-api/node_modules/camelcase-keys": { - "version": "7.0.2", - "license": "MIT", - "dependencies": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/flyte-api/node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "packages/flyte-api/node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "packages/flyte-api/node_modules/dot-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "packages/flyte-api/node_modules/follow-redirects": { - "version": "1.15.2", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "packages/flyte-api/node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/flyte-api/node_modules/lower-case": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "packages/flyte-api/node_modules/map-obj": { - "version": "4.3.0", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/flyte-api/node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "packages/flyte-api/node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "packages/flyte-api/node_modules/no-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "packages/flyte-api/node_modules/quick-lru": { - "version": "5.1.1", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/flyte-api/node_modules/snake-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "packages/flyte-api/node_modules/snakecase-keys": { - "version": "5.4.6", - "license": "MIT", - "dependencies": { - "map-obj": "^4.1.0", - "snake-case": "^3.0.4", - "type-fest": "^2.5.2" - }, - "engines": { - "node": ">=12" - } - }, - "packages/flyte-api/node_modules/snakecase-keys/node_modules/type-fest": { - "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/flyte-api/node_modules/tslib": { - "version": "2.6.0", - "license": "0BSD" - }, - "packages/flyte-api/node_modules/type-fest": { - "version": "1.4.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/flyteidl-types": { - "name": "@flyteorg/flyteidl-types", - "version": "0.0.4", - "license": "Apache-2.0", - "dependencies": { - "@flyteorg/flyteidl": "1.3.18" - }, - "peerDependencies": { - "protobufjs": "~6.11.3" - } - }, - "packages/flyteidl-types/node_modules/@flyteorg/flyteidl": { - "version": "1.3.18", - "license": "Apache-2.0" - }, - "packages/locale": { - "name": "@flyteorg/locale", - "version": "0.0.2", - "license": "Apache-2.0", - "devDependencies": { - "@types/jest": "^29.2.1", - "@types/mocha": "^10.0.0" - } - }, - "packages/locale/node_modules/@babel/code-frame": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/locale/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/locale/node_modules/@babel/highlight": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/locale/node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/locale/node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/locale/node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "packages/locale/node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "packages/locale/node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/locale/node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/locale/node_modules/@jest/expect-utils": { - "version": "29.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.4.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/@jest/schemas": { - "version": "29.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/@jest/types": { - "version": "29.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "dev": true, - "license": "MIT" - }, - "packages/locale/node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "packages/locale/node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "packages/locale/node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "packages/locale/node_modules/@types/jest": { - "version": "29.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "packages/locale/node_modules/@types/mocha": { - "version": "10.0.1", - "dev": true, - "license": "MIT" - }, - "packages/locale/node_modules/@types/node": { - "version": "20.4.2", - "dev": true, - "license": "MIT" - }, - "packages/locale/node_modules/@types/stack-utils": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "packages/locale/node_modules/@types/yargs": { - "version": "17.0.24", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "packages/locale/node_modules/@types/yargs-parser": { - "version": "21.0.0", - "dev": true, - "license": "MIT" - }, - "packages/locale/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/locale/node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/locale/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/locale/node_modules/ci-info": { - "version": "3.8.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/locale/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "packages/locale/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "packages/locale/node_modules/diff-sequences": { - "version": "29.4.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "packages/locale/node_modules/expect": { - "version": "29.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.6.1", - "@types/node": "*", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/locale/node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "license": "ISC" - }, - "packages/locale/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/locale/node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "packages/locale/node_modules/jest-diff": { - "version": "29.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/jest-get-type": { - "version": "29.4.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/jest-matcher-utils": { - "version": "29.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.6.1", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/jest-message-util": { - "version": "29.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/jest-util": { - "version": "29.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "packages/locale/node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "packages/locale/node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "packages/locale/node_modules/pretty-format": { - "version": "29.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "packages/locale/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/locale/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, - "packages/locale/node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/locale/node_modules/stack-utils": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/locale/node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/locale/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/locale/node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "packages/ui-atoms": { - "name": "@flyteorg/ui-atoms", - "version": "0.0.4", - "license": "Apache-2.0", - "dependencies": { - "@emotion/core": "10.1.1", - "@material-ui/core": "^4.0.0", - "@material-ui/icons": "^4.0.0", - "classnames": "^2.3.1" - }, - "devDependencies": { - "@types/react": "^16.9.34", - "@types/react-dom": "^16.9.7" - }, - "peerDependencies": { - "react": "^16.13.1", - "react-dom": "^16.13.1" - } - }, - "packages/ui-atoms/node_modules/@babel/code-frame": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/ui-atoms/node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/ui-atoms/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/ui-atoms/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/ui-atoms/node_modules/@babel/highlight": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/ui-atoms/node_modules/@babel/runtime": { - "version": "7.22.6", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/ui-atoms/node_modules/@babel/types": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/ui-atoms/node_modules/@emotion/cache": { - "version": "10.0.29", - "license": "MIT", - "dependencies": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" - } - }, - "packages/ui-atoms/node_modules/@emotion/core": { - "version": "10.1.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "@emotion/cache": "^10.0.27", - "@emotion/css": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "packages/ui-atoms/node_modules/@emotion/css": { - "version": "10.0.27", - "license": "MIT", - "dependencies": { - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3", - "babel-plugin-emotion": "^10.0.27" - } - }, - "packages/ui-atoms/node_modules/@emotion/hash": { - "version": "0.8.0", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@emotion/memoize": { - "version": "0.7.4", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@emotion/serialize": { - "version": "0.11.16", - "license": "MIT", - "dependencies": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" - } - }, - "packages/ui-atoms/node_modules/@emotion/serialize/node_modules/csstype": { - "version": "2.6.21", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@emotion/sheet": { - "version": "0.9.4", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@emotion/stylis": { - "version": "0.8.5", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@emotion/unitless": { - "version": "0.7.5", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@emotion/utils": { - "version": "0.11.3", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@emotion/weak-memoize": { - "version": "0.2.5", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@material-ui/core": { - "version": "4.12.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/ui-atoms/node_modules/@material-ui/core/node_modules/react-is": { - "version": "17.0.2", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@material-ui/icons": { - "version": "4.11.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@material-ui/core": "^4.0.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/ui-atoms/node_modules/@material-ui/styles": { - "version": "4.11.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/ui-atoms/node_modules/@material-ui/styles/node_modules/csstype": { - "version": "2.6.21", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@material-ui/system": { - "version": "4.12.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/ui-atoms/node_modules/@material-ui/system/node_modules/csstype": { - "version": "2.6.21", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@material-ui/types": { - "version": "5.1.0", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/ui-atoms/node_modules/@material-ui/utils": { - "version": "4.11.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "packages/ui-atoms/node_modules/@material-ui/utils/node_modules/react-is": { - "version": "17.0.2", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@types/parse-json": { - "version": "4.0.0", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/@types/react-dom": { - "version": "16.9.19", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "^16" - } - }, - "packages/ui-atoms/node_modules/@types/react-transition-group": { - "version": "4.4.6", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "packages/ui-atoms/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/ui-atoms/node_modules/babel-plugin-emotion": { - "version": "10.2.2", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - } - }, - "packages/ui-atoms/node_modules/babel-plugin-macros": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "packages/ui-atoms/node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/ui-atoms/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/ui-atoms/node_modules/classnames": { - "version": "2.3.2", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/clsx": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/ui-atoms/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "packages/ui-atoms/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/cosmiconfig": { - "version": "6.0.0", - "license": "MIT", - "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" - } - }, - "packages/ui-atoms/node_modules/css-vendor": { - "version": "2.0.8", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, - "packages/ui-atoms/node_modules/csstype": { - "version": "3.1.2", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "packages/ui-atoms/node_modules/error-ex": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "packages/ui-atoms/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "packages/ui-atoms/node_modules/find-root": { - "version": "1.1.0", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/function-bind": { - "version": "1.1.1", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/has": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "packages/ui-atoms/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/ui-atoms/node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "packages/ui-atoms/node_modules/hyphenate-style-name": { - "version": "1.0.4", - "license": "BSD-3-Clause" - }, - "packages/ui-atoms/node_modules/import-fresh": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/ui-atoms/node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/is-core-module": { - "version": "2.12.1", - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/ui-atoms/node_modules/is-in-browser": { - "version": "1.1.3", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/jss": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" - } - }, - "packages/ui-atoms/node_modules/jss-plugin-camel-case": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "packages/ui-atoms/node_modules/jss-plugin-default-unit": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "packages/ui-atoms/node_modules/jss-plugin-global": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "packages/ui-atoms/node_modules/jss-plugin-nested": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "packages/ui-atoms/node_modules/jss-plugin-props-sort": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "packages/ui-atoms/node_modules/jss-plugin-rule-value-function": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "packages/ui-atoms/node_modules/jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" - } - }, - "packages/ui-atoms/node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "packages/ui-atoms/node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/ui-atoms/node_modules/parent-module": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "packages/ui-atoms/node_modules/parse-json": { - "version": "5.2.0", - "license": "MIT", - "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" - } - }, - "packages/ui-atoms/node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/ui-atoms/node_modules/popper.js": { - "version": "1.16.1-lts", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "packages/ui-atoms/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/react-transition-group": { - "version": "4.4.5", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "packages/ui-atoms/node_modules/regenerator-runtime": { - "version": "0.13.11", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/resolve": { - "version": "1.22.3", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.12.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/ui-atoms/node_modules/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/ui-atoms/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/ui-atoms/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/ui-atoms/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/ui-atoms/node_modules/tiny-warning": { - "version": "1.0.3", - "license": "MIT" - }, - "packages/ui-atoms/node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/ui-atoms/node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "website": { - "name": "@flyteconsole/client-app", - "version": "0.0.0-develop", - "license": "Apache-2.0", - "dependencies": { - "@flyteorg/common": "^0.0.4", - "@flyteorg/console": "^0.0.47", - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "react-ga4": "^1.4.1", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "use-react-router": "^1.0.7" - }, - "devDependencies": { - "@types/long": "^3.0.32" - }, - "peerDependencies": { - "@types/react": "^16.9.34", - "@types/react-dom": "^16.9.7", - "react": "^16.13.1", - "react-dom": "^16.13.1" - } - } - } -} diff --git a/package.json b/package.json index dbce7d901..f48a0458c 100644 --- a/package.json +++ b/package.json @@ -10,30 +10,36 @@ "workspaces": { "packages": [ "packages/*", - "website" + "website/*" ] }, "scripts": { - "postinstall": "husky install", - "install:console": "yarn workspaces focus --production --all", - "build:pack": "yarn workspaces foreach -vit --include '{@flyteorg/flyteidl-types,@flyteorg/flyte-api,@flyteorg/ui-atoms,@flyteorg/common,@flyteorg/locale,@flyteorg/flyte-api,@flyteorg/components,@flyteorg/console}' run build", - "build:types": "yarn workspaces foreach -vit --include '{@flyteorg/flyteidl-types,@flyteorg/flyte-api,@flyteorg/ui-atoms,@flyteorg/common,@flyteorg/locale,@flyteorg/flyte-api,@flyteorg/components,@flyteorg/console}' run build:types", - "clean": "git clean -fxd --exclude script", - "gen:ssl": "make generate_ssl", - "start": "yarn workspace @flyteconsole/client-app start", - "build": "yarn workspace @flyteconsole/client-app build", - "build:prod": "yarn workspace @flyteconsole/client-app build:prod", - "start:prod": "yarn workspace @flyteconsole/client-app start:prod", - "build:storybook": "build-storybook", - "generate:package": "yarn workspace @flyteconsole/generator start", + "postinstall": "cd .. && husky install clients/.husky", + "clean": "git clean -fxd --exclude scripts || true", + "cleanb": "git clean -fxd --exclude scripts --exclude node_modules --exclude .yarn --exclude .husky|| true", + "install:console": "yarn workspaces focus --all --production", + "build:static:types": "yarn workspaces foreach -vit --include '{@clients/common,@clients/db,@clients/flyte-api,@clients/theme,@clients/locale}' run build:types", + "build:common:types": "yarn workspaces foreach -vit --include '{@clients/ui-atoms,@clients/primitives,@clients/oss-console}' run build:types", + "build:types": "yarn build:static:types && yarn build:common:types", + "build:console": "BASE_URL=/console yarn workspace @clients/console run build:prod", + "build:prod:console": "BASE_URL=/console yarn workspace @clients/console run build", + "build": "yarn build:console", + "start:console": "BASE_URL=/console yarn workspace @clients/console run start", + "start:prod:console": "BASE_URL=/console yarn workspace @clients/console run start:prod", + "start": "yarn start:console", + "gen:ssl": "./scripts/generate_ssl.sh", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "format": "prettier --ignore-path .eslintignore --write \"**/*.+(js|jsx|ts|tsx|json)\"", "fix": "yarn lint --quiet --fix && yarn format", "storybook": "start-storybook -p 6006", - "test": "NODE_ENV=test BASE_URL=/console jest", + "build-storybook": "build-storybook", + "test": "NODE_ENV=test yarn run jest --detectOpenHandles", "test:clear": "jest --clearCache", - "test-coverage": "NODE_OPTIONS='--max-old-space-size=8192' NODE_ENV=test BASE_URL=/console jest --coverage", - "test-release": "CI=true npx semantic-release@21.0.7 --debug --no-ci --test-run" + "test:failed": "mkdir -p .coverage && yarn jest --no-color 2>./.coverage/logs.txt || yarn test:failed:print", + "test:failed:print": "node scripts/getFailedLogs.js", + "test-coverage": "NODE_ENV=test yarn test --coverage=true", + "test:todo": "node ./scripts/getTestTodo.js", + "find:dead:code": "npx ts-prune | grep -v 'used in module'" }, "husky": { "hooks": { @@ -41,116 +47,137 @@ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } }, - "keywords": [ - "react", - "lyft" - ], - "author": "Flyte Contributors ", - "license": "Apache-2.0", "lint-staged": { "*.{js,jsx,ts,tsx,scss,css,md,json}": [ "yarn fix" ] }, "dependencies": { - "@babel/core": "~7.16.12", - "@babel/preset-env": "~7.16.11", "@commitlint/cli": "^17.3.0", "@commitlint/config-conventional": "^17.3.0", - "@material-ui/core": "^4.2.0", - "@material-ui/icons": "^4.2.1", - "@semantic-release/changelog": "^5.0.1", - "@semantic-release/commit-analyzer": "^8.0.1", - "@semantic-release/exec": "^6.0.3", - "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^7.0.5", - "@semantic-release/npm": "^7.0.5", - "@semantic-release/release-notes-generator": "^9.0.1", - "@testing-library/jest-dom": "^5.5.0", - "@testing-library/react": "^10.0.3", - "@testing-library/react-hooks": "^7.0.2", - "@types/morgan": "^1.9.4", - "@types/react": "^16.14.35", - "@types/react-dom": "^16.9.7", - "@typescript-eslint/eslint-plugin": "^5.48.2", - "@typescript-eslint/parser": "^5.48.2", - "babel-loader": "^8.2.5", - "chalk": "^4", - "chart.js": "3.6.2", - "chartjs-plugin-datalabels": "2.0.0", + "@tanstack/react-table": "^8.10.1", + "@testing-library/jest-dom": "^5.16.3", + "@testing-library/react": "^13.2.0", + "@testing-library/react-hooks": "^8.0.0", + "@types/chart.js": "^2.9.37", + "@types/google-protobuf": "^3.15.6", + "@types/jest": "^29.5.5", + "@types/lodash": "^4.14.191", + "@types/long": "^3.0.32", + "@types/morgan": "^1.9.3", + "@types/node": "^18.11.9", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.4", + "@types/react-router": "^5.1.19", + "@types/react-router-dom": "^5.3.3", + "@typescript-eslint/eslint-plugin": "^5.46.1", + "@typescript-eslint/parser": "^5.46.1", + "chalk": "4.1.2", + "chart.js": "3.8.0", "cheerio": "^1.0.0-rc.12", - "compression-webpack-plugin": "^9.2.0", - "cookie-parser": "^1.4.3", + "classnames": "^2.3.2", + "compression-webpack-plugin": "^10.0.0", + "concurrently": "^7.2.2", "copy-webpack-plugin": "^11.0.0", - "dotenv": "^5.0.1", - "eslint": "^8.33.0", + "cors": "^2.8.5", + "css-loader": "^6.8.1", + "dotenv-webpack": "^8.0.0", + "eslint": "^8.29.0", "eslint-config-airbnb": "^19.0.4", - "eslint-config-prettier": "^8.6.0", - "eslint-plugin-import": "^2.27.4", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.32.0", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.29.4", + "eslint-plugin-react-hooks": "^4.3.0", "express": "^4.18.1", "express-static-gzip": "^2.1.7", "fork-ts-checker-webpack-plugin": "^7.2.11", - "html-webpack-plugin": "^5.5.0", + "html-webpack-plugin": "^5.5.3", "husky": "^8.0.2", - "jest": "^26.0.0", - "jest-transformer-svg": "^2.0.0", - "lint-staged": "^13.1.0", - "marked-gfm-heading-id": "^3.0.4", - "marked-mangle": "^1.1.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jest-transformer-svg": "^2.0.1", + "lint-staged": "^13.0.3", + "long": "^5.2.1", + "moment": "^2.29.4", "morgan": "^1.10.0", - "msw": "^0.24.1", + "msw": "^1.3.2", "node-polyfill-webpack-plugin": "^2.0.1", - "prettier": "^2.8.3", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "react-syntax-highlighter": "^15.5.0", - "semantic-release": "^21.0.7", - "serve-static": "^1.12.3", + "nodemon": "^2.0.19", + "parse5": "^7.1.2", + "postcss": "^8.4.25", + "postcss-loader": "^7.3.3", + "prettier": "^2.8.1", + "prom-client": "^14.0.1", + "protobufjs": "^6.11.4", + "react": "^18.1.0", + "react-dom": "^18.1.0", + "react-helmet": "^6.1.0", + "react-router": "5.3.4", + "react-router-dom": "5.3.4", "source-map-loader": "^4.0.1", - "ts-jest": "^26.3.0", - "ts-loader": "^9.2.6", - "ts-node": "^8.0.2", - "tsc-alias": "^1.7.0", + "string-template": "^1.0.0", + "style-loader": "^3.3.3", + "ts-jest": "^29.1.1", + "ts-loader": "^9.3.0", + "ts-node": "^10.8.1", + "tsc-alias": "^1.8.7", "tsc-watch": "^6.0.0", "tslib": "^2.4.1", - "typescript": "^4.9.4", - "wait-on": "^6.0.1", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.7.4", - "webpack-merge": "^5.8.0", - "webpack-node-externals": "^3.0.0" + "typescript": "^4.5.5", + "wait-on": "^7.0.1", + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4", + "webpack-dev-middleware": "^6.1.1", + "webpack-dev-server": "^4.15.1", + "webpack-hot-middleware": "^2.25.4", + "webpack-merge": "^5.10.0", + "webpack-node-externals": "^3.0.0", + "whatwg-fetch": "^3.6.19" }, "devDependencies": { - "@storybook/addon-actions": "^6.4.19", - "@storybook/addon-essentials": "^6.4.19", - "@storybook/addon-interactions": "^6.4.19", - "@storybook/addon-links": "^6.4.19", - "@storybook/builder-webpack5": "^6.4.19", - "@storybook/manager-webpack5": "^6.4.19", - "@storybook/react": "^6.4.19", - "@storybook/testing-library": "^0.0.9", - "@types/traverse": "^0.6.32", - "ansicolors": "^0.3.2", - "execa": "^7.2.0", - "semantic-release": "^21.0.7", - "traverse": "^0.6.7" + "@storybook/addon-actions": "^6.5.6", + "@storybook/addon-essentials": "^6.5.6", + "@storybook/addon-interactions": "^6.5.6", + "@storybook/addon-links": "^6.5.6", + "@storybook/builder-webpack5": "^6.5.6", + "@storybook/manager-webpack5": "^6.5.6", + "@storybook/react": "^6.5.6", + "@storybook/testing-library": "^0.0.11", + "@testing-library/dom": "^9.3.3", + "@testing-library/user-event": "^14.5.1", + "@types/dagre": "^0.7.52", + "buildkite-test-collector": "^1.6.4", + "dotenv": "^16.3.1", + "eslint-plugin-custom-rules": "file:./scripts/eslint-custom-rules", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "storybook-addon-mock": "^2.4.1" }, "resolutions": { - "@babel/cli": "~7.16.0", - "@babel/core": "~7.16.12", - "@babel/plugin-proposal-class-properties": "~7.16.7", - "@babel/plugin-proposal-decorators": "~7.16.7", - "@babel/plugin-proposal-object-rest-spread": "~7.16.7", - "@babel/preset-env": "~7.16.11", - "@babel/preset-react": "~7.16.7", - "@babel/preset-typescript": "~7.16.7", - "minimist": "1.2.6", - "@types/react": "16.14.34", - "npm/chalk": "^4" + "react": "^18.1.0", + "react-dom": "^18.1.0", + "trim": "0.0.3", + "react-test-renderer": "18.1.0", + "@types/react": "^18.0.9", + "loader-utils": "^3.2.1", + "yaml": "2.3.1", + "dns-packet": "5.4.0", + "undici": "5.19.1", + "http-cache-semantics": "4.1.1", + "@xmldom/xmldom": "0.8.10", + "d3-color": "3.1.0", + "node-fetch": "2.6.7", + "json5": "2.2.3", + "decode-uri-component": "0.4.1", + "tar": "6.2.0", + "terser": "5.21.0", + "trim-newlines": "5.0.0", + "glob-parent": "6.0.2", + "prismjs": "1.29.0", + "postcss": "^8.4.31", + "protobufjs": "^6.11.4" }, "packageManager": "yarn@3.2.1" } diff --git a/packages/common/LICENSE b/packages/common/LICENSE deleted file mode 100644 index bed437514..000000000 --- a/packages/common/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Lyft, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/packages/common/README.md b/packages/common/README.md deleted file mode 100644 index 95ee967c1..000000000 --- a/packages/common/README.md +++ /dev/null @@ -1,5 +0,0 @@ - - -# @flyteorg/common · [![license](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/flyteorg/flyteconsole/blob/master/packages/common/LICENSE) [![npm](https://img.shields.io/npm/v/@flyteorg/common)](https://www.npmjs.com/package/@flyteorg/common) [![npm bundle size](https://img.shields.io/bundlephobia/min/@flyteorg/common)](https://www.npmjs.com/package/@flyteorg/common) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/flyteorg/flyteconsole/blob/master/CONTRIBUTING.md) - -This is a UI common package which plan to contain common flyte utility functions diff --git a/packages/common/jest.config.js b/packages/common/jest.config.js new file mode 100644 index 000000000..cf3ddf2bd --- /dev/null +++ b/packages/common/jest.config.js @@ -0,0 +1,7 @@ +/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */ +// eslint-disable-next-line import/no-unresolved +const sharedConfig = require('../../scripts/jest.base.js'); + +module.exports = { + ...sharedConfig, +}; diff --git a/packages/common/package.json b/packages/common/package.json index c44ca6aac..6c6274e94 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,39 +1,45 @@ { - "name": "@flyteorg/common", - "version": "0.0.4", - "description": "Flyteconsole common utilities", + "name": "@clients/common", + "version": "0.1.0", + "description": "common models", "main": "./dist/index.js", "module": "./lib/index.js", "types": "./lib/index.d.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" + "scripts": { + "build": "yarn build:esm && yarn build:cjs", + "build:esm": "run -T tsc --module esnext --outDir lib --project ./tsconfig.build.json", + "build:cjs": "run -T tsc --project ./tsconfig.build.json", + "build:types": "yarn build:cjs --emitDeclarationOnly && yarn build:esm --emitDeclarationOnly", + "test": "NODE_ENV=test run -T jest" }, - "repository": { - "type": "git", - "url": "https://github.com/flyteorg/flyteconsole.git", - "directory": "packages/common" + "peerDependencies": { + "@types/lodash": "^4.14.191", + "@types/node": "^18.11.9", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.4", + "lodash": "^4.17.21", + "protobufjs": "~6.11.4", + "react": "^18.1.0", + "react-dom": "^18.1.0", + "tslib": "^2.4.1" }, - "files": [ - "LICENSE", - "README.md", - "dist", - "lib", - "node_modules" - ], - "installConfig": { - "hoistingLimits": "workspaces" + "dependencies": { + "@flyteorg/flyteidl": "^1.10.7", + "@protobuf-ts/runtime": "^2.6.0", + "@protobuf-ts/runtime-rpc": "^2.6.0" }, - "scripts": { - "clean": "rm -rf dist && rm -rf lib && rm -rf **.tsbuildinfo || true", - "build:watch": "run -T tsc-watch --noClear --signalEmittedFiles -p ./tsconfig.build.es.json --onSuccess \"yarn build:watch:success\"", - "build:watch:success": "yarn build:esm:alias && yalc push --force", - "build": "yarn clean && yarn build:esm && yarn build:cjs", - "build:esm": "run -T tsc --module esnext --project ./tsconfig.build.es.json && yarn build:esm:alias", - "build:esm:alias": "run -T tsc-alias -p ./tsconfig.build.es.json", - "build:cjs": "run -T tsc --project ./tsconfig.build.json && run -T tsc-alias -p ./tsconfig.build.json", - "build:types": "run -T tsc --module esnext --project ./tsconfig.build.es.json --emitDeclarationOnly && run -T tsc-alias -p ./tsconfig.build.es.json", - "test": "NODE_ENV=test jest" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } } diff --git a/packages/common/src/Errors/NotAuthorizedError.ts b/packages/common/src/Errors/NotAuthorizedError.ts new file mode 100644 index 000000000..b7745b826 --- /dev/null +++ b/packages/common/src/Errors/NotAuthorizedError.ts @@ -0,0 +1,8 @@ +/** Indicates failure to fetch a resource because the user is not authorized (401) */ +export class NotAuthorizedError extends Error { + constructor(msg = 'User is not authorized to view this resource') { + super(msg); + } +} + +export default NotAuthorizedError; diff --git a/packages/common/src/Errors/NotFoundError.ts b/packages/common/src/Errors/NotFoundError.ts new file mode 100644 index 000000000..5ceca59eb --- /dev/null +++ b/packages/common/src/Errors/NotFoundError.ts @@ -0,0 +1,7 @@ +export class NotFoundError extends Error { + constructor(public override name: string, msg = 'The requested item could not be found') { + super(msg); + } +} + +export default NotFoundError; diff --git a/packages/common/src/Errors/ParameterError.ts b/packages/common/src/Errors/ParameterError.ts new file mode 100644 index 000000000..3b37d180c --- /dev/null +++ b/packages/common/src/Errors/ParameterError.ts @@ -0,0 +1,7 @@ +/* eslint-disable max-classes-per-file */ +/** Indicates a generic problem with a function parameter */ +export class ParameterError extends Error { + constructor(public override name: string, msg: string) { + super(msg); + } +} diff --git a/packages/common/src/Errors/ValueError.ts b/packages/common/src/Errors/ValueError.ts new file mode 100644 index 000000000..6cd1f63fb --- /dev/null +++ b/packages/common/src/Errors/ValueError.ts @@ -0,0 +1,10 @@ +import { ParameterError } from './ParameterError'; + +/** Indicates that the provided parameter value is invalid */ +export class ValueError extends ParameterError { + constructor(public override name: string, msg = 'Invalid value') { + super(name, msg); + } +} + +export default ValueError; diff --git a/packages/common/src/Utils/decodeProtoResponse.ts b/packages/common/src/Utils/decodeProtoResponse.ts new file mode 100644 index 000000000..22fa0ceac --- /dev/null +++ b/packages/common/src/Utils/decodeProtoResponse.ts @@ -0,0 +1,6 @@ +import { DecodableType } from '@clients/common/types/adminEntityTypes'; + +export function decodeProtoResponse(data: ArrayBuffer, messageType: DecodableType): T { + // ProtobufJS requires Uint8Array, but axios returns an ArrayBuffer + return messageType.decode(new Uint8Array(data)); +} diff --git a/packages/common/src/Utils/getInputDefintionForLiteralType.ts b/packages/common/src/Utils/getInputDefintionForLiteralType.ts new file mode 100644 index 000000000..6579a4247 --- /dev/null +++ b/packages/common/src/Utils/getInputDefintionForLiteralType.ts @@ -0,0 +1,48 @@ +import { + InputType, + InputTypeDefinition, + LiteralType, + simpleTypeToInputType, +} from '../flyteidl/coreTypes'; + +/** Converts a `LiteralType` to an `InputTypeDefintion` to assist with rendering + * a type annotation and converting input values. + */ +export function getInputDefintionForLiteralType(literalType: LiteralType): InputTypeDefinition { + const result: InputTypeDefinition = { + type: InputType.Unknown, + }; + + switch (true) { + case 'blob' in literalType: + result.type = InputType.Blob; + break; + case 'enum' in literalType: + result.type = InputType.Enum; + break; + case 'collectionType' in literalType: + result.type = InputType.Collection; + result.subtype = getInputDefintionForLiteralType(literalType.collectionType!); + break; + case 'mapValueType' in literalType: + result.type = InputType.Map; + result.subtype = getInputDefintionForLiteralType(literalType.mapValueType!); + break; + case 'simple' in literalType: + result.type = simpleTypeToInputType[literalType.simple!]; + break; + case 'schema' in literalType: + result.type = InputType.Schema; + break; + case 'unionType' in literalType: + result.type = InputType.Union; + result.listOfSubTypes = literalType.unionType!.variants?.map((variant) => + getInputDefintionForLiteralType(variant as LiteralType), + ); + break; + default: + result.type = InputType.Unknown; + } + + return result; +} diff --git a/packages/common/src/config/index.ts b/packages/common/src/config/index.ts deleted file mode 100644 index 9ecc9e0b2..000000000 --- a/packages/common/src/config/index.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { ThemeOptions } from '@material-ui/core/styles'; - -type StatusColor = { - FAILURE: string; - RUNNING: string; - QUEUED: string; - SUCCESS: string; - SKIPPED: string; - UNKNOWN: string; - WARNING: string; - PAUSED: string; -}; - -type GraphStatusColor = { - FAILED: string; - FAILING: string; - SUCCEEDED: string; - ABORTED: string; - RUNNING: string; - QUEUED: string; - PAUSED: string; - UNDEFINED: string; -}; - -export interface FlyteNavItem { - title: string; - url: string; -} - -export interface FlyteNavigation { - color?: string; - background?: string; - console?: string; - items: FlyteNavItem[]; -} - -export type AppConfig = { - bodyFontFamily?: string; - primaryColor?: string; - primaryLightColor?: string; - primaryDarkColor?: string; - primaryHighlightColor?: string; - interactiveTextColor?: string; - interactiveTextDisabledColor?: string; - interactiveTextBackgroundColor?: string; - inputFocusBorderColor?: string; - statusColors?: StatusColor; - graphStatusColors?: GraphStatusColor; - themeOptions?: ThemeOptions; -}; diff --git a/packages/console/src/common/constants.ts b/packages/common/src/constants/index.ts similarity index 72% rename from packages/console/src/common/constants.ts rename to packages/common/src/constants/index.ts index a9a0171ae..b799f6f36 100644 --- a/packages/console/src/common/constants.ts +++ b/packages/common/src/constants/index.ts @@ -1,15 +1,10 @@ export const contentContainerId = 'content-container'; export const detailsPanelId = 'details-panel'; -export const navBarContentId = 'nav-bar-content'; -export const subnavBarContentId = 'subnav-bar-content'; export const unknownValueString = '(unknown)'; export const dashedValueString = '----'; export const noneString = '(none)'; export const noExecutionsFoundString = 'No executions found.'; export const noVersionsFoundString = 'No versions found.'; +export const noLaunchPlansFoundString = 'No Launch Plans found.'; export const zeroSecondsString = '0s'; - -export enum KeyCodes { - ESCAPE = 27, -} diff --git a/packages/common/src/constants/tableConstants.ts b/packages/common/src/constants/tableConstants.ts new file mode 100644 index 000000000..9593f384b --- /dev/null +++ b/packages/common/src/constants/tableConstants.ts @@ -0,0 +1,2 @@ +export const headerGridHeight = 6; +export const loadMoreRowGridHeight = 6; diff --git a/packages/common/src/environment/index.ts b/packages/common/src/environment/index.ts index 6debb6de1..e8e2163c4 100644 --- a/packages/common/src/environment/index.ts +++ b/packages/common/src/environment/index.ts @@ -1,13 +1,38 @@ -/* eslint import/no-mutable-exports: 1 */ export interface Env extends NodeJS.ProcessEnv { - ADMIN_API_URL?: string; + ADMIN_API?: string; + /** + * @depricated use BASE_HREF + */ BASE_URL?: string; - FLYTE_NAVIGATION?: string; + + /** + * The URL path to the root of the application. + * This is used to configure the React-Router basename and the tag in index.html. + * Leave empty if deploying from the root of the domain. + * + * BASE_HREF=https://example.com/flyte/ui/here + * The pathname section, "/flyte/ui/here", would be used as the basepath + * + * Read more about the tag here: + * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base + */ + BASE_HREF?: string; + DISABLE_CONSOLE_ROUTE_PREFIX?: string; DISABLE_ANALYTICS?: string; NODE_ENV?: 'development' | 'production' | 'test'; STATUS_URL?: string; ADMIN_REQUEST_HEADERS?: string; + + /** + * This is used to prevent use of the app during outages. + * If this is set to 'true', the app will display a maintenance page. + * You can provide a custom message by setting this to a string. + * + * @example MAINTENANCE_MODE=true + * @example MAINTENANCE_MODE="We are currently down for maintenance.\n\nPlease try again later." + */ + MAINTENANCE_MODE?: string; } /** Represents a plain object where string keys map to values of the same type */ @@ -22,15 +47,30 @@ declare global { } } -/** equivalent to process.env in server and client */ -// eslint-disable-next-line import/no-mutable-exports -export let env: Env = { ...process.env, ...window.env }; - -export const isDevEnv = () => env.NODE_ENV === 'development'; -export const isTestEnv = () => env.NODE_ENV === 'test'; +const makeEnvInit = () => { + const envInit = { + ...process.env, + ...window.env, + }; -export const updateEnv = (outerEnv: Env) => { - if (outerEnv) { - env = { ...env, ...outerEnv }; + if (envInit.BASE_URL) { + if (envInit.NODE_ENV !== 'test' && envInit.NODE_ENV !== 'production') { + // eslint-disable-next-line no-console + console.warn('BASE_URL will be depricated.'); + } } + + // Ensure that the BASE_HREF is a valid URL or empty + const urlOrEmpty = envInit?.BASE_HREF ? new URL(envInit.BASE_HREF).href : ''; + envInit.BASE_HREF = urlOrEmpty; + + envInit.MAINTENANCE_MODE = envInit.MAINTENANCE_MODE || ''; + + window.env = envInit; + return envInit; }; + +export const env: Env = makeEnvInit(); + +export const isDevEnv = () => env.NODE_ENV === 'development'; +export const isTestEnv = () => env.NODE_ENV === 'test'; diff --git a/packages/common/src/flyteidl/admin.ts b/packages/common/src/flyteidl/admin.ts new file mode 100644 index 000000000..f8d5ce9d0 --- /dev/null +++ b/packages/common/src/flyteidl/admin.ts @@ -0,0 +1,6 @@ +import { flyteidl } from '@flyteorg/flyteidl/gen/pb-js/flyteidl'; + +/** Message classes for flyte entities */ +import admin = flyteidl.admin; + +export default admin; diff --git a/packages/common/src/flyteidl/core.ts b/packages/common/src/flyteidl/core.ts new file mode 100644 index 000000000..d256057f9 --- /dev/null +++ b/packages/common/src/flyteidl/core.ts @@ -0,0 +1,6 @@ +import { flyteidl } from '@flyteorg/flyteidl/gen/pb-js/flyteidl'; + +/** Message classes for flyte entities */ +import core = flyteidl.core; + +export default core; diff --git a/packages/common/src/flyteidl/coreTypes.ts b/packages/common/src/flyteidl/coreTypes.ts new file mode 100644 index 000000000..1050b7bd6 --- /dev/null +++ b/packages/common/src/flyteidl/coreTypes.ts @@ -0,0 +1,88 @@ +/* eslint-disable prefer-destructuring */ +/* eslint-disable no-redeclare */ +import Core from './core'; +import { ProtobufStruct } from './protobufTypes'; + +/* --- BEGIN flyteidl type aliases --- */ +/** These are types shared across multiple sections of the data model. Most of + * map to types found in `flyteidl.core`. + */ + +/* It's an ENUM exports, and as such need to be exported as both type and const value */ +type SimpleType = Core.SimpleType; +const SimpleType = Core.SimpleType; +type EnumType = Core.EnumType; +const EnumType = Core.EnumType; +type BlobDimensionality = Core.BlobType.BlobDimensionality; +const BlobDimensionality = Core.BlobType.BlobDimensionality; +type SchemaColumnType = Core.SchemaType.SchemaColumn.SchemaColumnType; +const SchemaColumnType = Core.SchemaType.SchemaColumn.SchemaColumnType; + +/** Literals */ +interface BlobType extends Core.IBlobType { + dimensionality: BlobDimensionality; +} + +/** A Core.ILiteral guaranteed to have all subproperties necessary to specify + * a Blob. + */ +interface SchemaColumn extends Core.SchemaType.ISchemaColumn { + name: string; + type: SchemaColumnType; +} + +interface SchemaType extends Core.ISchemaType { + columns: SchemaColumn[]; +} + +export interface LiteralType extends Core.ILiteralType { + blob?: BlobType; + collectionType?: LiteralType; + mapValueType?: LiteralType; + metadata?: ProtobufStruct; + schema?: SchemaType; + simple?: SimpleType; + enumType?: EnumType; +} + +/* --- END flyteidl type aliases --- */ + +export enum InputType { + Binary = 'BINARY', + Blob = 'BLOB', + Boolean = 'BOOLEAN', + Collection = 'COLLECTION', + Datetime = 'DATETIME', + Duration = 'DURATION', + Error = 'ERROR', + Enum = 'ENUM', + Float = 'FLOAT', + Integer = 'INTEGER', + Map = 'MAP', + None = 'NONE', + Schema = 'SCHEMA', + String = 'STRING', + Struct = 'STRUCT', + Union = 'Union', + Unknown = 'UNKNOWN', +} + +/** Maps nested `SimpleType`s to our flattened `InputType` enum. */ +export const simpleTypeToInputType: { [k in SimpleType]: InputType } = { + [SimpleType.BINARY]: InputType.Binary, + [SimpleType.BOOLEAN]: InputType.Boolean, + [SimpleType.DATETIME]: InputType.Datetime, + [SimpleType.DURATION]: InputType.Duration, + [SimpleType.ERROR]: InputType.Error, + [SimpleType.FLOAT]: InputType.Float, + [SimpleType.INTEGER]: InputType.Integer, + [SimpleType.NONE]: InputType.None, + [SimpleType.STRING]: InputType.String, + [SimpleType.STRUCT]: InputType.Struct, +}; + +export interface InputTypeDefinition { + type: InputType; + subtype?: InputTypeDefinition; + listOfSubTypes?: InputTypeDefinition[]; +} diff --git a/packages/common/src/flyteidl/event.ts b/packages/common/src/flyteidl/event.ts new file mode 100644 index 000000000..3ba82724b --- /dev/null +++ b/packages/common/src/flyteidl/event.ts @@ -0,0 +1,6 @@ +import { flyteidl } from '@flyteorg/flyteidl/gen/pb-js/flyteidl'; + +/** Message classes for flyte entities */ +import event = flyteidl.event; + +export default event; diff --git a/packages/common/src/flyteidl/protobuf.ts b/packages/common/src/flyteidl/protobuf.ts new file mode 100644 index 000000000..ea9cecd21 --- /dev/null +++ b/packages/common/src/flyteidl/protobuf.ts @@ -0,0 +1,8 @@ +import { google } from '@flyteorg/flyteidl/gen/pb-js/flyteidl'; + +/** Message classes for flyte entities */ + +/** Message classes for built-in Protobuf types */ +import protobuf = google.protobuf; + +export default protobuf; diff --git a/packages/common/src/flyteidl/protobufTypes.ts b/packages/common/src/flyteidl/protobufTypes.ts new file mode 100644 index 000000000..301d3a653 --- /dev/null +++ b/packages/common/src/flyteidl/protobufTypes.ts @@ -0,0 +1,12 @@ +import Protobuf from './protobuf'; + +/** Represents a plain object where string keys map to values of the same type */ +type Dictionary = { [k: string]: T }; + +interface ProtobufValue extends Protobuf.IValue { + kind: keyof Protobuf.IValue; +} + +export interface ProtobufStruct extends Protobuf.IStruct { + fields: Dictionary; +} diff --git a/packages/common/src/flyteidl/service.ts b/packages/common/src/flyteidl/service.ts new file mode 100644 index 000000000..270fd09dc --- /dev/null +++ b/packages/common/src/flyteidl/service.ts @@ -0,0 +1,6 @@ +import { flyteidl } from '@flyteorg/flyteidl/gen/pb-js/flyteidl'; + +/** Message classes for flyte entities */ +import service = flyteidl.service; + +export default service; diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts deleted file mode 100644 index 94a04a1e0..000000000 --- a/packages/common/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './environment'; -export * from './routes'; -export * from './config'; diff --git a/packages/common/src/routes/index.ts b/packages/common/src/routes/index.ts index 0540a9e76..cb205a644 100644 --- a/packages/common/src/routes/index.ts +++ b/packages/common/src/routes/index.ts @@ -4,10 +4,50 @@ export const removeTrailingSlash = (pathName: string): string => { return pathName.replace(/\/+$/, ''); }; -export const makeRoute = (path: string) => - removeTrailingSlash(`${env.BASE_URL}${path}`); +export const basePath = env?.BASE_HREF ? removeTrailingSlash(new URL(env!.BASE_HREF).pathname) : ''; -let baseUrl = env.BASE_URL ? env.BASE_URL : ''; -if (baseUrl.length && baseUrl[0] !== '/') { - baseUrl = `/${baseUrl}`; -} +export const pathnameWithoutBasePath = () => { + const pathnameWindow = window?.location?.pathname ?? ''; + const pathnameTrimBase = pathnameWindow.startsWith(basePath) + ? pathnameWindow.replace(basePath, '') + : pathnameWindow; + + return pathnameTrimBase; +}; + +export const legacyConsoleRouteSection = () => { + const isConsoleDisabled = env.DISABLE_CONSOLE_ROUTE_PREFIX === 'true'; + if (isConsoleDisabled) { + return ''; + } + + // backwords compatibility for legacy console routes + const isConsolePathname = (window?.location?.pathname ?? '').startsWith('/console'); + const isDashboardPathname = (window?.location?.pathname ?? '').includes('/dashboard'); + + const isLegacyConsoleRoute = isConsolePathname && !isDashboardPathname; + const dashboardUseConsole = isDashboardPathname && !isConsoleDisabled; + + const consoleSection = isLegacyConsoleRoute || dashboardUseConsole ? '/console' : ''; + + return consoleSection; +}; + +export const makeOrgAwarePath = (routePath = '/') => { + const consoleSection = !routePath.startsWith('/dashboard') ? legacyConsoleRouteSection() : ''; + + return `${basePath}${consoleSection}${routePath}`; +}; + +export const makeOrgAwarePathPattern = (routePattern = '/') => { + const consoleSection = !routePattern.startsWith('/dashboard') ? legacyConsoleRouteSection() : ''; + return `${basePath}${consoleSection}${routePattern}`; +}; + +export const makeRoute = (path: string) => { + return `${makeOrgAwarePath(removeTrailingSlash(`${path}`))}`; +}; + +export const makePathPattern = (pattern: string) => { + return `${makeOrgAwarePathPattern(`${pattern}`)}`; +}; diff --git a/packages/console/src/tsd/globals.d.ts b/packages/common/src/tsd/globals.d.ts similarity index 100% rename from packages/console/src/tsd/globals.d.ts rename to packages/common/src/tsd/globals.d.ts diff --git a/website/src/tsd/index.d.ts b/packages/common/src/tsd/index.d.ts similarity index 63% rename from website/src/tsd/index.d.ts rename to packages/common/src/tsd/index.d.ts index f4c1f6bba..15a7a4e56 100644 --- a/website/src/tsd/index.d.ts +++ b/packages/common/src/tsd/index.d.ts @@ -3,7 +3,5 @@ // These modules make sure TypeScript doesn't complain about importing image files // and let webpack load the images later. /* tslint:disable */ -/// -/// -/// +/// /* tslint:enable */ diff --git a/packages/console/src/models/AdminEntity/types.ts b/packages/common/src/types/adminEntityTypes.ts similarity index 87% rename from packages/console/src/models/AdminEntity/types.ts rename to packages/common/src/types/adminEntityTypes.ts index e772ec1e0..6aa8d03ca 100644 --- a/packages/console/src/models/AdminEntity/types.ts +++ b/packages/common/src/types/adminEntityTypes.ts @@ -1,5 +1,5 @@ -import { Admin } from '@flyteorg/flyteidl-types'; import $protobuf from 'protobufjs'; +import Admin from '../flyteidl/admin'; /** Maps filter operations to the strings which should be used in queries to the Admin API */ export enum FilterOperationName { @@ -24,16 +24,11 @@ export const SortDirection = Admin.Sort.Direction; */ export type FilterOperationValue = string | number; export type FilterOperationValueList = FilterOperationValue[]; -export type FilterOperationValueGenerator = () => - | FilterOperationValue - | FilterOperationValueList; +export type FilterOperationValueGenerator = () => FilterOperationValue | FilterOperationValueList; export interface FilterOperation { key: string; operation: FilterOperationName; - value: - | FilterOperationValue - | FilterOperationValueList - | FilterOperationValueGenerator; + value: FilterOperationValue | FilterOperationValueList | FilterOperationValueGenerator; } export type FilterOperationList = FilterOperation[]; @@ -80,6 +75,4 @@ export interface PaginatedEntityResponse { } /** A function that translates from an Admin.* entity to a local model type */ -export type AdminEntityTransformer = ( - message: T, -) => TransformedType; +export type AdminEntityTransformer = (message: T) => TransformedType; diff --git a/packages/common/tsconfig.build.es.json b/packages/common/tsconfig.build.es.json deleted file mode 100644 index 7695e5785..000000000 --- a/packages/common/tsconfig.build.es.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - - "compilerOptions": { - "outDir": "./lib" - } -} diff --git a/packages/common/tsconfig.build.json b/packages/common/tsconfig.build.json index 72af58b2a..51a1cdbc1 100644 --- a/packages/common/tsconfig.build.json +++ b/packages/common/tsconfig.build.json @@ -1,9 +1,16 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + + "composite": true + }, + "exclude": [ // files excluded from the build, we can not put it inro default tsconfig - // as it will interfere with VSCode IntelliSence + // as it will screw VSCode IntelliSence "**/test", "**/mocks", "**/__mocks__", diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json index eee8abe93..cbfffafe5 100644 --- a/packages/common/tsconfig.json +++ b/packages/common/tsconfig.json @@ -1,12 +1,5 @@ { "extends": "../../tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist", - - "composite": true - }, - "include": ["src/**/*"] } diff --git a/packages/common/tsconfig.test.json b/packages/common/tsconfig.test.json deleted file mode 100644 index fc8520e73..000000000 --- a/packages/common/tsconfig.test.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.json" -} diff --git a/packages/components/LICENSE b/packages/components/LICENSE deleted file mode 100644 index bed437514..000000000 --- a/packages/components/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Lyft, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/packages/components/README.md b/packages/components/README.md deleted file mode 100644 index aeffc85cb..000000000 --- a/packages/components/README.md +++ /dev/null @@ -1,5 +0,0 @@ - - -# @flyteorg/components · [![license](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/flyteorg/flyteconsole/blob/master/packages/components/LICENSE) [![npm](https://img.shields.io/npm/v/@flyteorg/components?color=blue)](https://www.npmjs.com/package/@flyteorg/components) [![npm bundle size](https://img.shields.io/bundlephobia/min/@flyteorg/components?color=green)](https://www.npmjs.com/package/@flyteorg/components) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/flyteorg/flyteconsole/blob/master/CONTRIBUTING.md) - -This is a component package for flyteconsole plugin system diff --git a/packages/components/jest.config.js b/packages/components/jest.config.js deleted file mode 100644 index f2ad9ca2e..000000000 --- a/packages/components/jest.config.js +++ /dev/null @@ -1,14 +0,0 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -const sharedConfig = require('../../script/test/jest.base.js'); - -module.exports = { - ...sharedConfig, - setupFilesAfterEnv: ['/../../script/test/jest-setup.ts'], - - globals: { - 'ts-jest': { - isolatedModules: true, - tsconfig: '/tsconfig.test.json', - }, - }, -}; diff --git a/packages/components/package.json b/packages/components/package.json deleted file mode 100644 index a446785df..000000000 --- a/packages/components/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "@flyteorg/components", - "version": "0.0.4", - "description": "Flyteconsole Components module, which is published as npm package and can be consumed by 3rd parties", - "main": "./dist/index.js", - "module": "./lib/index.js", - "types": "./lib/index.d.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "repository": { - "type": "git", - "url": "https://github.com/flyteorg/flyteconsole.git", - "directory": "packages/components" - }, - "keywords": [ - "flyteorg", - "flyteconsole", - "react", - "components" - ], - "files": [ - "LICENSE", - "README.md", - "dist", - "lib", - "node_modules" - ], - "installConfig": { - "hoistingLimits": "workspaces" - }, - "scripts": { - "clean": "rm -rf dist && rm -rf lib && rm -rf **.tsbuildinfo || true", - "build:watch": "run -T tsc-watch --noClear --signalEmittedFiles -p ./tsconfig.build.es.json --onSuccess \"yarn build:watch:success\"", - "build:watch:success": "yarn build:esm:alias && yalc push --force", - "build": "yarn clean && yarn build:esm && yarn build:cjs", - "build:esm": "run -T tsc --module esnext --project ./tsconfig.build.es.json && yarn build:esm:alias", - "build:esm:alias": "run -T tsc-alias -p ./tsconfig.build.es.json", - "build:cjs": "run -T tsc --project ./tsconfig.build.json && run -T tsc-alias -p ./tsconfig.build.json", - "build:types": "run -T tsc --module esnext --project ./tsconfig.build.es.json --emitDeclarationOnly && run -T tsc-alias -p ./tsconfig.build.es.json", - "test": "NODE_ENV=test jest" - }, - "dependencies": { - "@flyteorg/locale": "^0.0.2", - "@flyteorg/ui-atoms": "^0.0.4", - "@material-ui/core": "^4.0.0", - "@material-ui/icons": "^4.0.0", - "classnames": "^2.3.1" - }, - "peerDependencies": { - "react": "^16.13.1", - "react-dom": "^16.13.1" - }, - "devDependencies": { - "@types/react": "^16.9.34", - "@types/react-dom": "^16.9.7" - } -} diff --git a/packages/components/src/AppInfo/__mocks__/appInfo.mock.ts b/packages/components/src/AppInfo/__mocks__/appInfo.mock.ts deleted file mode 100644 index 059e5b687..000000000 --- a/packages/components/src/AppInfo/__mocks__/appInfo.mock.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { VersionInfo } from '../versionDisplay'; - -export const generateVersionInfo = ( - name: string, - version: string, -): VersionInfo => { - return { - name: name, - version: version, - url: `#some.fake.link/${name}/v${version}`, - }; -}; diff --git a/packages/components/src/AppInfo/__stories__/appInfo.stories.tsx b/packages/components/src/AppInfo/__stories__/appInfo.stories.tsx deleted file mode 100644 index 4a9f98056..000000000 --- a/packages/components/src/AppInfo/__stories__/appInfo.stories.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import * as React from 'react'; -import { ComponentStory, ComponentMeta } from '@storybook/react'; -import { Card, CardContent } from '@material-ui/core'; -import { AppInfo, INFO_WINDOW_WIDTH } from '..'; -import { generateVersionInfo } from '../__mocks__/appInfo.mock'; -import { VersionDisplay } from '../versionDisplay'; - -export default { - title: 'Components/AppInfo', - component: AppInfo, -} as ComponentMeta; - -const Template: ComponentStory = props => ( - -); - -export const Default = Template.bind({}); -Default.args = { - versions: [ - generateVersionInfo('UI Version', '1.22.134'), - generateVersionInfo('Admin Version', '3.2.1'), - generateVersionInfo('Google Analytics', 'Active'), - ], - documentationUrl: 'here.is/some/link#', -}; - -export const ContentOnly = Template.bind({}); -ContentOnly.args = { - versions: [ - generateVersionInfo('Normal', '1.8.13'), - generateVersionInfo('Long Version', 'Very Uncomfortable'), - generateVersionInfo( - 'Long Name for all those who are interested in future endeavors', - '1.23.12', - ), - ], - documentationUrl: 'here.is/some/link#', -}; -ContentOnly.decorators = [ - (_Story, context) => { - return ( - - - - - - ); - }, -]; diff --git a/packages/components/src/AppInfo/index.tsx b/packages/components/src/AppInfo/index.tsx deleted file mode 100644 index e44120b70..000000000 --- a/packages/components/src/AppInfo/index.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import * as React from 'react'; -import { - Dialog, - DialogContent, - DialogTitle, - IconButton, - makeStyles, - Theme, -} from '@material-ui/core'; -import { InfoIcon } from '@flyteorg/ui-atoms'; -import CloseIcon from '@material-ui/icons/Close'; -import { VersionDisplay, VersionDisplayProps } from './versionDisplay'; - -export type { VersionInfo } from './versionDisplay'; - -export const INFO_WINDOW_WIDTH = 260; - -const useStyles = makeStyles((theme: Theme) => ({ - infoIcon: { - cursor: 'pointer', - backgroundColor: 'initial', - }, - closeButton: { - position: 'absolute', - right: theme.spacing(0.5), - top: theme.spacing(0.5), - }, - content: { - paddingBottom: theme.spacing(2), - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - overflowY: 'initial', - }, - dialog: { - width: `${INFO_WINDOW_WIDTH}px`, - maxWidth: `calc(100% - ${theme.spacing(2)}px)`, - maxHeight: `calc(100% - ${theme.spacing(2)}px)`, - }, -})); - -export const AppInfo = (props: VersionDisplayProps) => { - const [showVersionInfo, setShowVersionInfo] = React.useState(false); - - const styles = useStyles(); - - const onCloseDialog = () => setShowVersionInfo(false); - return ( - <> - setShowVersionInfo(true)} - /> - - - - - - - - - - - - - ); -}; diff --git a/packages/components/src/AppInfo/strings.ts b/packages/components/src/AppInfo/strings.ts deleted file mode 100644 index 310c5dc5f..000000000 --- a/packages/components/src/AppInfo/strings.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createLocalizedString } from '@flyteorg/locale'; - -const str = { - modalTitle: 'Flyte Console', - docsLink: 'Documentation Link:', -}; - -export { patternKey } from '@flyteorg/locale'; -export default createLocalizedString(str); diff --git a/packages/components/src/AppInfo/test/appInfo.test.tsx b/packages/components/src/AppInfo/test/appInfo.test.tsx deleted file mode 100644 index c7025998d..000000000 --- a/packages/components/src/AppInfo/test/appInfo.test.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import * as React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react'; - -import { VersionDisplay } from '../versionDisplay'; -import { AppInfo } from '..'; -import t from '../strings'; -import { generateVersionInfo } from '../__mocks__/appInfo.mock'; - -describe('appInfo', () => { - it('Info icon opens VersionDisplay on click', async () => { - const title = t('modalTitle'); - const { getByTestId, queryByText } = render( - , - ); - - // click on the icon to open modal - const infoIcon = getByTestId('infoIcon'); - await fireEvent.click(infoIcon); - await waitFor(() => { - expect(queryByText(title)).toBeInTheDocument(); - }); - - // click on close button should close modal - const closeButton = getByTestId('closeButton'); - await fireEvent.click(closeButton); - await waitFor(() => expect(queryByText(title)).not.toBeInTheDocument()); - }); - - it('VersionDisplay shows provided versions', async () => { - const versions = [ - generateVersionInfo('UI Version', 'Active'), - generateVersionInfo('Admin Version', '3.2.112'), - ]; - - const { queryByText } = render( - , - ); - - // click on the icon to open modal - await waitFor(() => { - expect(queryByText('UI Version')).toBeInTheDocument(); - expect(queryByText('Active')).toBeInTheDocument(); - - expect(queryByText('Admin Version')).toBeInTheDocument(); - expect(queryByText('3.2.112')).toBeInTheDocument(); - }); - }); -}); diff --git a/packages/components/src/AppInfo/versionDisplay.tsx b/packages/components/src/AppInfo/versionDisplay.tsx deleted file mode 100644 index db6b3afdb..000000000 --- a/packages/components/src/AppInfo/versionDisplay.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import * as React from 'react'; -import classnames from 'classnames'; -import { Link, makeStyles, Theme } from '@material-ui/core'; -import { FlyteLogo } from '@flyteorg/ui-atoms'; -import t from './strings'; - -const headerFontFamily = '"Open Sans", helvetica, arial, sans-serif'; - -/* eslint-disable no-dupe-keys */ -const useStyles = makeStyles((theme: Theme) => ({ - title: { - fontFamily: headerFontFamily, - fontWeight: 'bold', - fontSize: '16px', - lineHeight: '22px', - margin: theme.spacing(1, 0), - color: '#000', - }, - versionsContainer: { - width: '100%', - margin: theme.spacing(3), - padding: theme.spacing(0, 1), - }, - versionWrapper: { - display: 'flex', - justifyContent: 'space-between', - marginBottom: theme.spacing(1), - }, - versionName: { - fontFamily: 'Apple SD Gothic Neo', - fontWeight: 'normal', - fontSize: '14px', - lineHeight: '17px', - color: '#636379', - }, - versionLink: { - color: '#1982E3', - fontSize: '14px', - marginLeft: theme.spacing(1), - }, -})); - -export type VersionInfo = { - name: string; - version: string; - url: string; -}; - -export interface VersionDisplayProps { - versions: VersionInfo[]; - documentationUrl: string; -} - -export const VersionDisplay = (props?: VersionDisplayProps): JSX.Element => { - const styles = useStyles(); - - const VersionItem = (info: VersionInfo) => { - return ( -
- {info.name} - - {info.version} - -
- ); - }; - - const versionsList = props?.versions?.map(info => VersionItem(info)); - - return ( - <> -
- -
-
{t('modalTitle')}
- -
{versionsList}
- -
{t('docsLink')}
- - {props?.documentationUrl} - - - ); -}; diff --git a/packages/components/src/Sample/__stories__/sample.stories.tsx b/packages/components/src/Sample/__stories__/sample.stories.tsx deleted file mode 100644 index 17abe23e1..000000000 --- a/packages/components/src/Sample/__stories__/sample.stories.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import * as React from 'react'; -import { ComponentStory, ComponentMeta } from '@storybook/react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; - -import { SampleComponent } from '..'; - -export default { - title: 'Components/Sample', - component: SampleComponent, -} as ComponentMeta; - -const useStyles = makeStyles((_theme: Theme) => ({ - updatedOne: { - backgroundColor: 'lightblue', - color: 'black', - }, - updatedTwo: { - backgroundColor: 'black', - color: 'yellow', - }, -})); - -const Template: ComponentStory = () => ( - -); -export const Primary = Template.bind({}); - -export const Secondary: ComponentStory = () => { - const styles = useStyles(); - return ; -}; - -export const Tertiary: ComponentStory = () => { - const styles = useStyles(); - return ; -}; diff --git a/packages/components/src/Sample/index.tsx b/packages/components/src/Sample/index.tsx deleted file mode 100644 index 0e77173e6..000000000 --- a/packages/components/src/Sample/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import * as React from 'react'; -import { - AppBar, - Toolbar, - IconButton, - makeStyles, - Theme, -} from '@material-ui/core'; -import MenuIcon from '@material-ui/icons/Menu'; - -const useStyles = makeStyles((theme: Theme) => ({ - spacer: { - flexGrow: 1, - }, - menuButton: { - marginRight: theme.spacing(2), - }, -})); - -export interface SampleComponentProps { - useCustomContent?: boolean; // rename to show that it is a backNavigation - className?: string; -} - -/** Contains all content in the top navbar of the application. */ -export const SampleComponent = (props: SampleComponentProps) => { - const styles = useStyles(); - - return ( - - -
- {' Sample Text '} -
- - - - - - ); -}; diff --git a/packages/components/src/Sample/test/sample.test.tsx b/packages/components/src/Sample/test/sample.test.tsx deleted file mode 100644 index 0c8845ab9..000000000 --- a/packages/components/src/Sample/test/sample.test.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import * as React from 'react'; -import { render, screen } from '@testing-library/react'; -import { SampleComponent } from '../index'; - -describe('add function', () => { - it('SampleComponent is rendered contains correct text', () => { - render(); - const text = screen.getByText('Sample Text'); - expect(text).toBeInTheDocument(); - }); -}); diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts deleted file mode 100644 index c016877a5..000000000 --- a/packages/components/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { AppInfo, type VersionInfo } from './AppInfo'; diff --git a/packages/components/tsconfig.build.es.json b/packages/components/tsconfig.build.es.json deleted file mode 100644 index dd0ff3005..000000000 --- a/packages/components/tsconfig.build.es.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - - "compilerOptions": { - "outDir": "./lib" - }, - - "references": [ - { - "path": "../locale/tsconfig.build.es.json" - }, - { - "path": "../ui-atoms/tsconfig.build.es.json" - } - ] -} diff --git a/packages/components/tsconfig.build.json b/packages/components/tsconfig.build.json deleted file mode 100644 index 3cb0b481e..000000000 --- a/packages/components/tsconfig.build.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "extends": "./tsconfig.json", - - "references": [ - { - "path": "../locale/tsconfig.build.json" - }, - { - "path": "../ui-atoms/tsconfig.build.json" - } - ], - - "exclude": [ - // files excluded from the build, we can not put it inro default tsconfig - // as it will interfere with VSCode IntelliSence - "node_modules", - "src/Sample", - "**/test", - "**/mocks", - "**/__mocks__", - "**/__stories__", - "**/*.spec.*", - "**/*.test.*", - "**/*.mock.*", - "**/*.stories.*" - ] -} diff --git a/packages/components/tsconfig.json b/packages/components/tsconfig.json deleted file mode 100644 index 1e7ed8ed4..000000000 --- a/packages/components/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": "../../tsconfig.json", - - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist", - - "composite": true, - - "paths": { - "@flyteorg/*": ["../packages/*/src"] - } - }, - - "include": ["src/**/*"], - - "references": [ - { - "path": "../locale" - }, - { - "path": "../ui-atoms" - } - ] -} diff --git a/packages/components/tsconfig.test.json b/packages/components/tsconfig.test.json deleted file mode 100644 index 232d6ca25..000000000 --- a/packages/components/tsconfig.test.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "references": [ - { - "path": "../locale/tsconfig.test.json" - }, - { - "path": "../ui-atoms/tsconfig.test.json" - } - ] -} diff --git a/packages/console/LICENSE b/packages/console/LICENSE deleted file mode 100644 index bed437514..000000000 --- a/packages/console/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Lyft, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/packages/console/README.md b/packages/console/README.md deleted file mode 100644 index 17aa3afd8..000000000 --- a/packages/console/README.md +++ /dev/null @@ -1,5 +0,0 @@ - - -# @flyteorg/console · [![license](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/flyteorg/flyteconsole/blob/master/packages/console/LICENSE) [![npm](https://img.shields.io/npm/v/@flyteorg/console?color=blue)](https://www.npmjs.com/package/@flyteorg/console) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/flyteorg/flyteconsole/blob/master/CONTRIBUTING.md) - -This is a component package for flyteconsole plugin system diff --git a/packages/console/jest.config.ts b/packages/console/jest.config.ts deleted file mode 100644 index 54a90bd4b..000000000 --- a/packages/console/jest.config.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ - -const sharedConfig = require('../../script/test/jest.base.js'); - -const jestConfig = { - ...sharedConfig, - setupFilesAfterEnv: ['/src/test/setupTests.ts'], - rootDir: './', - transform: { - '^.+\\.(j|t)sx?$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, - extensionsToTreatAsEsm: ['.ts'], - - modulePaths: ['/src'], - roots: ['/src'], - transformIgnorePatterns: [ - '../../node_modules/(?!@flyteorg/flyteidl/)', - '../../node_modules/(?!@rjsf)(.*)', - ], - - coveragePathIgnorePatterns: [ - ...sharedConfig.coveragePathIgnorePatterns, - '__stories__', - 'src/components/App.tsx', - 'src/tsd', - 'src/client.tsx', - 'src/protobuf.ts', - 'src/server.ts', - ], -}; - -export default jestConfig; diff --git a/packages/console/package.json b/packages/console/package.json deleted file mode 100644 index 77b1c0b1e..000000000 --- a/packages/console/package.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "name": "@flyteorg/console", - "version": "0.0.51", - "description": "Flyteconsole main app module", - "main": "./dist/index.js", - "module": "./lib/index.js", - "types": "./lib/index.d.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "repository": { - "type": "git", - "url": "https://github.com/flyteorg/flyteconsole.git", - "directory": "packages/console" - }, - "files": [ - "LICENSE", - "README.md", - "dist", - "lib", - "node_modules", - "src" - ], - "keywords": [ - "flyteorg", - "flyteconsole", - "react", - "console" - ], - "scripts": { - "debug": "NM_DEBUG_LEVEL=2 yarn", - "clean": "rm -rf dist && rm -rf lib && rm -rf **.tsbuildinfo || true", - "build:watch": "run -T tsc-watch --noClear --signalEmittedFiles -p ./tsconfig.build.es.json --onSuccess \"yarn build:watch:success\"", - "build:watch:success": "yarn build:esm:alias && yalc push --force", - "build": "yarn clean && yarn build:esm && yarn build:cjs", - "build:esm": "mkdir lib && cp -R src/assets ./lib && run -T tsc --module esnext --project ./tsconfig.build.es.json && yarn build:esm:alias", - "build:esm:alias": "run -T tsc-alias -p ./tsconfig.build.es.json", - "build:cjs": "mkdir dist && cp -R src/assets ./dist && run -T wait-on ./dist/assets && run -T tsc --project ./tsconfig.build.json && run -T tsc-alias -p ./tsconfig.build.json", - "build:types": "run -T tsc --module esnext --project ./tsconfig.build.es.json --emitDeclarationOnly && run -T tsc-alias -p ./tsconfig.build.es.json", - "test": "NODE_ENV=test jest" - }, - "installConfig": { - "hoistingLimits": "workspaces" - }, - "peerDependencies": { - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "react": "^16.14.0", - "react-dom": "^16.14.0", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "use-react-router": "^1.0.7" - }, - "dependencies": { - "@date-io/moment": "1.3.9", - "@emotion/core": "10.1.1", - "@flyteorg/common": "^0.0.4", - "@flyteorg/components": "^0.0.4", - "@flyteorg/flyte-api": "^0.0.2", - "@flyteorg/flyteidl-types": "^0.0.4", - "@flyteorg/locale": "^0.0.2", - "@flyteorg/ui-atoms": "^0.0.4", - "@material-ui/core": "^4.12.4", - "@material-ui/icons": "^4.11.3", - "@material-ui/pickers": "^3.2.2", - "@rjsf/core": "^5.1.0", - "@rjsf/material-ui": "^5.1.0", - "@rjsf/utils": "^5.1.0", - "@rjsf/validator-ajv8": "^5.1.0", - "@types/d3-shape": "^1.2.6", - "@xstate/react": "^1.0.0", - "axios": "^0.27.2", - "chart.js": "3.6.2", - "chartjs-plugin-datalabels": "2.0.0", - "classnames": "^2.3.1", - "copy-to-clipboard": "^3.0.8", - "cronstrue": "^1.31.0", - "d3-dag": "^0.3.4", - "d3-shape": "^1.2.2", - "dagre": "0.8.5", - "dagre-d3": "^0.6.4", - "debug": "2.6.9", - "dom-helpers": "5.2.1", - "fuzzysort": "^1.1.1", - "intersection-observer": "^0.7.0", - "js-yaml": "^3.13.1", - "linkify-it": "^2.2.0", - "lodash": "^4.17.21", - "lossless-json": "^1.0.3", - "memoize-one": "^5.0.0", - "moment": "^2.29.4", - "moment-timezone": "^0.5.28", - "notistack": "^1.0.10", - "object-hash": "^1.3.1", - "prop-types": "15.6.0", - "query-string": "^6.5.0", - "react-chartjs-2": "^4.3.1", - "react-dropzone": "^14.2.3", - "react-flow-renderer": "10.3.8", - "react-ga4": "^1.4.1", - "react-intersection-observer": "^8.25.1", - "react-json-view": "^1.21.3", - "react-loading-skeleton": "^1.1.2", - "react-query": "3.3.0", - "react-query-devtools": "3.0.0-beta.1", - "react-virtualized": "^9.21.1", - "shallowequal": "^1.1.0", - "traverse": "^0.6.7", - "url-search-params": "^0.10.0", - "xstate": "4.33.6" - }, - "devDependencies": { - "@types/debug": "^0.0.30", - "@types/dom-helpers": "^5.0.1", - "@types/js-yaml": "^3.10.1", - "@types/linkify-it": "^2.1.0", - "@types/lodash": "^4.14.68", - "@types/long": "^3.0.32", - "@types/lossless-json": "^1.0.0", - "@types/memoize-one": "^4.1.0", - "@types/memory-fs": "^0.3.0", - "@types/moment-timezone": "^0.5.13", - "@types/object-hash": "^1.2.0", - "@types/pure-render-decorator": "^0.2.27", - "@types/react": "^16.9.34", - "@types/react-dom": "^16.9.7", - "@types/react-router-dom": "^5.3.3", - "@types/react-virtualized": "^9.21.4", - "@types/serve-static": "^1.7.31", - "@types/shallowequal": "^0.2.3" - }, - "resolutions": { - "react": "^16.13.1", - "dom-helpers": "5.2.1", - "react-dom": "^16.13.1", - "micromatch": "^4.0.0", - "@types/react": "^16.9.34", - "@types/react-dom": "^16.9.7", - "react-chartjs-2": "^4.0.0", - "react-flow-renderer": "10.3.8", - "notistack": "1.0.10" - } -} diff --git a/packages/console/src/assets/SmallArrow.svg b/packages/console/src/assets/SmallArrow.svg deleted file mode 100644 index 3a0c20bfc..000000000 --- a/packages/console/src/assets/SmallArrow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/console/src/basics/ExternalConfigHoc.tsx b/packages/console/src/basics/ExternalConfigHoc.tsx deleted file mode 100644 index 1dc35424f..000000000 --- a/packages/console/src/basics/ExternalConfigHoc.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import * as React from 'react'; - -export const ExternalConfigHoc = ({ ChildComponent, data }): any => { - return ; -}; diff --git a/packages/console/src/basics/ExternalConfigurationProvider/ExternalConfigurationProvider.tsx b/packages/console/src/basics/ExternalConfigurationProvider/ExternalConfigurationProvider.tsx deleted file mode 100644 index 9051ff4da..000000000 --- a/packages/console/src/basics/ExternalConfigurationProvider/ExternalConfigurationProvider.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React, { PropsWithChildren, useContext } from 'react'; -import { AppConfig } from '@flyteorg/common'; -import { Breadcrumb } from 'components'; - -export interface ExternalConfigurationProviderProps { - registry?: { - nav?: React.FC; - topLevelLayout?: React.FC; - taskExecutionAttemps?: React.FC; - additionalRoutes?: any[]; - breadcrumbs?: Breadcrumb[]; - }; - env?: any; - config?: AppConfig; -} - -export const ExternalConfigurationContext = - React.createContext({}); - -export const ExternalConfigurationProvider = ({ - children, - config, - env, - registry, -}: PropsWithChildren) => { - return ( - - {children} - - ); -}; - -export const useExternalConfigurationContext = () => - useContext(ExternalConfigurationContext); diff --git a/packages/console/src/basics/ExternalConfigurationProvider/index.ts b/packages/console/src/basics/ExternalConfigurationProvider/index.ts deleted file mode 100644 index e1c599476..000000000 --- a/packages/console/src/basics/ExternalConfigurationProvider/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ExternalConfigurationProvider'; diff --git a/packages/console/src/basics/FeatureFlags/AdminFlag.tsx b/packages/console/src/basics/FeatureFlags/AdminFlag.tsx deleted file mode 100644 index 1fe5fc2ec..000000000 --- a/packages/console/src/basics/FeatureFlags/AdminFlag.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { useAdminVersion } from 'components/hooks/useVersion'; -import { AdminFlag, AdminVersion, baseAdminConfig } from './defaultConfig'; - -export const useIsEnabledInAdmin = (flag: AdminFlag): boolean => { - const { adminVersion } = useAdminVersion(); - if (!adminVersion || adminVersion === '') { - return false; - } - - // Split version to two array items - [Major][Minor.Patch] - const versionSplit = adminVersion.replace(/\./, '&').split('&'); - const curVersion: AdminVersion = { - major: parseInt(versionSplit[0], 10) ?? 0, - minor: parseFloat(versionSplit[1]) ?? 0.1, - }; - - const requieredVersion = baseAdminConfig[flag] ?? null; - // required version is less or equal current version - return true. - if ( - requieredVersion && - (requieredVersion.major < curVersion.major || - (requieredVersion.major === curVersion.major && - requieredVersion.minor <= curVersion.minor)) - ) { - return true; - } - - return false; -}; diff --git a/packages/console/src/basics/FeatureFlags/FeatureFlags.test.tsx b/packages/console/src/basics/FeatureFlags/FeatureFlags.test.tsx deleted file mode 100644 index 60f30322c..000000000 --- a/packages/console/src/basics/FeatureFlags/FeatureFlags.test.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import * as React from 'react'; -import { render, screen, waitFor, act } from '@testing-library/react'; - -import { useAdminVersion } from 'components/hooks/useVersion'; -import { FeatureFlagsProvider, useFeatureFlag } from '.'; -import { AdminFlag, FeatureFlag } from './defaultConfig'; -import { useIsEnabledInAdmin } from './AdminFlag'; - -jest.mock('components/hooks/useVersion'); - -function TestContent() { - const enabledTestFlag = useFeatureFlag(FeatureFlag.TestFlagUndefined); - return ( - - - - ); -} - -function TestPage() { - return ( - - - - ); -} - -declare global { - interface Window { - setFeatureFlag: (flag: FeatureFlag, newValue: boolean) => void; - getFeatureFlag: (flag: FeatureFlag) => boolean; - clearRuntimeConfig: () => void; - } -} - -describe('FeatureFlags', () => { - beforeEach(() => { - render(); - }); - - afterEach(() => { - window.clearRuntimeConfig(); - }); - - it('Feature flags can be read/set from dev tools', async () => { - // flag defined and return proper value - expect(window.getFeatureFlag(FeatureFlag.TestFlagTrue)).toBeTruthy(); - // flag undefined and returns false - expect(window.getFeatureFlag(FeatureFlag.TestFlagUndefined)).toBeFalsy(); - - await act(() => window.setFeatureFlag(FeatureFlag.TestFlagUndefined, true)); - await waitFor(() => { - // check that flag cghanged value - expect(window.getFeatureFlag(FeatureFlag.TestFlagUndefined)).toBeTruthy(); - }); - }); - - it('useFeatureFlags returns proper live value', async () => { - // default value - flag is disabled - expect(screen.getByText(/Disabled/i)).toBeTruthy(); - - // Enable flag - await act(() => window.setFeatureFlag(FeatureFlag.TestFlagUndefined, true)); - await waitFor(() => { - // check that component was updated accordingly - expect(screen.getByText(/Enabled/i)).toBeTruthy(); - }); - }); -}); - -describe('AdminFlags', () => { - const mockAdminVersion = useAdminVersion as jest.Mock< - ReturnType - >; - it('useIsEnabledInAdmin returns FALSE if flag is not initialized', () => { - mockAdminVersion.mockReturnValue({ adminVersion: '0.1.23' }); - const isAdminEnabled = useIsEnabledInAdmin(AdminFlag.TestFlagUndefined); - - expect(isAdminEnabled).toBeFalsy(); - }); - - it('useIsEnabledInAdmin returns FALSE if current MINOR version is below required', () => { - mockAdminVersion.mockReturnValue({ adminVersion: '1.2.3' }); - const isAdminEnabled = useIsEnabledInAdmin(AdminFlag.TestFlagUndefined); - - expect(isAdminEnabled).toBeFalsy(); - }); - - it('useIsEnabledInAdmin returns FALSE if current MAJOR version is below required', () => { - mockAdminVersion.mockReturnValue({ adminVersion: '0.3.45' }); - const isAdminEnabled = useIsEnabledInAdmin(AdminFlag.TestFlagUndefined); - - expect(isAdminEnabled).toBeFalsy(); - }); - - it('useIsEnabledInAdmin return TRUE when current version equals required', () => { - mockAdminVersion.mockReturnValue({ adminVersion: '1.2.34' }); - const isAdminEnabled = useIsEnabledInAdmin(AdminFlag.TestAdminVersion); - - expect(isAdminEnabled).toBeTruthy(); - }); - - it('useIsEnabledInAdmin return TRUE when current MINOR version above required', () => { - mockAdminVersion.mockReturnValue({ adminVersion: '1.2.37' }); - const isAdminEnabled = useIsEnabledInAdmin(AdminFlag.TestAdminVersion); - - expect(isAdminEnabled).toBeTruthy(); - }); - - it('useIsEnabledInAdmin return TRUE when current MAJOR version above required', () => { - mockAdminVersion.mockReturnValue({ adminVersion: '2.1.1' }); - const isAdminEnabled = useIsEnabledInAdmin(AdminFlag.TestAdminVersion); - - expect(isAdminEnabled).toBeTruthy(); - }); -}); diff --git a/packages/console/src/basics/FeatureFlags/defaultConfig.ts b/packages/console/src/basics/FeatureFlags/defaultConfig.ts deleted file mode 100644 index ac9bf9244..000000000 --- a/packages/console/src/basics/FeatureFlags/defaultConfig.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Default Feature Flag config - used for features in developement. - */ - -export enum FeatureFlag { - // Test flag is created only for unit-tests - TestFlagUndefined = 'test-flag-undefined', - TestFlagTrue = 'test-flag-true', - - // Production flags - LaunchPlan = 'launch-plan', - - // Makes the header inline with the content - HorizontalLayout = 'horizontal-layout', - - // Replace the page header with the breadcrumb context navigation with related item quicklinks - breadcrumbs = 'breadcrumbs', - - // Test Only Mine flag - OnlyMine = 'only-mine', -} - -export type FeatureFlagConfig = { [k: string]: boolean }; - -export const defaultFlagConfig: FeatureFlagConfig = { - // Test - 'test-flag-true': true, - - // Production - new code should be turned off by default - // If you need to turn it on locally -> update runtimeConfig in ./index.tsx file - 'launch-plan': false, - - 'horizontal-layout': false, - - breadcrumbs: false, - - 'only-mine': false, -}; - -export interface AdminVersion { - major: number; // Int - major version - minor: number; // Float - minor.patch version -} - -export enum AdminFlag { - // Test flag is created only for unit-tests - TestAdminVersion = 'admin.test-version', - TestFlagUndefined = 'admin.test-undefined', - - // Production flags - MapTasks = 'admin.map-tasks', // 0.6.126', -} - -export type AdminFlagConfig = { [k: string]: AdminVersion }; -export const baseAdminConfig: AdminFlagConfig = { - 'admin.test-version': { major: 1, minor: 2.34 }, - - // Production flags - // Specified and upper versions are treated as ON, lower version turn feature OFF - 'admin.map-tasks': { major: 0, minor: 6.126 }, -}; diff --git a/packages/console/src/basics/FeatureFlags/index.tsx b/packages/console/src/basics/FeatureFlags/index.tsx deleted file mode 100644 index cc334e675..000000000 --- a/packages/console/src/basics/FeatureFlags/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export { FeatureFlag } from './defaultConfig'; -export { - useFeatureFlag, - useFeatureFlagContext, - FeatureFlagsProvider, -} from './FeatureFlags'; -export { useIsEnabledInAdmin } from './AdminFlag'; diff --git a/packages/console/src/basics/index.ts b/packages/console/src/basics/index.ts deleted file mode 100644 index 9010fa09d..000000000 --- a/packages/console/src/basics/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { - type ExternalConfigurationProviderProps, - ExternalConfigurationProvider, -} from './ExternalConfigurationProvider'; diff --git a/packages/console/src/common/index.ts b/packages/console/src/common/index.ts deleted file mode 100644 index e3e1c5534..000000000 --- a/packages/console/src/common/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { navbarGridHeight } from './layout'; -export { unknownValueString } from './constants'; -export { dateWithFromNow, protobufDurationToHMS } from './formatters'; -export { timestampToDate } from './utils'; diff --git a/packages/console/src/common/promiseUtils.ts b/packages/console/src/common/promiseUtils.ts deleted file mode 100644 index e40cdbd38..000000000 --- a/packages/console/src/common/promiseUtils.ts +++ /dev/null @@ -1,11 +0,0 @@ -export function resolveAfter(waitMs: number, value: T): Promise { - return new Promise(resolve => { - setTimeout(() => resolve(value), waitMs); - }); -} - -export function rejectAfter(waitMs: number, reason: string): Promise { - return new Promise((_resolve, reject) => { - setTimeout(() => reject(reason), waitMs); - }); -} diff --git a/packages/console/src/common/timer.ts b/packages/console/src/common/timer.ts deleted file mode 100644 index 67903dc07..000000000 --- a/packages/console/src/common/timer.ts +++ /dev/null @@ -1,20 +0,0 @@ -class Timer { - public readonly startTime = window.performance.now(); - - public get time() { - return window.performance.now() - this.startTime; - } - - public get timeStringMS() { - return `${this.time.toFixed(2)}ms`; - } -} - -/** Returns a simple object to allow precision timing based on - * window.performance. On construction, the current timestamp is read. - * Subsequent calls to the accessor functions will return the time elapsed since - * `startTime` was sampled. - */ -export function createTimer() { - return new Timer(); -} diff --git a/packages/console/src/components/App/App.tsx b/packages/console/src/components/App/App.tsx deleted file mode 100644 index fdcb30262..000000000 --- a/packages/console/src/components/App/App.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import 'intersection-observer'; -import * as React from 'react'; -import { - CssBaseline, - Collapse, - StylesProvider, - createGenerateClassName, -} from '@material-ui/core'; -import { ThemeProvider } from '@material-ui/styles'; -import { FlyteApiProvider } from '@flyteorg/flyte-api'; -import { SnackbarProvider } from 'notistack'; -import { FeatureFlagsProvider } from 'basics/FeatureFlags'; -import { env, updateEnv } from '@flyteorg/common'; -import { debug, debugPrefix } from 'common/log'; -import { ErrorBoundary } from 'components/common/ErrorBoundary'; -import { APIContext, useAPIState } from 'components/data/apiContext'; -import { QueryAuthorizationObserver } from 'components/data/QueryAuthorizationObserver'; -import { createQueryClient } from 'components/data/queryCache'; -import { SystemStatusBanner } from 'components/Notifications/SystemStatusBanner'; -import { - skeletonColor, - skeletonHighlightColor, - updateConstants, -} from 'components/Theme/constants'; -import { getMuiTheme } from 'components/Theme/muiTheme'; -import { SkeletonTheme } from 'react-loading-skeleton'; -import { QueryClientProvider } from 'react-query'; -import { ReactQueryDevtools } from 'react-query-devtools'; -import { Router } from 'react-router-dom'; -import { ApplicationRouter } from 'routes/ApplicationRouter'; -import { history } from 'routes/history'; -import { LocalCacheProvider } from 'basics/LocalCache/ContextProvider'; -import { - ExternalConfigurationProvider, - ExternalConfigurationProviderProps, -} from 'basics/ExternalConfigurationProvider'; -import TopLevelLayoutProvider from 'components/Navigation/TopLevelLayoutState'; -import TopLevelLayout from 'components/Navigation/TopLevelLayout'; -import NavBar from 'components/Navigation/NavBar'; -import { SideNavigation } from 'components/Navigation/SideNavigation'; -import GlobalStyles from 'components/utils/GlobalStyles'; - -export type AppComponentProps = ExternalConfigurationProviderProps; - -const queryClient = createQueryClient(); -let overrided = false; - -export const AppComponent: React.FC = ( - props: AppComponentProps, -) => { - if (!overrided) { - updateEnv(props.env); - updateConstants(props.config); - overrided = true; - } - - if (env.NODE_ENV === 'development') { - debug.enable(`${debugPrefix}*:*`); - } - const apiState = useAPIState(); - - const horizontalLayoutFlag = - `${env.HORIZONTAL_LAYOUT}`.trim().toLowerCase() === 'true'; - - const breadcrumbsFlag = `${env.BREADCRUMBS}`.trim().toLowerCase() === 'true'; - - return ( - - - - - - - - - - - - - - - - - } - sideNavigationComponent={} - routerView={} - isHorizontalLayout={horizontalLayoutFlag} - /> - - - - - - - - - - - - - - - - ); -}; - -export const App = AppComponent; diff --git a/packages/console/src/components/Breadcrumbs/async/utils.ts b/packages/console/src/components/Breadcrumbs/async/utils.ts deleted file mode 100644 index c95e63d38..000000000 --- a/packages/console/src/components/Breadcrumbs/async/utils.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { timestampToDate } from 'common'; -import { formatDateUTC } from 'common/formatters'; -import { Project } from 'models/Project/types'; -import { Routes } from 'routes'; -import { BreadcrumbEntity } from '../types'; - -export const formatEntities = data => { - return data.entities.map(entity => { - return { - title: entity.id.name, - createdAt: entity?.closure?.createdAt - ? formatDateUTC(timestampToDate(entity.closure.createdAt)) - : '', - url: Routes.WorkflowDetails.makeUrl( - entity.id.project, - entity.id.domain, - entity.id.name, - ), - }; - }); -}; - -export const formatVersions = (data, resourceUrl) => { - return data.entities.map(entity => { - return { - title: entity.id.version, - createdAt: entity?.closure?.createdAt - ? formatDateUTC(timestampToDate(entity.closure.createdAt)) - : '', - url: Routes.EntityVersionDetails.makeUrl( - entity.id.project, - entity.id.domain, - entity.id.name, - resourceUrl, - entity.id.version, - ), - }; - }) as BreadcrumbEntity[]; -}; - -export const projectIdfromUrl = () => { - const path = window.location.pathname.split('/'); - const projectIdIndex = path.indexOf('projects') + 1; - return path[projectIdIndex]; -}; - -export const domainIdfromUrl = (location: Location) => { - const path = location.pathname.split('/'); - if (path.indexOf('domains') > -1) { - return path[path.indexOf('domains') + 1] || ''; - } - if (location.search.includes('domain')) { - const searchParams = new URLSearchParams(location.search); - return searchParams.get('domain') || ''; - } - - return ''; -}; - -export const formatProjectEntities = (data: Project[], domain?: string) => { - return data.map(project => { - const url = Routes.ProjectDetails.sections.dashboard.makeUrl( - project.id, - domain, - ); - - return { - title: project.name, - createdAt: '', - url, - }; - }); -}; - -export const formatProjectEntitiesAsDomains = ( - data: Project[] = [], - projectId = '', -) => { - if (!data.length) return []; - - const project = data.find(p => p.id === projectId) || data[0]; - - return project.domains.map(domain => { - const url = Routes.ProjectDetails.sections.dashboard.makeUrl( - project.id, - domain.id, - ); - - return { - title: domain.name, - createdAt: '', - url, - }; - }); -}; diff --git a/packages/console/src/components/Breadcrumbs/components/BreadcrumbFormControl.tsx b/packages/console/src/components/Breadcrumbs/components/BreadcrumbFormControl.tsx deleted file mode 100644 index 54bfacd50..000000000 --- a/packages/console/src/components/Breadcrumbs/components/BreadcrumbFormControl.tsx +++ /dev/null @@ -1,229 +0,0 @@ -import React, { useMemo, useState } from 'react'; -import { - Button, - Grid, - IconButton, - Tooltip, - makeStyles, -} from '@material-ui/core'; -import { ArrowDropDown } from '@material-ui/icons'; -import { useHistory } from 'react-router'; -import isEmpty from 'lodash/isEmpty'; -import { useQuery } from 'react-query'; -import { - LOCAL_PROJECT_DOMAIN, - LocalStorageProjectDomain, - setLocalStore, -} from 'components/common'; -import { BreadcrumbFormControlInterfaceUI } from '../types'; -import BreadcrumbPopOver from './BreadcrumbPopover'; - -/** - * This component is a wrapper to facilitate user interaction using MUI components. - * It is used to render a breadcrumb with a popover. - * - * These are used in the Breadcrumbs component. - */ -const BreadcrumbFormControlDefault = ( - props: BreadcrumbFormControlInterfaceUI, -) => { - const history = useHistory(); - const htmlLabel = `breadcrumb-${props.id}`; - const [anchorEl, setAnchorEl] = useState(null); - const handlePopoverClick = (event: React.MouseEvent) => { - setAnchorEl(event.currentTarget); - }; - const handlePopoverClose = () => { - setAnchorEl(null); - }; - - const { data: queryAsyncValueData } = useQuery( - `breadcrumb-selfasync-${props.id}-${props.value}`, - async () => { - if (!props.asyncValue) return ''; - return props.asyncValue(window.location, props); - }, - ); - const asyncValueData: string = useMemo(() => { - if (isEmpty(queryAsyncValueData) || queryAsyncValueData === undefined) - return ''; - return queryAsyncValueData; - }, [queryAsyncValueData]); - - const { data: queryAsyncSelfLinkData } = useQuery( - `breadcrumb-selflinkasync-${props.id}-${props.value}`, - async () => { - if (!props.asyncSelfLink) return ''; - return props.asyncSelfLink(window.location, props); - }, - ); - const asyncSelfLinkData: string = useMemo(() => { - if (isEmpty(queryAsyncSelfLinkData) && queryAsyncSelfLinkData === undefined) - return ''; - return `${queryAsyncSelfLinkData}`; - }, [queryAsyncSelfLinkData]); - - const handleValueClick = e => { - e.preventDefault(); - e.stopPropagation(); - - const projectValue = props.id.startsWith('project') - ? props.value - : props.projectId; - - const domainValue = props.id.startsWith('domain') - ? props.value - : props.domainId; - - const projectDomain: LocalStorageProjectDomain = { - project: projectValue, - domain: domainValue, - }; - - setLocalStore(LOCAL_PROJECT_DOMAIN, projectDomain); - - if (props.selfLink || props.asyncSelfLink) { - if (asyncSelfLinkData?.length) { - history.push(asyncSelfLinkData); - return; - } else { - if (typeof props.selfLink === 'function') { - history.push(props.selfLink(window.location, props)); - return; - } else { - history.push(props.selfLink); - return; - } - } - } - }; - - const isMoreButtonHidden = !props.asyncData && props.viewAllLink === ''; - - const value = useMemo( - () => - !props.asyncValue - ? ((props.value || props.defaultValue) as string) - : asyncValueData, - [props.asyncValue, props.value, props.defaultValue, asyncValueData], - ); - - const styles = makeStyles(theme => ({ - formControl: { - '& .breadcrumb-form-control-input': { - cursor: props.selfLink || props.asyncSelfLink ? 'pointer' : 'default', - color: theme.palette.text.primary, - '& *': { - cursor: props.selfLink || props.asyncSelfLink ? 'pointer' : 'default', - }, - }, - '& button': { - fontWeight: 500, - }, - '& h1': { - margin: 0, - fontSize: 24, - }, - }, - noWrap: { - flexWrap: 'nowrap', - }, - }))(); - - return ( -
- - - - {props.variant !== 'title' ? ( - - ) : ( -

{ - if (e.key === 'Enter') { - handleValueClick(e); - } - }} - > - {value} -

- )} -
-
- - {!isMoreButtonHidden ? ( - - - - ) : ( - - - - )} - -
- - {!!anchorEl && ( - - )} -
- ); -}; - -/** - * This component is a wrapper to facilitate user interaction using MUI components. - * It is used to render a breadcrumb with a popover. - * - * These are used in the Breadcrumbs component. - */ -const BreadcrumbFormControl = (props: BreadcrumbFormControlInterfaceUI) => { - const { customComponent: CustomComponent } = props; - if (CustomComponent) { - return ( - - - - ); - } - return ; -}; - -export default BreadcrumbFormControl; diff --git a/packages/console/src/components/Breadcrumbs/components/index.ts b/packages/console/src/components/Breadcrumbs/components/index.ts deleted file mode 100644 index 070e7a5a4..000000000 --- a/packages/console/src/components/Breadcrumbs/components/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import BreadCrumbs from './Breadcrumbs'; -import BreadcrumbPopOver from './BreadcrumbPopover'; -import BreadcrumbFormControl from './BreadcrumbFormControl'; -import BreadcrumbTitleActions from './BreadcrumbTitleActions'; - -// dont export portal to public API, internal concept, can only be 1 on a page - -export { - BreadCrumbs, - BreadcrumbPopOver, - BreadcrumbFormControl, - BreadcrumbTitleActions, -}; diff --git a/packages/console/src/components/Breadcrumbs/hooks/index.tsx b/packages/console/src/components/Breadcrumbs/hooks/index.tsx deleted file mode 100644 index 2aa18c451..000000000 --- a/packages/console/src/components/Breadcrumbs/hooks/index.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { useEffect, useState } from 'react'; -import isEqual from 'lodash/isEqual'; -import { Breadcrumb } from '../types'; -import { breadcrumbRegistry } from '../registry'; - -/** - * A way to inject a breadcrumb from anywhere in the system. - * Useful for capturing formatted data from other data providers. - * - * @param breadcrumb - */ -export const useSetBreadcrumbSeed = (breadcrumb: Breadcrumb | null) => { - if (!breadcrumb) return; - - const isEqualObj = isEqual( - breadcrumb, - breadcrumbRegistry.breadcrumbSeeds.find(b => breadcrumb.id === b.id), - ); - if (isEqualObj) return; - - const event = new CustomEvent('__FLYTE__BREADCRUMB__', { - detail: { - breadcrumb, - }, - }); - window.dispatchEvent(event); - return; -}; - -/** - * Turns the breadcrumb into the title bar variant. - * @param customStyles - */ -export const useBreadCrumbsGreyStyle = () => { - const breadcrumbBackground = `.breadcrumbs { - transition: background-color 0.2s ease-in-out; - background-color: #F2F3F3; - border-bottom: 1px solid lightgrey; - }`; - - const [id] = useState( - 'data-breadcrumb-temp-' + Date.now().toString(), - ); - - useEffect(() => { - // make a new style tag in the head with js - const style = document.createElement('style'); - style.innerHTML = breadcrumbBackground; - style.setAttribute('type', 'text/css'); - style.setAttribute(id, 'true'); - document.head.appendChild(style); - - return () => { - // remove global css sheet with matching comment text - [...document.querySelectorAll('style')] - .filter(s => s.outerHTML.includes(id)) - .forEach(s => { - s.remove(); - }); - }; - }, [window.location.pathname, id]); - - return; -}; diff --git a/packages/console/src/components/Breadcrumbs/index.ts b/packages/console/src/components/Breadcrumbs/index.ts deleted file mode 100644 index 09b941ec7..000000000 --- a/packages/console/src/components/Breadcrumbs/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './components'; -export * from './hooks'; -export * from './registry'; -export * from './types'; -export * from './validators'; diff --git a/packages/console/src/components/Breadcrumbs/viewAll/index.ts b/packages/console/src/components/Breadcrumbs/viewAll/index.ts deleted file mode 100644 index 90aeae6b9..000000000 --- a/packages/console/src/components/Breadcrumbs/viewAll/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Routes } from 'routes'; - -// TODO: Change this to be 4 fns that looks up with a switch statement, -// or: just 4 fns with matching ids, validators, etc. -export const namedEntitiesVersionsViewAll = (projectId = '', domainId = '') => { - const segments = decodeURI(window.location.pathname).split('/'); - const versionIndex = segments.findIndex(segment => segment === 'version'); - const nameIndex = versionIndex - 2; - const name = segments[nameIndex]; - - // TODO: namedEntitiesUrlSegments instead of dynamic matching - - const routesKeys = Object.keys(Routes.ProjectDetails.sections); - const routesKey = routesKeys.find(key => key.includes(name)) || ''; - const routeSection = Routes.ProjectDetails.sections[routesKey]; - const makeUrl = - typeof routeSection['makeUrl'] !== 'undefined' && - typeof routeSection.makeUrl === 'function' - ? routeSection.makeUrl - : Routes.ProjectDashboard.makeUrl; - - return makeUrl(projectId, domainId, name); -}; diff --git a/packages/console/src/components/Entities/EntityDescription.tsx b/packages/console/src/components/Entities/EntityDescription.tsx deleted file mode 100644 index 245b2aaff..000000000 --- a/packages/console/src/components/Entities/EntityDescription.tsx +++ /dev/null @@ -1,175 +0,0 @@ -import { Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import { WaitForData } from 'components/common/WaitForData'; -import { - IdentifierScope, - ResourceIdentifier, - Variable, -} from 'models/Common/types'; -import * as React from 'react'; -import reactLoadingSkeleton from 'react-loading-skeleton'; -import { ReactJsonViewWrapper } from 'components/common/ReactJsonView'; -import { useEntityVersions } from 'components/hooks/Entity/useEntityVersions'; -import { executionSortFields } from 'models/Execution/constants'; -import { SortDirection } from 'models/AdminEntity/types'; -import { TaskClosure } from 'models/Task/types'; -import { executionFilterGenerator } from './generators'; -import { Row } from './Row'; -import t, { patternKey } from './strings'; -import { entityStrings, entitySections } from './constants'; -import { useDescriptionEntityList } from '../hooks/useDescription'; - -const Skeleton = reactLoadingSkeleton; - -const useStyles = makeStyles((theme: Theme) => ({ - header: { - marginBottom: theme.spacing(1), - }, - description: { - marginTop: theme.spacing(1), - }, - divider: { - borderBottom: `1px solid ${theme.palette.divider}`, - marginBottom: theme.spacing(1), - }, -})); - -const InputsAndOuputs: React.FC<{ - id: ResourceIdentifier; -}> = ({ id }) => { - const sort = { - key: executionSortFields.createdAt, - direction: SortDirection.DESCENDING, - }; - - const baseFilters = executionFilterGenerator[id.resourceType](id); - - // to render the input and output, - // need to fetch the latest version and get the input and ouptut data - const versions = useEntityVersions( - { ...id, version: '' } as IdentifierScope, - { - sort, - filter: baseFilters, - limit: 1, - }, - ); - - let inputs: Record | undefined; - let outputs: Record | undefined; - - if ((versions?.value?.[0]?.closure as TaskClosure)?.compiledTask?.template) { - const template = (versions?.value?.[0]?.closure as TaskClosure) - ?.compiledTask?.template; - inputs = template?.interface?.inputs?.variables; - outputs = template?.interface?.outputs?.variables; - } - - return ( - - {inputs && ( - - !field?.name} - /> - - )} - {outputs && ( - - !field?.name} - /> - - )} - - ); -}; - -/** Fetches and renders the description for a given Entity (LaunchPlan,Workflow,Task) ID */ -export const EntityDescription: React.FC<{ - id: ResourceIdentifier; -}> = ({ id }) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - - const { resourceType } = id; - const sort = { - key: executionSortFields.createdAt, - direction: SortDirection.DESCENDING, - }; - - const baseFilters = React.useMemo( - () => executionFilterGenerator[resourceType](id), - [id, resourceType], - ); - - const descriptionEntities = useDescriptionEntityList( - { ...id, version: '' }, - { - sort, - filter: baseFilters, - limit: 1, - }, - ); - - const descriptionEntity = descriptionEntities?.value?.[0]; - const hasDescription = descriptionEntity?.longDescription.value.length !== 0; - const hasLink = !!descriptionEntity?.sourceCode?.link; - const sections = entitySections[id.resourceType]; - - return ( - <> - - {t('basicInformation')} - -
- - - - - {hasDescription - ? descriptionEntity?.longDescription?.value - : t( - patternKey('noDescription', entityStrings[id.resourceType]), - )} - - - {hasLink && ( - - - {hasLink ? ( - - {descriptionEntity?.sourceCode?.link} - - ) : ( - t(patternKey('noGithubLink', entityStrings[id.resourceType])) - )} - - - )} - - {sections?.descriptionInputsAndOutputs && } - - - ); -}; diff --git a/packages/console/src/components/Entities/EntityDetails.tsx b/packages/console/src/components/Entities/EntityDetails.tsx deleted file mode 100644 index c38205332..000000000 --- a/packages/console/src/components/Entities/EntityDetails.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { EntityDescription } from 'components/Entities/EntityDescription'; -import { useProject } from 'components/hooks/useProjects'; -import { useChartState } from 'components/hooks/useChartState'; -import { ResourceIdentifier } from 'models/Common/types'; -import { Box, Grid } from '@material-ui/core'; -import { LoadingSpinner } from 'components/common'; -import { FeatureFlag, useFeatureFlag } from 'basics/FeatureFlags'; -import { entitySections } from './constants'; -import { EntityDetailsHeader } from './EntityDetailsHeader'; -import { EntityInputs } from './EntityInputs'; -import { EntityExecutions } from './EntityExecutions'; -import { EntitySchedules } from './EntitySchedules'; -import { EntityVersions } from './EntityVersions'; -import { EntityExecutionsBarChart } from './EntityExecutionsBarChart'; - -const useStyles = makeStyles((theme: Theme) => ({ - entityDetailsWrapper: { - minHeight: '100vh', - }, - metadataContainer: { - display: 'flex', - marginBottom: theme.spacing(2), - marginTop: theme.spacing(2), - width: '100%', - paddingLeft: theme.spacing(2), - paddingRight: theme.spacing(2), - }, - descriptionContainer: { - flex: '2 1 auto', - marginRight: theme.spacing(2), - }, - executionsContainer: { - display: 'flex', - flex: '1 1 auto', - flexDirection: 'column', - margin: `0`, - flexBasis: theme.spacing(80), - }, - versionsContainer: { - display: 'flex', - flexDirection: 'column', - }, - schedulesContainer: { - flex: '1 2 auto', - }, - inputsContainer: { - display: 'flex', - flexDirection: 'column', - paddingLeft: theme.spacing(2), - paddingRight: theme.spacing(2), - }, -})); - -interface EntityDetailsProps { - id: ResourceIdentifier; -} - -/** - * A view which optionally renders description, schedules, executions, and a - * launch button/form for a given entity. Note: not all components are suitable - * for use with all entities (not all entities have schedules, for example). - * @param id - */ -export const EntityDetails: React.FC = ({ id }) => { - const sections = entitySections[id.resourceType]; - const [project] = useProject(id.project); - const styles = useStyles(); - const { chartIds, onToggle, clearCharts } = useChartState(); - - const isBreadcrumbsFlag = useFeatureFlag(FeatureFlag.breadcrumbs); - - return ( - - {!project?.id && } - {project?.id && ( - <> - - - -
- {sections.description && ( -
- -
- )} - {!sections.inputs && sections.schedules && ( -
- -
- )} -
- - {!!sections.inputs && ( -
- -
- )} - - {!!sections.versions && ( -
- -
- )} - - - {!sections.executions && } - {sections.executions && ( -
- -
- )} - - )} -
- ); -}; diff --git a/packages/console/src/components/Entities/EntityDetailsHeader.tsx b/packages/console/src/components/Entities/EntityDetailsHeader.tsx deleted file mode 100644 index 931b2c4b3..000000000 --- a/packages/console/src/components/Entities/EntityDetailsHeader.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import React, { useState } from 'react'; -import { Button, Dialog } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import ArrowBack from '@material-ui/icons/ArrowBack'; -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import { ResourceIdentifier, ResourceType } from 'models/Common/types'; -import { Project } from 'models/Project/types'; -import { getProjectDomain } from 'models/Project/utils'; -import { Link } from 'react-router-dom'; -import { LaunchForm } from 'components/Launch/LaunchForm/LaunchForm'; -import { useEscapeKey } from 'components/hooks/useKeyListener'; -import { BreadcrumbTitleActions } from 'components/Breadcrumbs'; -import { FeatureFlag, useFeatureFlag } from 'basics/FeatureFlags'; -import { backUrlGenerator, backToDetailUrlGenerator } from './generators'; -import { entityStrings } from './constants'; -import t, { patternKey } from './strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - headerContainer: { - alignItems: 'center', - display: 'flex', - height: theme.spacing(5), - justifyContent: 'space-between', - marginTop: theme.spacing(2), - width: '100%', - }, - headerText: { - margin: theme.spacing(0, 1), - }, - headerTextContainer: { - display: 'flex', - flex: '1 0 auto', - }, -})); - -interface EntityDetailsHeaderProps { - project: Project; - id: ResourceIdentifier; - launchable?: boolean; - backToWorkflow?: boolean; -} - -function getLaunchProps(id: ResourceIdentifier) { - if (id.resourceType === ResourceType.TASK) { - return { taskId: id }; - } - - return { workflowId: id }; -} - -/** - * Renders the entity name and any applicable actions. - * @param id - * @param project - * @param launchable - controls if we show launch button - * @param backToWorkflow - if true breadcrumb navigates to main workflow details view. - * @constructor - */ -export const EntityDetailsHeader: React.FC = ({ - id, - project, - launchable = false, - backToWorkflow = false, -}) => { - const styles = useStyles(); - const commonStyles = useCommonStyles(); - - const [showLaunchForm, setShowLaunchForm] = useState(false); - const onCancelLaunch = (_?: KeyboardEvent) => { - setShowLaunchForm(false); - }; - - // Close modal on escape key press - useEscapeKey(onCancelLaunch); - - const domain = project ? getProjectDomain(project, id.domain) : undefined; - const headerText = domain ? `${domain.name} / ${id.name}` : ''; - - const isBreadcrumbFlag = useFeatureFlag(FeatureFlag.breadcrumbs); - - return ( - <> - {!isBreadcrumbFlag && ( -
-
- - - - {headerText} -
-
- )} - {isBreadcrumbFlag && ( -
- - {launchable ? ( - - ) : ( - <> - )} - -
- )} - {launchable ? ( - - - - ) : null} - - ); -}; diff --git a/packages/console/src/components/Entities/EntityExecutions.tsx b/packages/console/src/components/Entities/EntityExecutions.tsx deleted file mode 100644 index 56a30aea2..000000000 --- a/packages/console/src/components/Entities/EntityExecutions.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { contentMarginGridUnits } from 'common/layout'; -import { WaitForData } from 'components/common/WaitForData'; -import { ExecutionFilters } from 'components/Executions/ExecutionFilters'; -import { useExecutionShowArchivedState } from 'components/Executions/filters/useExecutionArchiveState'; -import { useWorkflowExecutionFiltersState } from 'components/Executions/filters/useExecutionFiltersState'; -import { WorkflowExecutionsTable } from 'components/Executions/Tables/WorkflowExecutionsTable'; -import { isLoadingState } from 'components/hooks/fetchMachine'; -import { useWorkflowExecutions } from 'components/hooks/useWorkflowExecutions'; -import { SortDirection } from 'models/AdminEntity/types'; -import { ResourceIdentifier } from 'models/Common/types'; -import { executionSortFields } from 'models/Execution/constants'; -import { compact } from 'lodash'; -import { useOnlyMyExecutionsFilterState } from 'components/Executions/filters/useOnlyMyExecutionsFilterState'; -import { executionFilterGenerator } from './generators'; - -const useStyles = makeStyles((theme: Theme) => ({ - filtersContainer: { - borderTop: `1px solid ${theme.palette.divider}`, - }, - header: { - marginBottom: theme.spacing(1), - marginLeft: theme.spacing(contentMarginGridUnits), - }, -})); - -export interface EntityExecutionsProps { - id: ResourceIdentifier; - chartIds: string[]; - clearCharts: () => void; -} - -/** The tab/page content for viewing a workflow's executions */ -export const EntityExecutions: React.FC = ({ - id, - chartIds, - clearCharts, -}) => { - const { domain, project, resourceType } = id; - const styles = useStyles(); - const filtersState = useWorkflowExecutionFiltersState(); - const archivedFilter = useExecutionShowArchivedState(); - const onlyMyExecutionsFilterState = useOnlyMyExecutionsFilterState({}); - - const sort = { - key: executionSortFields.createdAt, - direction: SortDirection.DESCENDING, - }; - - const baseFilters = React.useMemo( - () => executionFilterGenerator[resourceType](id), - [id, resourceType], - ); - - const allFilters = compact([ - ...baseFilters, - ...filtersState.appliedFilters, - archivedFilter.getFilter(), - onlyMyExecutionsFilterState.getFilter(), - ]); - - const executions = useWorkflowExecutions( - { domain, project }, - { - sort, - filter: allFilters, - limit: 100, - }, - ); - - if (chartIds.length > 0) { - executions.value = executions.value.filter(item => - chartIds.includes(item.id.name), - ); - } - - return ( - <> -
- -
- - - - - ); -}; diff --git a/packages/console/src/components/Entities/EntityExecutionsBarChart.tsx b/packages/console/src/components/Entities/EntityExecutionsBarChart.tsx deleted file mode 100644 index 1a297ce6b..000000000 --- a/packages/console/src/components/Entities/EntityExecutionsBarChart.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import * as React from 'react'; -import { formatDateUTC, millisecondsToHMS } from 'common/formatters'; -import { timestampToDate } from 'common/utils'; -import { BarChart } from 'components/common/BarChart'; -import { WaitForData } from 'components/common/WaitForData'; -import { useWorkflowExecutionFiltersState } from 'components/Executions/filters/useExecutionFiltersState'; -import { useWorkflowExecutions } from 'components/hooks/useWorkflowExecutions'; -import { SortDirection } from 'models/AdminEntity/types'; -import { ResourceIdentifier } from 'models/Common/types'; -import { Execution } from 'models/Execution/types'; -import { executionSortFields } from 'models/Execution/constants'; -import { executionFilterGenerator } from './generators'; -import { - getWorkflowExecutionPhaseConstants, - getWorkflowExecutionTimingMS, -} from '../Executions/utils'; -import t, { patternKey } from './strings'; -import { entityStrings } from './constants'; - -export interface EntityExecutionsBarChartProps { - id: ResourceIdentifier; - onToggle: (id: string) => void; - chartIds: string[]; -} - -export const getExecutionTimeData = ( - executions: Execution[], - fillSize = 100, -) => { - const newExecutions = [...executions].reverse().map(execution => { - const duration = getWorkflowExecutionTimingMS(execution)?.duration || 1; - return { - value: duration, - color: getWorkflowExecutionPhaseConstants(execution.closure.phase) - .badgeColor, - metadata: execution.id, - tooltip: ( -
- - Execution Id: {execution.id.name} - - Running time: {millisecondsToHMS(duration)} - - Started at:{' '} - {execution.closure.startedAt && - formatDateUTC(timestampToDate(execution.closure.startedAt))} - -
- ), - }; - }); - if (newExecutions.length >= fillSize) { - return newExecutions.slice(0, fillSize); - } - return new Array(fillSize - newExecutions.length) - .fill(0) - .map(() => ({ - value: 1, - color: '#e5e5e5', - })) - .concat(newExecutions); -}; - -export const getStartExecutionTime = (executions: Execution[]) => { - if (executions.length === 0) { - return ''; - } - const lastExecution = executions[executions.length - 1]; - if (!lastExecution.closure.startedAt) { - return ''; - } - return formatDateUTC(timestampToDate(lastExecution.closure.startedAt)); -}; - -/** - * The tab/page content for viewing a workflow's executions as bar chart - * @param id - * @constructor - */ -export const EntityExecutionsBarChart: React.FC< - EntityExecutionsBarChartProps -> = ({ id, onToggle, chartIds }) => { - const { domain, project, resourceType } = id; - const filtersState = useWorkflowExecutionFiltersState(); - const sort = { - key: executionSortFields.createdAt, - direction: SortDirection.DESCENDING, - }; - - const baseFilters = React.useMemo( - () => executionFilterGenerator[resourceType](id), - [id, resourceType], - ); - - const executions = useWorkflowExecutions( - { domain, project }, - { - sort, - filter: [...baseFilters, ...filtersState.appliedFilters], - limit: 100, - }, - ); - - const handleClickItem = React.useCallback( - item => { - if (item.metadata) { - onToggle(item.metadata.name); - } - }, - [onToggle], - ); - - return ( - - - - ); -}; diff --git a/packages/console/src/components/Entities/EntityInputs.tsx b/packages/console/src/components/Entities/EntityInputs.tsx deleted file mode 100644 index 1a7da3473..000000000 --- a/packages/console/src/components/Entities/EntityInputs.tsx +++ /dev/null @@ -1,240 +0,0 @@ -import { - Paper, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - Typography, -} from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import CheckIcon from '@material-ui/icons/Check'; -import { useLaunchPlans } from 'components/hooks/useLaunchPlans'; -import { - formatType, - getInputDefintionForLiteralType, -} from 'components/Launch/LaunchForm/utils'; -import { FilterOperationName } from 'models/AdminEntity/types'; -import { ResourceIdentifier } from 'models/Common/types'; -import { LaunchPlanClosure, LaunchPlanSpec } from 'models/Launch/types'; -import * as React from 'react'; -import { useMemo } from 'react'; -import t from './strings'; -import { transformLiterals } from '../Literals/helpers'; - -const coerceDefaultValue = ( - value: string | object | undefined, -): string | undefined => { - if (typeof value === 'object') { - return JSON.stringify(value); - } - return value; -}; - -const useStyles = makeStyles((theme: Theme) => ({ - header: { - marginBottom: theme.spacing(1), - }, - divider: { - borderBottom: `1px solid ${theme.palette.divider}`, - marginBottom: theme.spacing(1), - }, - rowContainer: { - display: 'flex', - marginTop: theme.spacing(3), - }, - firstColumnContainer: { - width: '60%', - marginRight: theme.spacing(3), - }, - secondColumnContainer: { - width: '40%', - }, - configs: { - listStyleType: 'none', - paddingInlineStart: 0, - }, - config: { - display: 'flex', - }, - configName: { - color: theme.palette.grey[400], - marginRight: theme.spacing(2), - minWidth: '95px', - }, - configValue: { - color: '#333', - fontSize: '14px', - }, - headCell: { - color: theme.palette.grey[400], - }, - noInputs: { - color: theme.palette.grey[400], - }, -})); - -interface Input { - name: string; - type?: string; - required?: boolean; - defaultValue?: string; -} - -/** Fetches and renders the expected & fixed inputs for a given Entity (LaunchPlan) ID */ -export const EntityInputs: React.FC<{ - id: ResourceIdentifier; -}> = ({ id }) => { - const styles = useStyles(); - - const launchPlanState = useLaunchPlans( - { project: id.project, domain: id.domain }, - { - limit: 1, - filter: [ - { - key: 'launch_plan.name', - operation: FilterOperationName.EQ, - value: id.name, - }, - ], - }, - ); - - const closure = launchPlanState?.value?.length - ? launchPlanState.value[0].closure - : ({} as LaunchPlanClosure); - - const spec = launchPlanState?.value?.length - ? launchPlanState.value[0].spec - : ({} as LaunchPlanSpec); - - const expectedInputs = useMemo(() => { - const results: Input[] = []; - Object.keys(closure?.expectedInputs?.parameters ?? {}).forEach(name => { - const parameter = closure?.expectedInputs.parameters[name]; - if (parameter?.var?.type) { - const typeDefinition = getInputDefintionForLiteralType( - parameter.var.type, - ); - results.push({ - name, - type: formatType(typeDefinition), - required: !!parameter.required, - defaultValue: parameter.default?.value, - }); - } - }); - return results; - }, [closure]); - - const fixedInputs = useMemo(() => { - const inputsMap = transformLiterals(spec?.fixedInputs?.literals ?? {}); - return Object.keys(inputsMap).map(name => ({ - name, - defaultValue: inputsMap[name], - })); - }, [spec]); - - return ( - <> - - {t('launchPlanLatest')} - -
-
-
- - {t('expectedInputs')} - - {expectedInputs.length ? ( - - - - - - - {t('inputsName')} - - - - - {t('inputsType')} - - - - - {t('inputsRequired')} - - - - - {t('inputsDefault')} - - - - - - {expectedInputs.map( - ({ name, type, required, defaultValue }) => ( - - {name} - {type} - - {required ? : ''} - - - {coerceDefaultValue(defaultValue) || '-'} - - - ), - )} - -
-
- ) : ( -

{t('noExpectedInputs')}

- )} -
-
- - {t('fixedInputs')} - - {fixedInputs.length ? ( - - - - - - - {t('inputsName')} - - - - - {t('inputsDefault')} - - - - - - {fixedInputs.map(({ name, defaultValue }) => ( - - {name} - - {coerceDefaultValue(defaultValue) || '-'} - - - ))} - -
-
- ) : ( -

{t('noFixedInputs')}

- )} -
-
- - ); -}; diff --git a/packages/console/src/components/Entities/EntitySchedules.tsx b/packages/console/src/components/Entities/EntitySchedules.tsx deleted file mode 100644 index 847735672..000000000 --- a/packages/console/src/components/Entities/EntitySchedules.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { - Paper, - Typography, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, -} from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { - getScheduleFrequencyString, - getScheduleOffsetString, -} from 'common/formatters'; -import { useCommonStyles } from 'components/common/styles'; -import { WaitForData } from 'components/common/WaitForData'; -import { useWorkflowSchedules } from 'components/hooks/useWorkflowSchedules'; -import { ResourceIdentifier } from 'models/Common/types'; -import { LaunchPlan } from 'models/Launch/types'; -import * as React from 'react'; -import { LaunchPlanLink } from 'components/LaunchPlan/LaunchPlanLink'; -import { entityStrings } from './constants'; -import t, { patternKey } from './strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - header: { - marginBottom: theme.spacing(1), - }, - schedulesContainer: { - marginTop: theme.spacing(1), - }, - divider: { - borderBottom: `1px solid ${theme.palette.divider}`, - marginBottom: theme.spacing(1), - }, - headCell: { - color: theme.palette.grey[400], - }, -})); - -const RenderSchedules: React.FC<{ - launchPlans: LaunchPlan[]; -}> = ({ launchPlans }) => { - const styles = useStyles(); - return ( - - - - - - - {t(patternKey('launchPlan', 'frequency'))} - - - - - {t(patternKey('launchPlan', 'name'))} - - - - - {t(patternKey('launchPlan', 'version'))} - - - - - - {launchPlans.map(launchPlan => { - const { schedule } = launchPlan.spec.entityMetadata; - const frequencyString = getScheduleFrequencyString(schedule); - const offsetString = getScheduleOffsetString(schedule); - const scheduleString = offsetString - ? `${frequencyString} (offset by ${offsetString})` - : frequencyString; - - return ( - - {scheduleString} - - - {launchPlan.id.name} - - - {launchPlan.id.version} - - ); - })} - -
-
- ); -}; - -export const EntitySchedules: React.FC<{ - id: ResourceIdentifier; -}> = ({ id }) => { - const styles = useStyles(); - const commonStyles = useCommonStyles(); - const scheduledLaunchPlans = useWorkflowSchedules(id); - return ( - <> - - - {t('schedulesHeader')} - -
- -
- {scheduledLaunchPlans.value.length > 0 ? ( - - ) : ( - - {t(patternKey('noSchedules', entityStrings[id.resourceType]))} - - )} -
- - - ); -}; diff --git a/packages/console/src/components/Entities/EntityVersions.tsx b/packages/console/src/components/Entities/EntityVersions.tsx deleted file mode 100644 index 47ad78d3e..000000000 --- a/packages/console/src/components/Entities/EntityVersions.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import * as React from 'react'; -import { history } from 'routes/history'; -import Typography from '@material-ui/core/Typography'; -import { Box, IconButton, makeStyles, Theme } from '@material-ui/core'; -import ExpandLess from '@material-ui/icons/ExpandLess'; -import ExpandMore from '@material-ui/icons/ExpandMore'; -import { LocalCacheItem, useLocalCache } from 'basics/LocalCache'; -import { WaitForData } from 'components/common/WaitForData'; -import { EntityVersionsTable } from 'components/Executions/Tables/EntityVersionsTable'; -import { isLoadingState } from 'components/hooks/fetchMachine'; -import { useEntityVersions } from 'components/hooks/Entity/useEntityVersions'; -import { interactiveTextColor } from 'components/Theme/constants'; -import { SortDirection } from 'models/AdminEntity/types'; -import { - Identifier, - ResourceIdentifier, - ResourceType, -} from 'models/Common/types'; -import { executionSortFields } from 'models/Execution/constants'; -import { - executionFilterGenerator, - versionDetailsUrlGenerator, -} from './generators'; -import { WorkflowVersionsTablePageSize, entityStrings } from './constants'; -import t, { patternKey } from './strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - headerContainer: { - display: 'flex', - marginTop: theme.spacing(3), - }, - collapseButton: { - marginTop: theme.spacing(-0.5), - }, - header: { - flexGrow: 1, - marginBottom: theme.spacing(1), - marginRight: theme.spacing(1), - }, - viewAll: { - color: interactiveTextColor, - cursor: 'pointer', - }, - divider: { - borderBottom: `1px solid ${theme.palette.divider}`, - marginBottom: theme.spacing(1), - }, -})); - -export interface EntityVersionsProps { - id: ResourceIdentifier; - showAll?: boolean; -} - -/** - * The tab/page content for viewing a workflow's versions. - * @param id - * @param showAll - shows all available entity versions - */ -export const EntityVersions: React.FC = ({ - id, - showAll = false, -}) => { - const { domain, project, resourceType, name } = id; - const [showTable, setShowTable] = useLocalCache( - LocalCacheItem.ShowWorkflowVersions, - ); - const styles = useStyles(); - const sort = { - key: executionSortFields.createdAt, - direction: SortDirection.DESCENDING, - }; - - const baseFilters = React.useMemo( - () => executionFilterGenerator[resourceType](id), - [id, resourceType], - ); - - // we are getting all the versions for this id - // so we don't want to specify which version - const versions = useEntityVersions( - { ...id, version: '' }, - { - sort, - filter: baseFilters, - limit: showAll ? 100 : WorkflowVersionsTablePageSize, - }, - ); - - const preventDefault = e => e.preventDefault(); - const handleViewAll = React.useCallback(() => { - history.push( - versionDetailsUrlGenerator({ - ...id, - version: versions.value[0].id.version ?? '', - } as Identifier), - ); - }, [project, domain, name, versions]); - - return ( - <> - {!showAll && ( -
- setShowTable(!showTable)} - onMouseDown={preventDefault} - size="small" - aria-label="" - title={t('collapseButton', showTable)} - > - {showTable ? : } - - - {t(patternKey('versionsTitle', entityStrings[id.resourceType]))} - - - - {t('viewAll')} - - -
- )} - - {showTable || showAll ? ( - - ) : ( -
- )} - - - ); -}; diff --git a/packages/console/src/components/Entities/Row.tsx b/packages/console/src/components/Entities/Row.tsx deleted file mode 100644 index cae013002..000000000 --- a/packages/console/src/components/Entities/Row.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import * as React from 'react'; -import { Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { COLOR_SPECTRUM } from 'components/Theme/colorSpectrum'; - -const useStyles = makeStyles((theme: Theme) => ({ - row: { - display: 'flex', - marginBottom: theme.spacing(1), - }, - title: { - width: 100, - color: COLOR_SPECTRUM.gray25.color, - }, -})); - -interface MyProps { - children?: React.ReactNode; - title: String; -} -export const Row: React.FC = props => { - const styles = useStyles(); - - return ( -
-
- {props.title} -
-
{props.children}
-
- ); -}; diff --git a/packages/console/src/components/Entities/VersionDetails/EntityVersionDetails.tsx b/packages/console/src/components/Entities/VersionDetails/EntityVersionDetails.tsx deleted file mode 100644 index 845d18133..000000000 --- a/packages/console/src/components/Entities/VersionDetails/EntityVersionDetails.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import * as React from 'react'; -import { Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { contentMarginGridUnits } from 'common/layout'; -import { WaitForData } from 'components/common/WaitForData'; -import { useTaskTemplate } from 'components/hooks/useTask'; -import { ResourceIdentifier, Identifier } from 'models/Common/types'; -import { DumpJSON } from 'components/common/DumpJSON'; -import { Row } from '../Row'; -import EnvVarsTable from './EnvVarsTable'; -import t, { patternKey } from '../strings'; -import { entityStrings } from '../constants'; - -const useStyles = makeStyles((theme: Theme) => ({ - header: { - marginBottom: theme.spacing(1), - marginLeft: theme.spacing(contentMarginGridUnits), - }, - table: { - marginLeft: theme.spacing(contentMarginGridUnits), - }, - divider: { - borderBottom: `1px solid ${theme.palette.divider}`, - marginBottom: theme.spacing(1), - }, -})); - -export interface EntityExecutionsProps { - id: ResourceIdentifier; -} - -/** The tab/page content for viewing a workflow's executions */ -export const EntityVersionDetails: React.FC = ({ - id, -}) => { - const styles = useStyles(); - - // NOTE: need to be generic for supporting other type like workflow, etc. - const templateState = useTaskTemplate(id as Identifier); - - const template = templateState?.value?.closure?.compiledTask?.template; - const envVars = template?.container?.env; - const image = template?.container?.image; - - return ( - <> - - {t(patternKey('details', entityStrings[id.resourceType]))} - -
- -
- {image && ( - - {image} - - )} - {envVars && ( - - - - )} - {template && ( - - - - )} -
-
- - ); -}; diff --git a/packages/console/src/components/Entities/VersionDetails/EntityVersionDetailsContainer.tsx b/packages/console/src/components/Entities/VersionDetails/EntityVersionDetailsContainer.tsx deleted file mode 100644 index fdc1966a7..000000000 --- a/packages/console/src/components/Entities/VersionDetails/EntityVersionDetailsContainer.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import React, { useMemo, FC } from 'react'; -import { withRouteParams } from 'components/common/withRouteParams'; -import { ResourceIdentifier, ResourceType } from 'models/Common/types'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { useProject } from 'components/hooks/useProjects'; -import { StaticGraphContainer } from 'components/Workflow/StaticGraphContainer'; -import { WorkflowId } from 'models/Workflow/types'; -import { entitySections } from 'components/Entities/constants'; -import { EntityDetailsHeader } from 'components/Entities/EntityDetailsHeader'; -import { EntityVersions } from 'components/Entities/EntityVersions'; -import { RouteComponentProps } from 'react-router-dom'; -import { LoadingSpinner } from 'components/common'; -import { Box } from '@material-ui/core'; -import { FeatureFlag, useFeatureFlag } from 'basics/FeatureFlags'; -import { typeNameToEntityResource } from '../constants'; -import { versionsDetailsSections } from './constants'; -import { EntityVersionDetails } from './EntityVersionDetails'; - -interface StyleProps { - resourceType: ResourceType; -} - -const useStyles = makeStyles((theme: Theme) => ({ - verionDetailsContainer: { - marginTop: theme.spacing(2), - display: 'flex', - flexDirection: 'column', - flexWrap: 'nowrap', - overflow: 'hidden', - height: `calc(100vh - ${theme.spacing(17)}px)`, - padding: theme.spacing(0, 2), - }, - staticGraphContainer: { - display: 'flex', - height: '60%', - width: '100%', - flex: '1', - }, - versionDetailsContainer: { - display: 'flex', - flexDirection: 'column', - height: '55%', - width: '100%', - flex: '1', - overflowY: 'scroll', - padding: theme.spacing(0, 2), - }, - versionsContainer: { - display: 'flex', - flex: '0 1 auto', - padding: theme.spacing(0, 2), - height: ({ resourceType }) => - resourceType === ResourceType.LAUNCH_PLAN ? '100%' : '40%', - flexDirection: 'column', - overflowY: 'auto', - }, -})); - -interface WorkflowVersionDetailsRouteParams { - projectId: string; - domainId: string; - entityType: string; - entityName: string; - entityVersion: string; -} - -/** - * The view component for the Workflow Versions page - * @param projectId - * @param domainId - * @param workflowName - */ -const EntityVersionsDetailsContainerImpl: FC< - WorkflowVersionDetailsRouteParams -> = ({ projectId, domainId, entityType, entityName, entityVersion }) => { - const workflowId = useMemo( - () => ({ - resourceType: typeNameToEntityResource[entityType], - project: projectId, - domain: domainId, - name: entityName, - version: entityVersion, - }), - [entityType, projectId, domainId, entityName, entityVersion], - ); - - const id = workflowId as ResourceIdentifier; - const sections = entitySections[id.resourceType]; - const versionsSections = versionsDetailsSections[id.resourceType]; - const [project] = useProject(workflowId.project); - const styles = useStyles({ resourceType: id.resourceType }); - - const isBreadcrumbsFlag = useFeatureFlag(FeatureFlag.breadcrumbs); - - if (!project?.id) { - return ; - } - - return ( - <> - - - -
- {versionsSections.details && ( -
- -
- )} - {versionsSections.graph && ( -
- -
- )} -
- -
-
- - ); -}; - -export const EntityVersionsDetailsContainer: FC< - RouteComponentProps -> = withRouteParams( - EntityVersionsDetailsContainerImpl, -); diff --git a/packages/console/src/components/Entities/VersionDetails/EnvVarsTable.tsx b/packages/console/src/components/Entities/VersionDetails/EnvVarsTable.tsx deleted file mode 100644 index e3e4c6aee..000000000 --- a/packages/console/src/components/Entities/VersionDetails/EnvVarsTable.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import * as React from 'react'; -import { - Typography, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - Paper, -} from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { Core } from '@flyteorg/flyteidl-types'; -import { COLOR_SPECTRUM } from 'components/Theme/colorSpectrum'; -import t from '../strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - marginBottom: theme.spacing(1), - ['& .MuiTableCell-sizeSmall']: { - paddingLeft: 0, - }, - }, - headerText: { - color: COLOR_SPECTRUM.gray25.color, - }, -})); - -interface EnvVarsTableProps { - rows: Core.IKeyValuePair[]; -} - -export default function EnvVarsTable({ rows }: EnvVarsTableProps) { - const styles = useStyles(); - - if (!rows || rows.length == 0) { - return {t('empty')}; - } - return ( - - - - - - - {t('key')} - - - - - {t('value')} - - - - - - {rows.map(row => ( - - - {row.key} - - - {row.value} - - - ))} - -
-
- ); -} diff --git a/packages/console/src/components/Entities/VersionDetails/VersionDetailsLink.tsx b/packages/console/src/components/Entities/VersionDetails/VersionDetailsLink.tsx deleted file mode 100644 index a484dbed4..000000000 --- a/packages/console/src/components/Entities/VersionDetails/VersionDetailsLink.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { Identifier } from 'models/Common/types'; -import { NewTargetLink } from 'components/common/NewTargetLink'; -import { versionDetailsUrlGenerator } from 'components/Entities/generators'; -import t from '../strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - link: { - marginBottom: theme.spacing(2), - }, -})); - -interface TaskVersionDetailsLinkProps { - id: Identifier; -} - -export const TaskVersionDetailsLink: React.FC = ({ - id, -}) => { - const styles = useStyles(); - return ( - - {t('details_task')} - - ); -}; diff --git a/packages/console/src/components/Entities/generators.ts b/packages/console/src/components/Entities/generators.ts deleted file mode 100644 index ad98c4713..000000000 --- a/packages/console/src/components/Entities/generators.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { FilterOperation, FilterOperationName } from 'models/AdminEntity/types'; -import { - ResourceIdentifier, - ResourceType, - Identifier, -} from 'models/Common/types'; -import { Routes } from 'routes/routes'; -import { entityStrings } from './constants'; - -const noFilters = () => []; - -export const executionFilterGenerator: { - [k in ResourceType]: ( - id: ResourceIdentifier, - version?: string, - ) => FilterOperation[]; -} = { - [ResourceType.DATASET]: noFilters, - [ResourceType.LAUNCH_PLAN]: ({ name }, version) => [ - { - key: 'launch_plan.name', - operation: FilterOperationName.EQ, - value: name, - }, - ...(version - ? [ - { - key: 'launch_plan.version', - operation: FilterOperationName.EQ, - value: version, - }, - ] - : []), - ], - [ResourceType.TASK]: ({ name }, version) => [ - { - key: 'task.name', - operation: FilterOperationName.EQ, - value: name, - }, - ...(version - ? [ - { - key: 'workflow.version', - operation: FilterOperationName.EQ, - value: version, - }, - ] - : []), - ], - [ResourceType.UNSPECIFIED]: noFilters, - [ResourceType.WORKFLOW]: ({ name }, version) => [ - { - key: 'workflow.name', - operation: FilterOperationName.EQ, - value: name, - }, - ...(version - ? [ - { - key: 'workflow.version', - operation: FilterOperationName.EQ, - value: version, - }, - ] - : []), - ], -}; - -const workflowListGenerator = ({ project, domain }: ResourceIdentifier) => - Routes.ProjectDetails.sections.workflows.makeUrl(project, domain); -const launchPlanListGenerator = ({ project, domain }: ResourceIdentifier) => - Routes.ProjectDetails.sections.launchPlans.makeUrl(project, domain); -const taskListGenerator = ({ project, domain }: ResourceIdentifier) => - Routes.ProjectDetails.sections.tasks.makeUrl(project, domain); -const unspecifiedGenerator = ({ - project: _project, - domain: _domain, -}: ResourceIdentifier | Identifier) => { - throw new Error('Unspecified Resourcetype.'); -}; -const unimplementedGenerator = ({ - project: _project, - domain: _domain, -}: ResourceIdentifier | Identifier) => { - throw new Error('Method not implemented.'); -}; - -export const backUrlGenerator: { - [k in ResourceType]: (id: ResourceIdentifier) => string; -} = { - [ResourceType.DATASET]: unimplementedGenerator, - [ResourceType.LAUNCH_PLAN]: launchPlanListGenerator, - [ResourceType.TASK]: taskListGenerator, - [ResourceType.UNSPECIFIED]: unspecifiedGenerator, - [ResourceType.WORKFLOW]: workflowListGenerator, -}; - -const workflowDetailGenerator = ({ - project, - domain, - name, -}: ResourceIdentifier) => Routes.WorkflowDetails.makeUrl(project, domain, name); -const launchPlanDetailGenerator = ({ - project, - domain, - name, -}: ResourceIdentifier) => - Routes.LaunchPlanDetails.makeUrl(project, domain, name); -const taskDetailGenerator = ({ project, domain, name }: ResourceIdentifier) => - Routes.TaskDetails.makeUrl(project, domain, name); - -export const backToDetailUrlGenerator: { - [k in ResourceType]: (id: ResourceIdentifier) => string; -} = { - [ResourceType.DATASET]: unimplementedGenerator, - [ResourceType.LAUNCH_PLAN]: launchPlanDetailGenerator, - [ResourceType.TASK]: taskDetailGenerator, - [ResourceType.UNSPECIFIED]: unspecifiedGenerator, - [ResourceType.WORKFLOW]: workflowDetailGenerator, -}; - -const workflowVersopmDetailsGenerator = ({ - project, - domain, - name, - version, -}: Identifier) => - Routes.EntityVersionDetails.makeUrl( - project, - domain, - name, - entityStrings[ResourceType.WORKFLOW], - version, - ); -const taskVersionDetailsGenerator = ({ - project, - domain, - name, - version, -}: Identifier) => - Routes.EntityVersionDetails.makeUrl( - project, - domain, - name, - entityStrings[ResourceType.TASK], - version, - ); -const launchPlanVersionDetailsGenerator = ({ - project, - domain, - name, - version, -}: Identifier) => - Routes.EntityVersionDetails.makeUrl( - project, - domain, - name, - entityStrings[ResourceType.LAUNCH_PLAN], - version, - ); - -const entityMapVersionDetailsUrl: { - [k in ResourceType]: (id: Identifier) => string; -} = { - [ResourceType.DATASET]: unimplementedGenerator, - [ResourceType.LAUNCH_PLAN]: launchPlanVersionDetailsGenerator, - [ResourceType.TASK]: taskVersionDetailsGenerator, - [ResourceType.UNSPECIFIED]: unspecifiedGenerator, - [ResourceType.WORKFLOW]: workflowVersopmDetailsGenerator, -}; - -export const versionDetailsUrlGenerator = (id: Identifier): string => { - if (id?.resourceType) return entityMapVersionDetailsUrl[id?.resourceType](id); - return ''; -}; diff --git a/packages/console/src/components/Entities/test/EntityDetails.test.tsx b/packages/console/src/components/Entities/test/EntityDetails.test.tsx deleted file mode 100644 index 917525cce..000000000 --- a/packages/console/src/components/Entities/test/EntityDetails.test.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { render, waitFor, screen, within } from '@testing-library/react'; -import { ResourceIdentifier } from 'models/Common/types'; -import * as React from 'react'; -import { createMockTask } from 'models/__mocks__/taskData'; -import { createMockWorkflow } from 'models/__mocks__/workflowData'; -import { Task } from 'models/Task/types'; -import { Workflow } from 'models/Workflow/types'; -import { projects } from 'mocks/data/projects'; -import * as projectApi from 'models/Project/api'; -import { MemoryRouter } from 'react-router'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { EntityDetails } from '../EntityDetails'; - -const queryClient = new QueryClient(); - -jest.mock('models/Project/api'); - -describe('EntityDetails', () => { - let mockWorkflow: Workflow; - let mockTask: Task; - - // mock api for listProjects - const mockListProjects = jest.spyOn(projectApi, 'listProjects'); - mockListProjects.mockResolvedValue([projects['flyteTest']]); - - const createMocks = () => { - mockWorkflow = createMockWorkflow('MyWorkflow'); - mockTask = createMockTask('MyTask'); - }; - - const renderDetails = (id: ResourceIdentifier) => { - return render( - - - - - , - ); - }; - - beforeEach(() => { - createMocks(); - }); - - const checkTextInDetailPage = async ( - id: ResourceIdentifier, - versionsString: string, - executionsString: string, - ) => { - // check text for header - await waitFor(() => - expect( - within(screen.getByText(`${id.domain} / ${id.name}`, { exact: false })), - ).toBeInTheDocument(), - ); - - // check text for versions - await waitFor(() => - expect(within(screen.getByText(versionsString))).toBeInTheDocument(), - ); - - // check text for executions - await waitFor(() => - expect(within(screen.getByText(executionsString))).toBeInTheDocument(), - ); - }; - - it('renders Task Details Page', async () => { - const id: ResourceIdentifier = mockTask.id as ResourceIdentifier; - renderDetails(id); - checkTextInDetailPage( - id, - 'Recent Task Versions', - 'All Executions in the Task', - ); - }); - - it('renders Workflow Details Page', async () => { - const id: ResourceIdentifier = mockWorkflow.id as ResourceIdentifier; - renderDetails(id); - checkTextInDetailPage( - id, - 'Recent Workflow Versions', - 'All Executions in the Workflow', - ); - }); -}); diff --git a/packages/console/src/components/Entities/test/EntitySchedules.test.tsx b/packages/console/src/components/Entities/test/EntitySchedules.test.tsx deleted file mode 100644 index a6f1429b7..000000000 --- a/packages/console/src/components/Entities/test/EntitySchedules.test.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { render, waitFor } from '@testing-library/react'; -import { - createMockLaunchPlan, - mockLaunchPlanSchedules, -} from 'models/__mocks__/launchPlanData'; -import { FilterOperation, FilterOperationName } from 'models/AdminEntity/types'; -import { ResourceIdentifier, ResourceType } from 'models/Common/types'; -import { listLaunchPlans } from 'models/Launch/api'; -import { LaunchPlan, LaunchPlanState } from 'models/Launch/types'; -import * as React from 'react'; -import { MemoryRouter } from 'react-router'; -import { EntitySchedules } from '../EntitySchedules'; -import t from '../strings'; - -jest.mock('models/Launch/api'); - -describe('EntitySchedules', () => { - const mockListLaunchPlans = listLaunchPlans as jest.Mock< - ReturnType - >; - const id: ResourceIdentifier = { - resourceType: ResourceType.WORKFLOW, - project: 'project', - domain: 'domain', - name: 'name', - }; - let launchPlans: LaunchPlan[]; - - const renderSchedules = async () => { - const result = render( - - - , - ); - await waitFor(() => result.getByText(t('schedulesHeader'))); - return result; - }; - - beforeEach(() => { - launchPlans = [ - createMockLaunchPlan('EveryTenMinutes', 'abcdefg'), - createMockLaunchPlan('Daily6AM', 'abcdefg'), - ]; - launchPlans[0].spec.entityMetadata.schedule = - mockLaunchPlanSchedules.everyTenMinutes; - launchPlans[1].spec.entityMetadata.schedule = - mockLaunchPlanSchedules.everyDay6AM; - mockListLaunchPlans.mockResolvedValue({ entities: launchPlans }); - }); - - it('should only request active schedules', async () => { - const expectedFilterOpration: FilterOperation = { - key: 'state', - operation: FilterOperationName.EQ, - value: LaunchPlanState.ACTIVE, - }; - - await renderSchedules(); - expect(mockListLaunchPlans).toHaveBeenCalledWith( - expect.any(Object), - expect.objectContaining({ - filter: expect.arrayContaining([expectedFilterOpration]), - }), - ); - }); - - it('should request schedules for only the given workflow Id', async () => { - const expectedFilterOperations: FilterOperation[] = [ - { - key: 'workflow.name', - operation: FilterOperationName.EQ, - value: id.name, - }, - { - key: 'workflow.domain', - operation: FilterOperationName.EQ, - value: id.domain, - }, - { - key: 'workflow.project', - operation: FilterOperationName.EQ, - value: id.project, - }, - ]; - await renderSchedules(); - expect(mockListLaunchPlans).toHaveBeenCalledWith( - expect.any(Object), - expect.objectContaining({ - filter: expect.arrayContaining(expectedFilterOperations), - }), - ); - }); -}); diff --git a/packages/console/src/components/Entities/test/EntityVersionDetails.test.tsx b/packages/console/src/components/Entities/test/EntityVersionDetails.test.tsx deleted file mode 100644 index 6a7368d9e..000000000 --- a/packages/console/src/components/Entities/test/EntityVersionDetails.test.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { render, waitFor, screen } from '@testing-library/react'; -import { ThemeProvider } from '@material-ui/styles'; -import { getMuiTheme } from 'components/Theme/muiTheme'; -import { ResourceIdentifier } from 'models/Common/types'; -import * as React from 'react'; -import { createMockTask } from 'models/__mocks__/taskData'; -import { Task } from 'models/Task/types'; -import { getTask } from 'models/Task/api'; -import { APIContext } from 'components/data/apiContext'; -import { mockAPIContextValue } from 'components/data/__mocks__/apiContext'; -import { EntityVersionDetails } from '../VersionDetails/EntityVersionDetails'; - -describe('EntityVersionDetails', () => { - let mockTask: Task; - let mockGetTask: jest.Mock>; - - const createMocks = () => { - mockTask = createMockTask('MyTask'); - mockGetTask = jest.fn().mockImplementation(() => Promise.resolve(mockTask)); - }; - - const renderDetails = (id: ResourceIdentifier) => { - return render( - - - - - , - ); - }; - - describe('Task Version Details', () => { - beforeEach(() => { - createMocks(); - }); - - it('renders and checks text', async () => { - const id: ResourceIdentifier = mockTask.id as ResourceIdentifier; - renderDetails(id); - - // check text for Task Details - await waitFor(() => { - expect(screen.getByText('Task Details')).toBeInTheDocument(); - }); - - // check text for image - await waitFor(() => { - expect( - screen.getByText( - mockTask.closure.compiledTask.template?.container?.image || '', - ), - ).toBeInTheDocument(); - }); - - // check for env vars - if (mockTask.closure.compiledTask.template?.container?.env) { - const envVars = mockTask.closure.compiledTask.template?.container?.env; - for (let i = 0; i < envVars.length; i++) { - await waitFor(() => { - expect(screen.getByText(envVars[i].key || '')).toBeInTheDocument(); - expect( - screen.getByText(envVars[i].value || ''), - ).toBeInTheDocument(); - }); - } - } - }); - }); -}); diff --git a/packages/console/src/components/Entities/test/TaskVersionDetailsLink.test.tsx b/packages/console/src/components/Entities/test/TaskVersionDetailsLink.test.tsx deleted file mode 100644 index a6f636675..000000000 --- a/packages/console/src/components/Entities/test/TaskVersionDetailsLink.test.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { render, waitFor, screen } from '@testing-library/react'; -import * as React from 'react'; -import { createMockTask } from 'models/__mocks__/taskData'; -import { Task } from 'models/Task/types'; -import { Identifier } from 'models/Common/types'; -import { versionDetailsUrlGenerator } from 'components/Entities/generators'; -import { TaskVersionDetailsLink } from '../VersionDetails/VersionDetailsLink'; - -describe('TaskVersionDetailsLink', () => { - let mockTask: Task; - - const createMocks = () => { - mockTask = createMockTask('MyTask'); - }; - - const renderLink = (id: Identifier) => { - return render(); - }; - - beforeEach(() => { - createMocks(); - }); - - it('renders and checks text', async () => { - const id: Identifier = mockTask.id; - renderLink(id); - await waitFor(() => { - expect(screen.getByText('Task Details')).toBeInTheDocument(); - }); - }); - - it('renders and checks containing icon', () => { - const id: Identifier = mockTask.id; - const { container } = renderLink(id); - expect(container.querySelector('svg')).not.toBeNull(); - }); - - it('renders and checks url', () => { - const id: Identifier = mockTask.id; - const { container } = renderLink(id); - expect(container.firstElementChild).toHaveAttribute( - 'href', - versionDetailsUrlGenerator(id), - ); - }); -}); diff --git a/packages/console/src/components/Errors/DataError.tsx b/packages/console/src/components/Errors/DataError.tsx deleted file mode 100644 index 5828d9042..000000000 --- a/packages/console/src/components/Errors/DataError.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Button } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import ErrorOutline from '@material-ui/icons/ErrorOutline'; -import { NonIdealState } from 'components/common/NonIdealState'; -import { NotFound } from 'components/NotFound/NotFound'; -import { NotAuthorizedError, NotFoundError } from 'errors/fetchErrors'; -import * as React from 'react'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - margin: `${theme.spacing(2)}px 0`, - }, -})); - -export interface DataErrorProps { - errorTitle: string; - error?: Error; - retry?: () => void; -} - -/** A shared error component to be used when data fails to load. */ -export const DataError: React.FC = ({ - error, - errorTitle, - retry, -}) => { - const styles = useStyles(); - if (error instanceof NotFoundError) { - return ; - } - // For NotAuthorized, we will be displaying a global error. - if (error instanceof NotAuthorizedError) { - return null; - } - - const description = error ? error.message : undefined; - - const action = retry ? ( - - ) : undefined; - return ( - - {action} - - ); -}; diff --git a/packages/console/src/components/Errors/index.ts b/packages/console/src/components/Errors/index.ts deleted file mode 100644 index b8ee89f61..000000000 --- a/packages/console/src/components/Errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './DataError'; diff --git a/packages/console/src/components/Errors/test/DataError.test.tsx b/packages/console/src/components/Errors/test/DataError.test.tsx deleted file mode 100644 index b594aa18a..000000000 --- a/packages/console/src/components/Errors/test/DataError.test.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { render } from '@testing-library/react'; -import { NotAuthorizedError, NotFoundError } from 'errors/fetchErrors'; -import * as React from 'react'; -import { DataError, DataErrorProps } from '../DataError'; - -describe('DataError', () => { - const defaultProps: DataErrorProps = { - errorTitle: 'Test Error', - }; - - it('renders nothing for NotAuthorized errors', () => { - const { container } = render( - , - ); - expect(container).toBeEmptyDOMElement(); - }); - - it('renders not found for NotFound errors', () => { - const { getByText } = render( - , - ); - expect(getByText('Not found')).not.toBeEmptyDOMElement(); - }); -}); diff --git a/packages/console/src/components/Executions/CacheStatus.tsx b/packages/console/src/components/Executions/CacheStatus.tsx deleted file mode 100644 index 2a6a43823..000000000 --- a/packages/console/src/components/Executions/CacheStatus.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import { SvgIconProps, Tooltip, Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import CachedOutlined from '@material-ui/icons/CachedOutlined'; -import ErrorOutlined from '@material-ui/icons/ErrorOutlined'; -import InfoOutlined from '@material-ui/icons/InfoOutlined'; -import SmsFailedOutlinedIcon from '@material-ui/icons/SmsFailedOutlined'; -import classnames from 'classnames'; -import { assertNever } from 'common/utils'; -import { PublishedWithChangesOutlined } from 'components/common/PublishedWithChanges'; -import { useCommonStyles } from 'components/common/styles'; -import { CatalogCacheStatus } from 'models/Execution/enums'; -import { TaskExecutionIdentifier } from 'models/Execution/types'; -import { MapCacheIcon } from '@flyteorg/ui-atoms'; -import * as React from 'react'; -import { Link as RouterLink } from 'react-router-dom'; -import { Routes } from 'routes/routes'; -import { - cacheStatusMessages, - unknownCacheStatusString, - viewSourceExecutionString, -} from './constants'; - -const useStyles = makeStyles((theme: Theme) => ({ - cacheStatus: { - alignItems: 'center', - display: 'flex', - marginTop: theme.spacing(1), - }, - sourceExecutionLink: { - fontWeight: 'normal', - }, -})); - -/** Renders the appropriate icon for a given CatalogCacheStatus */ -const NodeExecutionCacheStatusIcon: React.ComponentType< - SvgIconProps & { - status: CatalogCacheStatus; - } -> = React.forwardRef(({ status, ...props }, ref) => { - switch (status) { - case CatalogCacheStatus.CACHE_DISABLED: { - return ; - } - case CatalogCacheStatus.CACHE_MISS: - case CatalogCacheStatus.CACHE_SKIPPED: { - return ( - - ); - } - case CatalogCacheStatus.CACHE_HIT: { - return ; - } - case CatalogCacheStatus.CACHE_POPULATED: { - return ( - - ); - } - case CatalogCacheStatus.CACHE_LOOKUP_FAILURE: - case CatalogCacheStatus.CACHE_PUT_FAILURE: { - return ; - } - case CatalogCacheStatus.MAP_CACHE: { - // @ts-ignore - return ; - } - default: { - assertNever(status as never); - return null; - } - } -}); - -export interface CacheStatusProps { - cacheStatus: CatalogCacheStatus | null | undefined; - /** `normal` will render an icon with description message beside it - * `iconOnly` will render just the icon with the description as a tooltip - */ - variant?: 'normal' | 'iconOnly'; - sourceTaskExecutionId?: TaskExecutionIdentifier; - iconStyles?: React.CSSProperties; - className?: string; -} - -export const CacheStatus: React.FC = ({ - cacheStatus, - sourceTaskExecutionId, - variant = 'normal', - iconStyles, - className, -}) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - - if (cacheStatus == null) { - return null; - } - - const message = cacheStatusMessages[cacheStatus] || unknownCacheStatusString; - - return variant === 'iconOnly' ? ( - - - - ) : ( - <> - - - {message} - - {sourceTaskExecutionId && ( - - {viewSourceExecutionString} - - )} - - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions.tsx b/packages/console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions.tsx deleted file mode 100644 index 88e88acea..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions.tsx +++ /dev/null @@ -1,246 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { - Button, - Dialog, - DialogContent, - Grid, - IconButton, -} from '@material-ui/core'; -import { ResourceIdentifier, Identifier } from 'models/Common/types'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { getTask } from 'models/Task/api'; -import { LaunchFormDialog } from 'components/Launch/LaunchForm/LaunchFormDialog'; -import { NodeExecutionIdentifier } from 'models/Execution/types'; -import { - useNodeExecution, - useNodeExecutionData, -} from 'components/hooks/useNodeExecution'; -import { literalsToLiteralValueMap } from 'components/Launch/LaunchForm/utils'; -import { TaskInitialLaunchParameters } from 'components/Launch/LaunchForm/types'; -import { NodeExecutionPhase } from 'models/Execution/enums'; -import { extractCompiledNodes } from 'components/hooks/utils'; -import Close from '@material-ui/icons/Close'; -import classnames from 'classnames'; -import { Fullscreen, FullscreenExit } from '@material-ui/icons'; -import { useEscapeKey } from 'components/hooks/useKeyListener'; -import { NodeExecutionDetails } from '../types'; -import t from './strings'; -import { ExecutionNodeDeck } from './ExecutionNodeDeck'; -import { - useNodeExecutionContext, - useNodeExecutionsById, -} from '../contextProvider/NodeExecutionDetails'; - -const useStyles = makeStyles((theme: Theme) => { - return { - actionsContainer: { - borderTop: `1px solid ${theme.palette.divider}`, - marginTop: theme.spacing(2), - paddingTop: theme.spacing(2), - '& button': { - marginRight: theme.spacing(1), - }, - }, - dialog: { - maxWidth: `calc(100% - ${theme.spacing(12)}px)`, - maxHeight: `calc(100% - ${theme.spacing(12)}px)`, - height: theme.spacing(90), - width: theme.spacing(110), - transition: 'all 0.3s ease', - }, - fullscreenDialog: { - maxWidth: '100vw', - width: '100vw', - maxHeight: '100svh', - height: '100svh', - margin: 0, - transition: 'all 0.3s ease', - borderRadius: 0, - }, - dialogHeader: { - padding: theme.spacing(2), - paddingBottom: theme.spacing(0), - fontFamily: 'Open sans', - }, - deckTitle: { - flexGrow: 1, - textAlign: 'center', - fontSize: '24px', - lineHeight: '32px', - marginBlock: 0, - paddingTop: theme.spacing(2), - paddingBottom: theme.spacing(2), - }, - close: { - paddingRight: theme.spacing(2), - }, - }; -}); -interface ExecutionDetailsActionsProps { - className?: string; - details?: NodeExecutionDetails; - nodeExecutionId: NodeExecutionIdentifier; - phase: NodeExecutionPhase; - text?: { - flyteDeckText?: string; - rerunText?: string; - resumeText?: string; - }; -} - -export const ExecutionDetailsActions = ({ - className, - details, - nodeExecutionId, - phase, - text, -}: ExecutionDetailsActionsProps): JSX.Element => { - const styles = useStyles(); - - const [showLaunchForm, setShowLaunchForm] = useState(false); - const [showResumeForm, setShowResumeForm] = useState(false); - - const [initialParameters, setInitialParameters] = useState< - TaskInitialLaunchParameters | undefined - >(undefined); - const { nodeExecutionsById } = useNodeExecutionsById(); - const executionData = useNodeExecutionData(nodeExecutionId); - const execution = useNodeExecution(nodeExecutionId); - const { compiledWorkflowClosure } = useNodeExecutionContext(); - const id = details?.taskTemplate?.id; - - const compiledNode = extractCompiledNodes(compiledWorkflowClosure).find( - node => - node.id === - nodeExecutionsById[nodeExecutionId.nodeId]?.metadata?.specNodeId || - node.id === nodeExecutionId.nodeId, - ); - - useEffect(() => { - if (!id) { - return; - } - - (async () => { - const task = await getTask(id!); - - const literals = executionData.value.fullInputs?.literals; - const taskInputsTypes = - task.closure.compiledTask.template?.interface?.inputs?.variables; - - const tempInitialParameters: TaskInitialLaunchParameters = { - values: - literals && - taskInputsTypes && - literalsToLiteralValueMap(literals, taskInputsTypes), - taskId: id as Identifier | undefined, - }; - - setInitialParameters(tempInitialParameters); - })(); - }, [details]); - - const [showDeck, setShowDeck] = React.useState(false); - const onCloseDeck = () => setShowDeck(false); - - // Close deck modal on escape key press - useEscapeKey(onCloseDeck); - - const [fullScreen, setSetFullScreen] = React.useState(false); - const toggleFullScreen = () => { - setSetFullScreen(!fullScreen); - }; - - const rerunOnClick = (e: React.MouseEvent) => { - e.stopPropagation(); - setShowLaunchForm(true); - }; - - const onResumeClick = (e: React.MouseEvent) => { - e.stopPropagation(); - setShowResumeForm(true); - }; - - return ( - <> -
- {execution?.value?.closure?.deckUri && ( - - )} - {id && initialParameters && details && ( - - )} - {phase === NodeExecutionPhase.PAUSED && ( - - )} -
- {id && initialParameters && ( - - )} - {compiledNode && ( - - )} - {execution?.value?.closure?.deckUri && ( - - - - - {fullScreen ? : } - - - -

{t('flyteDeck')}

-
- - - - - -
- - - - -
- )} - - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx b/packages/console/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx deleted file mode 100644 index 17b512a10..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx +++ /dev/null @@ -1,277 +0,0 @@ -import React from 'react'; -import { Box, Button, Dialog, Grid, Link, Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import ArrowBack from '@material-ui/icons/ArrowBack'; -import classnames from 'classnames'; -import { navbarGridHeight } from 'common/layout'; -import { ButtonCircularProgress } from 'components/common/ButtonCircularProgress'; -import { MoreOptionsMenu } from 'components/common/MoreOptionsMenu'; -import { useCommonStyles } from 'components/common/styles'; -import { useLocationState } from 'components/hooks/useLocationState'; -import { Link as RouterLink } from 'react-router-dom'; -import { history } from 'routes/history'; -import { Routes } from 'routes/routes'; -import { WorkflowExecutionPhase } from 'models/Execution/enums'; -import { SubNavBarContent } from 'components/Navigation/SubNavBarContent'; -import { useEscapeKey } from 'components/hooks/useKeyListener'; -import { FeatureFlag, useFeatureFlag } from 'basics/FeatureFlags'; -import { BreadcrumbTitleActions } from 'components/Breadcrumbs'; -import { ExecutionInputsOutputsModal } from '../ExecutionInputsOutputsModal'; -import { ExecutionStatusBadge } from '../ExecutionStatusBadge'; -import { TerminateExecutionButton } from '../TerminateExecution/TerminateExecutionButton'; -import { executionIsRunning, executionIsTerminal } from '../utils'; -import { backLinkTitle, executionActionStrings } from './constants'; -import { RelaunchExecutionForm } from './RelaunchExecutionForm'; -import { getExecutionBackLink, getExecutionSourceId } from './utils'; -import { useRecoverExecutionState } from './useRecoverExecutionState'; -import { ExecutionContext } from '../contexts'; - -const useStyles = makeStyles((theme: Theme) => { - return { - actions: { - alignItems: 'center', - display: 'flex', - justifyContent: 'flex-end', - flex: '1 0 auto', - height: '100%', - marginLeft: theme.spacing(2), - }, - backLink: { - color: 'inherit', - marginRight: theme.spacing(1), - }, - container: { - alignItems: 'center', - display: 'flex', - flex: '1 1 auto', - maxWidth: '100%', - }, - inputsOutputsLink: { - color: theme.palette.primary.main, - }, - title: { - flex: '0 1 auto', - marginLeft: theme.spacing(2), - }, - titleContainer: { - alignItems: 'center', - display: 'flex', - flex: '0 1 auto', - flexDirection: 'column', - maxHeight: theme.spacing(navbarGridHeight), - overflow: 'hidden', - }, - version: { - flex: '0 1 auto', - overflow: 'hidden', - }, - }; -}); - -/** Renders information about a given Execution into the NavBar */ -export const ExecutionDetailsAppBarContentInner: React.FC<{}> = () => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - - const isBreadcrumbFlag = useFeatureFlag(FeatureFlag.breadcrumbs); - - const { execution } = React.useContext(ExecutionContext); - const { domain, name, project } = execution.id; - - const [showInputsOutputs, setShowInputsOutputs] = React.useState(false); - const [showRelaunchForm, setShowRelaunchForm] = React.useState(false); - const { phase } = execution.closure; - const sourceId = getExecutionSourceId(execution); - const { backLink: originalBackLink = getExecutionBackLink(execution) } = - useLocationState(); - - const isRunning = executionIsRunning(execution); - const isTerminal = executionIsTerminal(execution); - const onClickShowInputsOutputs = () => setShowInputsOutputs(true); - const onClickRelaunch = () => setShowRelaunchForm(true); - const onCloseRelaunch = (_?: any) => setShowRelaunchForm(false); - - // Close modal on escape key press - useEscapeKey(onCloseRelaunch); - - const fromExecutionNav = new URLSearchParams(history.location.search).get( - 'fromExecutionNav', - ); - const backLink = fromExecutionNav - ? Routes.ProjectDetails.sections.dashboard.makeUrl(project, domain) - : originalBackLink; - - const { - recoverExecution, - recoverState: { isLoading: recovering, data: recoveredId }, - } = useRecoverExecutionState(); - - React.useEffect(() => { - if (!recovering && recoveredId) { - history.push(Routes.ExecutionDetails.makeUrl(recoveredId)); - } - }, [recovering, recoveredId]); - - let modalContent: JSX.Element | null = null; - if (showInputsOutputs) { - const onClose = () => setShowInputsOutputs(false); - modalContent = ( - - ); - } - - const onClickRecover = React.useCallback(async () => { - await recoverExecution(); - }, [recoverExecution]); - - const isRecoverVisible = React.useMemo( - () => - [ - WorkflowExecutionPhase.FAILED, - WorkflowExecutionPhase.ABORTED, - WorkflowExecutionPhase.TIMED_OUT, - ].includes(phase), - [phase], - ); - - const actionContent = isRunning ? ( - - ) : isTerminal ? ( - <> - {isRecoverVisible && ( - - - - )} - - - - - ) : null; - - // For non-terminal executions, add an overflow menu with the ability to clone - const moreActionsContent = !isTerminal ? ( - - ) : null; - - return ( - <> - {!isBreadcrumbFlag && ( -
- - - - -
- - - {`${project}/${domain}/${sourceId.name}/`} - {name} - - -
-
- - - View Inputs & Outputs - - - {actionContent} - {moreActionsContent} -
-
- )} - {isBreadcrumbFlag && ( - - - - - - - - View Inputs & Outputs - - - {actionContent && <>{actionContent}} - {moreActionsContent && <>{moreActionsContent}} - - - )} - - - - {modalContent} - - ); -}; - -export const ExecutionDetailsAppBarContent: React.FC<{}> = () => { - return ( - - - - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/ExecutionNodeURL.tsx b/packages/console/src/components/Executions/ExecutionDetails/ExecutionNodeURL.tsx deleted file mode 100644 index 5d6577c59..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/ExecutionNodeURL.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import * as React from 'react'; -import { Box, Button, SvgIconTypeMap, Typography } from '@material-ui/core'; -import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; -import { docco } from 'react-syntax-highlighter/dist/esm/styles/hljs/docco'; -import FileCopyIcon from '@material-ui/icons/FileCopy'; -import { DefaultComponentProps } from '@material-ui/core/OverridableComponent'; -import copyToClipboard from 'copy-to-clipboard'; -import { Theme, makeStyles } from '@material-ui/core/styles'; -import { - primaryHighlightColor, - separatorColor, - errorBackgroundColor, - listhoverColor, -} from 'components/Theme/constants'; -import classNames from 'classnames'; -import { RowExpander } from '../Tables/RowExpander'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - marginLeft: '-10px', - }, - codeWrapper: { - overflow: 'hidden', - border: `1px solid ${separatorColor}`, - borderRadius: 4, - marginLeft: '16px', - }, - - hoverWrapper: { - position: 'relative', - - '& .textButton': { - color: theme.palette.primary.main, - border: 'none', - right: '2px', - top: 0, - }, - - '& .copyButton': { - backgroundColor: theme.palette.common.white, - border: `1px solid ${primaryHighlightColor}`, - borderRadius: theme.spacing(1), - color: theme.palette.text.secondary, - height: theme.spacing(4), - minWidth: 0, - padding: 0, - position: 'absolute', - right: theme.spacing(2), - top: theme.spacing(1), - width: theme.spacing(4), - display: 'none', - - '&:hover': { - backgroundColor: listhoverColor, - }, - }, - '&:hover': { - '& .copyButton': { - display: 'flex', - }, - }, - - '& pre': { - margin: '0 !important', - }, - }, -})); - -const CopyButton: React.FC< - DefaultComponentProps> & { - onCopyClick: React.MouseEventHandler; - buttonVariant?: 'text' | 'button'; - } -> = ({ onCopyClick, buttonVariant, children, ...props }) => { - return ( - - ); -}; - -/** Fetches and renders the deck data for a given `nodeExecutionId` */ -export const ExecutionNodeURL: React.FC<{ - dataSourceURI?: string; - copyUrlText: string; -}> = ({ dataSourceURI, copyUrlText }) => { - const styles = useStyles(); - const [expanded, setExpanded] = React.useState(false); - const isHttps = /^https:/.test(window.location.href); - - const code = isHttps - ? // https snippet - `from flytekit.remote.remote import FlyteRemote -from flytekit.configuration import Config -remote = FlyteRemote( - Config.for_endpoint("${window.location.host}"), -) -remote.get("${dataSourceURI}")` - : // http snippet - `from flytekit.remote.remote import FlyteRemote -from flytekit.configuration import Config -remote = FlyteRemote( - Config.for_endpoint("${window.location.host}", True), -) -remote.get("${dataSourceURI}")`; - - const toggleExpanded = () => { - setExpanded(!expanded); - }; - - return dataSourceURI ? ( - - - { - event.preventDefault(); - - copyToClipboard(dataSourceURI); - }} - > - - {copyUrlText} - - - - - - - FlyteRemote Usage - - - - - - {code} - - - { - event.preventDefault(); - - copyToClipboard(code); - }} - /> - - - - ) : null; -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/ExecutionTab.tsx b/packages/console/src/components/Executions/ExecutionDetails/ExecutionTab.tsx deleted file mode 100644 index 865220744..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/ExecutionTab.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import * as React from 'react'; -import { WorkflowGraph } from 'components/WorkflowGraph/WorkflowGraph'; -import { Theme, makeStyles } from '@material-ui/core/styles'; -import { tabs } from './constants'; -import { NodeExecutionsTable } from '../Tables/NodeExecutionsTable'; -import { DetailsPanelContextProvider } from './DetailsPanelContext'; -import { ScaleProvider } from './Timeline/scaleContext'; -import { ExecutionTimelineContainer } from './Timeline/ExecutionTimelineContainer'; -import { useNodeExecutionFiltersState } from '../filters/useExecutionFiltersState'; - -const useStyles = makeStyles((theme: Theme) => ({ - nodesContainer: { - borderTop: `1px solid ${theme.palette.divider}`, - display: 'flex', - flex: '1 1 100%', - flexDirection: 'column', - minHeight: 0, - }, -})); - -interface ExecutionTabProps { - tabType: string; -} - -/** Contains the available ways to visualize the nodes of a WorkflowExecution */ -export const ExecutionTab: React.FC = ({ tabType }) => { - const styles = useStyles(); - const filterState = useNodeExecutionFiltersState(); - - return ( - - -
- {tabType === tabs.nodes.id && ( - - )} - {tabType === tabs.graph.id && } - {tabType === tabs.timeline.id && } -
-
-
- ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/ExecutionTabView.tsx b/packages/console/src/components/Executions/ExecutionDetails/ExecutionTabView.tsx deleted file mode 100644 index 408802537..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/ExecutionTabView.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import { Tab, Tabs } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { useTabState } from 'components/hooks/useTabState'; -import { secondaryBackgroundColor } from 'components/Theme/constants'; -import { tabs } from './constants'; -import { ExecutionTab } from './ExecutionTab'; - -const useStyles = makeStyles((theme: Theme) => ({ - tabs: { - background: secondaryBackgroundColor, - paddingLeft: theme.spacing(3.5), - }, -})); - -const DEFAULT_TAB = tabs.nodes.id; - -/** Contains the available ways to visualize the nodes of a WorkflowExecution */ -export const ExecutionTabView: React.FC<{}> = () => { - const styles = useStyles(); - const tabState = useTabState(tabs, DEFAULT_TAB); - - return ( - <> - - - - - - - - - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionDetailsPanelContent.tsx b/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionDetailsPanelContent.tsx deleted file mode 100644 index 9cb04ef71..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionDetailsPanelContent.tsx +++ /dev/null @@ -1,487 +0,0 @@ -import React, { useEffect, useMemo, useRef, useState } from 'react'; -import { IconButton, Typography, Tab, Tabs } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { ArrowBackIos, Close } from '@material-ui/icons'; -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import { InfoIcon } from 'components/common/Icons/InfoIcon'; -import { bodyFontFamily, smallFontSize } from 'components/Theme/constants'; -import { ExecutionStatusBadge } from 'components/Executions/ExecutionStatusBadge'; -import { LocationState } from 'components/hooks/useLocationState'; -import { useTabState } from 'components/hooks/useTabState'; -import { LocationDescriptor } from 'history'; -import { Workflow } from 'models/Workflow/types'; -import { - MapTaskExecution, - NodeExecution, - NodeExecutionIdentifier, -} from 'models/Execution/types'; -import Skeleton from 'react-loading-skeleton'; -import { useQueryClient } from 'react-query'; -import { Link as RouterLink } from 'react-router-dom'; -import { Routes } from 'routes/routes'; -import { NoDataIsAvailable } from 'components/Literals/LiteralMapViewer'; -import { fetchWorkflow } from 'components/Workflow/workflowQueries'; -import { PanelSection } from 'components/common/PanelSection'; -import { DumpJSON } from 'components/common/DumpJSON'; -import { ScrollableMonospaceText } from 'components/common/ScrollableMonospaceText'; -import { dNode } from 'models/Graph/types'; -import { NodeExecutionPhase, TaskExecutionPhase } from 'models/Execution/enums'; -import { - transformWorkflowToKeyedDag, - getNodeNameFromDag, -} from 'components/WorkflowGraph/utils'; -import { TaskVersionDetailsLink } from 'components/Entities/VersionDetails/VersionDetailsLink'; -import { Identifier } from 'models/Common/types'; -import { isEqual, values } from 'lodash'; -import { extractCompiledNodes } from 'components/hooks/utils'; -import { NodeExecutionCacheStatus } from '../NodeExecutionCacheStatus'; -import { getTaskExecutions } from '../nodeExecutionQueries'; -import { NodeExecutionDetails } from '../types'; -import { - useNodeExecutionContext, - useNodeExecutionsById, -} from '../contextProvider/NodeExecutionDetails'; -import { getTaskExecutionDetailReasons } from './utils'; -import { fetchWorkflowExecution } from '../useWorkflowExecution'; -import { NodeExecutionTabs } from './NodeExecutionTabs'; -import { ExecutionDetailsActions } from './ExecutionDetailsActions'; -import { getNodeFrontendPhase, isNodeGateNode } from '../utils'; -import { WorkflowNodeExecution } from '../contexts'; - -const useStyles = makeStyles((theme: Theme) => { - const paddingVertical = `${theme.spacing(2)}px`; - const paddingHorizontal = `${theme.spacing(3)}px`; - return { - notRunStatus: { - alignItems: 'center', - backgroundColor: 'gray', - borderRadius: '4px', - color: theme.palette.text.primary, - display: 'flex', - flex: '0 0 auto', - height: theme.spacing(3), - fontSize: smallFontSize, - justifyContent: 'center', - textTransform: 'uppercase', - width: theme.spacing(11), - fontFamily: bodyFontFamily, - fontWeight: 'bold', - }, - closeButton: { - marginLeft: theme.spacing(1), - }, - container: { - display: 'flex', - flexDirection: 'column', - height: '100%', - paddingTop: theme.spacing(2), - width: '100%', - }, - content: { - overflowY: 'auto', - }, - displayId: { - marginBottom: theme.spacing(1), - }, - header: { - borderBottom: `${theme.spacing(1)}px solid ${theme.palette.divider}`, - }, - headerContent: { - padding: `0 ${paddingHorizontal} ${paddingVertical} ${paddingHorizontal}`, - }, - nodeTypeContainer: { - alignItems: 'flex-end', - borderTop: `1px solid ${theme.palette.divider}`, - display: 'flex', - flexDirection: 'row', - fontWeight: 'bold', - justifyContent: 'space-between', - marginTop: theme.spacing(2), - paddingTop: theme.spacing(2), - }, - actionsContainer: { - borderTop: `1px solid ${theme.palette.divider}`, - marginTop: theme.spacing(2), - paddingTop: theme.spacing(2), - }, - nodeTypeContent: { - minWidth: theme.spacing(9), - }, - nodeTypeLink: { - fontWeight: 'normal', - }, - tabs: { - borderBottom: `1px solid ${theme.palette.divider}`, - }, - title: { - alignItems: 'flex-start', - display: 'flex', - justifyContent: 'space-between', - }, - statusContainer: { - display: 'flex', - flexDirection: 'column', - }, - statusHeaderContainer: { - display: 'flex', - alignItems: 'center', - }, - reasonsIcon: { - marginLeft: theme.spacing(1), - cursor: 'pointer', - }, - statusBody: { - marginTop: theme.spacing(2), - }, - }; -}); - -const tabIds = { - executions: 'executions', - inputs: 'inputs', - outputs: 'outputs', - task: 'task', -}; - -interface NodeExecutionDetailsProps { - nodeExecutionId: NodeExecutionIdentifier; - taskPhase: TaskExecutionPhase; - onClose?: () => void; -} - -const NodeExecutionLinkContent: React.FC<{ - execution: NodeExecution; -}> = ({ execution }) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - const { workflowNodeMetadata } = execution.closure; - if (!workflowNodeMetadata) { - return null; - } - const linkTarget: LocationDescriptor = { - pathname: Routes.ExecutionDetails.makeUrl(workflowNodeMetadata.executionId), - state: { - backLink: Routes.ExecutionDetails.makeUrl(execution.id.executionId), - }, - }; - return ( - - View Sub-Workflow - - ); -}; - -const ExecutionTypeDetails: React.FC<{ - details?: NodeExecutionDetails; - execution: NodeExecution; -}> = ({ details, execution }) => { - const styles = useStyles(); - const commonStyles = useCommonStyles(); - return ( -
-
-
- Type -
-
{details ? details.displayType : }
-
- -
- ); -}; - -// TODO FC#393: Check if it could be replaced with tabsContent or simplified further. -// Check if we need to request task info instead of relying on dag -// Also check strange setDag pattern -const WorkflowTabs: React.FC<{ - dagData: dNode; - nodeId: string; -}> = ({ dagData, nodeId }) => { - const styles = useStyles(); - const tabState = useTabState(tabIds, tabIds.inputs); - - let tabContent: JSX.Element | null = null; - const id = nodeId.slice(nodeId.lastIndexOf('-') + 1); - const taskTemplate = dagData[id]?.value.template; - switch (tabState.value) { - case tabIds.inputs: { - tabContent = taskTemplate ? ( - - - - ) : null; - break; - } - case tabIds.task: { - tabContent = taskTemplate ? ( - - - - - ) : null; - break; - } - } - return ( - <> - - - {!!taskTemplate && } - -
{tabContent}
- - ); -}; - -/** DetailsPanel content which renders execution information about a given NodeExecution - */ -export const NodeExecutionDetailsPanelContent: React.FC< - NodeExecutionDetailsProps -> = ({ nodeExecutionId, taskPhase, onClose }) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - const queryClient = useQueryClient(); - - const { nodeExecutionsById, setCurrentNodeExecutionsById } = - useNodeExecutionsById(); - - const nodeExecution = useMemo(() => { - const finalExecution = values(nodeExecutionsById).find(node => - isEqual(node.id, nodeExecutionId), - ); - - return finalExecution; - }, [nodeExecutionId, nodeExecutionsById]); - - const [isReasonsVisible, setReasonsVisible] = useState(false); - const [dag, setDag] = useState(null); - const [details, setDetails] = useState(); - const [selectedTaskExecution, setSelectedTaskExecution] = - useState(); - - const { getNodeExecutionDetails, compiledWorkflowClosure } = - useNodeExecutionContext(); - - const isGateNode = isNodeGateNode( - extractCompiledNodes(compiledWorkflowClosure), - nodeExecutionsById[nodeExecutionId.nodeId]?.metadata?.specNodeId || - nodeExecutionId.nodeId, - ); - - const [nodeExecutionLoading, setNodeExecutionLoading] = - useState(false); - - const isMounted = useRef(false); - useEffect(() => { - isMounted.current = true; - return () => { - isMounted.current = false; - }; - }, []); - - useEffect(() => { - let isCurrent = true; - getNodeExecutionDetails(nodeExecution).then(res => { - if (isCurrent) { - setDetails(res); - } - }); - - return () => { - isCurrent = false; - }; - }, [nodeExecution]); - - useEffect(() => { - let isCurrent = true; - - async function fetchTasksData(queryClient) { - setNodeExecutionLoading(true); - const newNode = await getTaskExecutions(queryClient, nodeExecution!); - - if (isCurrent && newNode) { - const { - closure: _, - metadata: __, - ...parentLight - } = newNode || ({} as WorkflowNodeExecution); - - setCurrentNodeExecutionsById({ - [newNode.scopedId!]: parentLight as WorkflowNodeExecution, - }); - setNodeExecutionLoading(false); - } - } - - if (nodeExecution && !nodeExecution?.tasksFetched) { - fetchTasksData(queryClient); - } else { - if (isCurrent) { - setNodeExecutionLoading(false); - } - } - return () => { - isCurrent = false; - }; - }, [nodeExecution]); - - useEffect(() => { - setReasonsVisible(false); - }, [nodeExecutionId]); - - useEffect(() => { - setSelectedTaskExecution(undefined); - }, [nodeExecutionId, taskPhase]); - - // TODO: needs to be removed - const getWorkflowDag = async () => { - const workflowExecution = await fetchWorkflowExecution( - queryClient, - nodeExecutionId.executionId, - ); - const workflowData: Workflow = await fetchWorkflow( - queryClient, - workflowExecution.closure.workflowId, - ); - if (workflowData) { - const keyedDag = transformWorkflowToKeyedDag(workflowData); - if (isMounted.current) setDag(keyedDag); - } - }; - - if (!nodeExecution) { - getWorkflowDag(); - } else { - if (dag) setDag(null); - } - - const reasons = getTaskExecutionDetailReasons( - nodeExecution?.taskExecutions ?? [], - ); - - const onBackClick = () => { - setSelectedTaskExecution(undefined); - }; - - const headerTitle = useMemo(() => { - const mapTaskHeader = `${selectedTaskExecution?.taskIndex} of ${nodeExecutionId.nodeId}`; - const header = selectedTaskExecution - ? mapTaskHeader - : nodeExecutionId.nodeId; - - return ( - -
- {!!selectedTaskExecution && ( - - - - )} - {header} -
- - - -
- ); - }, [nodeExecutionId, selectedTaskExecution]); - - const frontendPhase = useMemo(() => { - const computedPhase = getNodeFrontendPhase( - nodeExecution?.closure.phase ?? NodeExecutionPhase.UNDEFINED, - isGateNode, - ); - return computedPhase; - }, [nodeExecution, isGateNode]); - - const statusContent = nodeExecution ? ( -
-
- -
- {reasons?.length ? ( -
- -
- ) : null} -
- ) : ( -
NOT RUN
- ); - - let detailsContent: JSX.Element | null = null; - if (nodeExecution) { - detailsContent = ( - <> - - - - ); - } - - const tabsContent: JSX.Element | null = nodeExecution ? ( - - ) : null; - - const emptyName = isGateNode ? <> : ; - const displayName = details?.displayName ?? emptyName; - - return ( -
-
-
- {headerTitle} - - {dag - ? getNodeNameFromDag(dag, nodeExecutionId.nodeId) - : displayName} - - {statusContent} - {!dag && detailsContent} - -
-
- {!nodeExecutionLoading && dag ? ( - - ) : ( - tabsContent - )} -
- ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/NodeExecutionInputs.tsx b/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/NodeExecutionInputs.tsx deleted file mode 100644 index 1fb9f702a..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/NodeExecutionInputs.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { PanelSection } from 'components/common/PanelSection'; -import { WaitForData } from 'components/common/WaitForData'; -import { useNodeExecutionData } from 'components/hooks/useNodeExecution'; -import { LiteralMapViewer } from 'components/Literals/LiteralMapViewer'; -import { NodeExecution } from 'models/Execution/types'; -import * as React from 'react'; -import { ExecutionNodeURL } from '../ExecutionNodeURL'; - -/** Fetches and renders the input data for a given `NodeExecution` */ -export const NodeExecutionInputs: React.FC<{ - execution: NodeExecution; - taskIndex?: number; -}> = ({ execution, taskIndex }) => { - const executionData = useNodeExecutionData(execution.id); - - return ( - - - {(() => { - const data = executionData?.value; - const fullInputs = data?.fullInputs; - const dataSourceURI = data?.flyteUrls?.inputs; - const hasInputs = Object.keys(fullInputs?.literals || {}).length > 0; - return ( - <> - {hasInputs && taskIndex === undefined ? ( - - ) : null} - - - ); - })()} - - - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/NodeExecutionOutputs.tsx b/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/NodeExecutionOutputs.tsx deleted file mode 100644 index c74318c9a..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/NodeExecutionOutputs.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { PanelSection } from 'components/common/PanelSection'; -import { WaitForData } from 'components/common/WaitForData'; -import { useNodeExecutionData } from 'components/hooks/useNodeExecution'; -import { LiteralMapViewer } from 'components/Literals/LiteralMapViewer'; -import { NodeExecution } from 'models/Execution/types'; -import * as React from 'react'; -import { ExecutionNodeURL } from '../ExecutionNodeURL'; - -/** Fetches and renders the output data for a given `NodeExecution` */ -export const NodeExecutionOutputs: React.FC<{ - execution: NodeExecution; - taskIndex?: number; -}> = ({ execution, taskIndex }) => { - const executionData = useNodeExecutionData(execution.id); - - return ( - - - {(() => { - const data = executionData?.value; - const fullOutputs = data?.fullOutputs; - const dataSourceURI = data?.flyteUrls?.outputs; - const hasOutputs = - Object.keys(fullOutputs?.literals || {}).length > 0; - return ( - <> - {hasOutputs && taskIndex === undefined ? ( - - ) : null} - - - ); - })()} - - - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/index.tsx b/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/index.tsx deleted file mode 100644 index 8d759aadc..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/index.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import * as React from 'react'; -import { makeStyles } from '@material-ui/core/styles'; -import { Tab, Tabs } from '@material-ui/core'; -import { MapTaskExecution, NodeExecution } from 'models/Execution/types'; -import { TaskTemplate } from 'models/Task/types'; -import { useTabState } from 'components/hooks/useTabState'; -import { PanelSection } from 'components/common/PanelSection'; -import { DumpJSON } from 'components/common/DumpJSON'; -import { isMapTaskType } from 'models/Task/utils'; -import { TaskExecutionPhase } from 'models/Execution/enums'; -import { MapTaskExecutionDetails } from 'components/Executions/TaskExecutionsList/MapTaskExecutionDetails'; -import { TaskVersionDetailsLink } from 'components/Entities/VersionDetails/VersionDetailsLink'; -import { Identifier } from 'models/Common/types'; -import { TaskExecutionsList } from '../../TaskExecutionsList/TaskExecutionsList'; -import { NodeExecutionInputs } from './NodeExecutionInputs'; -import { NodeExecutionOutputs } from './NodeExecutionOutputs'; - -const useStyles = makeStyles(theme => { - return { - content: { - overflowY: 'auto', - paddingBottom: '100px', // TODO @FC 454 temporary fix for panel height issue - }, - tabs: { - borderBottom: `1px solid ${theme.palette.divider}`, - '& .c--MuiTab-root': { - minWidth: 'auto', - }, - '& .MuiTabs-flexContainer': { - justifyContent: 'space-around', - }, - }, - tabItem: { - margin: theme.spacing(0, 1), - }, - }; -}); - -const tabIds = { - executions: 'executions', - inputs: 'inputs', - outputs: 'outputs', - task: 'task', -}; - -const defaultTab = tabIds.executions; - -export const NodeExecutionTabs: React.FC<{ - nodeExecution: NodeExecution; - selectedTaskExecution?: MapTaskExecution; - onTaskSelected: (val: MapTaskExecution) => void; - phase?: TaskExecutionPhase; - taskTemplate?: TaskTemplate | null; - taskIndex?: number; -}> = ({ - nodeExecution, - selectedTaskExecution, - onTaskSelected, - taskTemplate, - phase, - taskIndex, -}) => { - const styles = useStyles(); - const tabState = useTabState(tabIds, defaultTab); - - if (tabState.value === tabIds.task && !taskTemplate) { - // Reset tab value, if task tab is selected, while no taskTemplate is avaible - // can happen when user switches between nodeExecutions without closing the drawer - tabState.onChange(() => { - /* */ - }, defaultTab); - } - - let tabContent: JSX.Element | null = null; - switch (tabState.value) { - case tabIds.executions: { - tabContent = selectedTaskExecution ? ( - - ) : ( - - ); - break; - } - case tabIds.inputs: { - tabContent = ( - - ); - break; - } - case tabIds.outputs: { - tabContent = ( - - ); - break; - } - case tabIds.task: { - tabContent = taskTemplate ? ( - - - - - ) : null; - break; - } - } - - const executionLabel = - isMapTaskType(taskTemplate?.type) && !selectedTaskExecution - ? 'Map Execution' - : 'Executions'; - - return ( - <> - - - - - {!!taskTemplate && ( - - )} - -
{tabContent}
- - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/test/index.test.tsx b/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/test/index.test.tsx deleted file mode 100644 index 9dd8fed89..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/NodeExecutionTabs/test/index.test.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { render } from '@testing-library/react'; -import { useTabState } from 'components/hooks/useTabState'; -import { extractTaskTemplates } from 'components/hooks/utils'; -import { TaskExecutionPhase } from 'models/Execution/enums'; -import { createMockNodeExecutions } from 'models/Execution/__mocks__/mockNodeExecutionsData'; -import { TaskType } from 'models/Task/constants'; -import { createMockWorkflow } from 'models/__mocks__/workflowData'; -import * as React from 'react'; -import { mockExecution as mockTaskExecution } from 'models/Execution/__mocks__/mockTaskExecutionsData'; -import { NodeExecutionTabs } from '../index'; - -const getMockNodeExecution = () => createMockNodeExecutions(1).executions[0]; -const nodeExecution = getMockNodeExecution(); -const workflow = createMockWorkflow('SampleWorkflow'); -const taskTemplate = { - ...extractTaskTemplates(workflow)[0], - type: TaskType.ARRAY, -}; -const phase = TaskExecutionPhase.SUCCEEDED; - -jest.mock('components/hooks/useTabState'); - -describe('NodeExecutionTabs', () => { - const mockUseTabState = useTabState as jest.Mock; - mockUseTabState.mockReturnValue({ onChange: jest.fn(), value: 'executions' }); - describe('with map tasks', () => { - it('should display proper tab name when it was provided and shouldShow is TRUE', () => { - const { queryByText, queryAllByRole } = render( - , - ); - expect(queryAllByRole('tab')).toHaveLength(4); - expect(queryByText('Executions')).toBeInTheDocument(); - }); - - it('should display proper tab name when it was provided and shouldShow is FALSE', () => { - const { queryByText, queryAllByRole } = render( - , - ); - - expect(queryAllByRole('tab')).toHaveLength(4); - expect(queryByText('Map Execution')).toBeInTheDocument(); - }); - }); - - describe('without map tasks', () => { - it('should display proper tab name when mapTask was not provided', () => { - const { queryAllByRole, queryByText } = render( - , - ); - - expect(queryAllByRole('tab')).toHaveLength(3); - expect(queryByText('Executions')).toBeInTheDocument(); - }); - }); -}); diff --git a/packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/StatusIndicator.tsx b/packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/StatusIndicator.tsx deleted file mode 100644 index b13f2cc30..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/StatusIndicator.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { makeStyles } from '@material-ui/core/styles'; -import classnames from 'classnames'; -import { NodeConfig, Point } from 'components/flytegraph/types'; -import * as React from 'react'; - -const useStyles = makeStyles(() => ({ - pulse: { - animation: '1200ms infinite alternate', - animationName: 'pulse', - }, - '@keyframes pulse': { - '0%': { - opacity: 0.35, - }, - '80%': { - opacity: 1, - }, - }, -})); - -const statusSize = 11; - -/** Renders an indicator for a node based on execution status */ -export const StatusIndicator: React.FC<{ - color: string; - config: NodeConfig; - position: Point; - pulse: boolean; -}> = ({ color, config, position, pulse }) => ( - - - -); diff --git a/packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/TaskExecutionNode.tsx b/packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/TaskExecutionNode.tsx deleted file mode 100644 index d796b38bf..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/TaskExecutionNode.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import React from 'react'; -import { useNodeExecutionsById } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { getNodeExecutionPhaseConstants } from 'components/Executions/utils'; -import { NodeRendererProps, Point } from 'components/flytegraph/types'; -import { TaskNodeRenderer } from 'components/WorkflowGraph/TaskNodeRenderer'; -import { NodeExecutionPhase } from 'models/Execution/enums'; -import { DAGNode } from 'models/Graph/types'; -import { StatusIndicator } from './StatusIndicator'; - -/** Renders DAGNodes with colors based on their node type, as well as dots to - * indicate the execution status - */ -export const TaskExecutionNode: React.FC< - NodeRendererProps -> = props => { - const { node, config, selected } = props; - const { nodeExecutionsById } = useNodeExecutionsById(); - const nodeExecution = nodeExecutionsById[node.id]; - - const phase = nodeExecution - ? nodeExecution.closure.phase - : NodeExecutionPhase.UNDEFINED; - const { badgeColor: color } = getNodeExecutionPhaseConstants(phase); - const renderStatus = phase !== NodeExecutionPhase.UNDEFINED; - - const height = config.fontSize + config.textPadding * 2; - const width = node.textWidth + config.textPadding * 2; - - // Position status indicator centered on left border - const statusPosition: Point = { - x: -width / 2, - y: 0, - }; - - const noStatusOverlayProps = { - height, - width, - fill: 'white', - opacity: selected ? 0 : 0.35, - stroke: 'white', - strokeWidth: selected ? 0 : config.strokeWidth, - rx: config.cornerRounding, - ry: config.cornerRounding, - x: -width / 2, - y: -height / 2, - }; - - const nodeChildren = renderStatus ? ( - - ) : ( - - ); - - return {nodeChildren}; -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/TaskExecutionNodeRenderer.tsx b/packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/TaskExecutionNodeRenderer.tsx deleted file mode 100644 index 50ae08531..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/TaskExecutionNodeRenderer/TaskExecutionNodeRenderer.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { NodeRendererProps } from 'components/flytegraph/types'; -import { TaskNodeRenderer } from 'components/WorkflowGraph/TaskNodeRenderer'; -import { isEndNode, isStartNode } from 'models/Node/utils'; -import { DAGNode } from 'models/Graph/types'; -import * as React from 'react'; -import { TaskExecutionNode } from './TaskExecutionNode'; - -/** Renders DAGNodes with colors based on their node type, as well as dots to - * indicate the execution status - */ -export const TaskExecutionNodeRenderer: React.FC< - NodeRendererProps -> = props => { - if (isStartNode(props.node) || isEndNode(props.node)) { - return ; - } - return ; -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/Timeline/ChartHeader.tsx b/packages/console/src/components/Executions/ExecutionDetails/Timeline/ChartHeader.tsx deleted file mode 100644 index d145f0810..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/Timeline/ChartHeader.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import * as React from 'react'; -import moment from 'moment-timezone'; -import makeStyles from '@material-ui/core/styles/makeStyles'; -import { COLOR_SPECTRUM } from 'components/Theme/colorSpectrum'; -import { useScaleContext } from './scaleContext'; -import { TimeZone } from './helpers'; - -interface StyleProps { - chartWidth: number; - labelInterval: number; -} - -const useStyles = makeStyles(_theme => ({ - chartHeader: (props: StyleProps) => ({ - height: 41, - display: 'flex', - alignItems: 'center', - width: `${props.chartWidth}px`, - }), - taskDurationsLabelItem: (props: StyleProps) => ({ - fontSize: 12, - fontFamily: 'Open Sans', - fontWeight: 'bold', - color: COLOR_SPECTRUM.gray40.color, - paddingLeft: 10, - width: `${props.labelInterval}px`, - }), -})); - -interface HeaderProps extends StyleProps { - chartTimezone: string; - totalDurationSec: number; - startedAt: Date; -} - -export const ChartHeader = (props: HeaderProps) => { - const styles = useStyles(props); - - const { chartInterval: chartTimeInterval, setMaxValue } = useScaleContext(); - const { startedAt, chartTimezone, totalDurationSec } = props; - - React.useEffect(() => { - setMaxValue(props.totalDurationSec); - }, [props.totalDurationSec, setMaxValue]); - - const labels = React.useMemo(() => { - const len = Math.ceil(totalDurationSec / chartTimeInterval); - const lbs = len > 0 ? new Array(len).fill('') : []; - return lbs.map((_, idx) => { - const time = moment.utc( - new Date(startedAt.getTime() + idx * chartTimeInterval * 1000), - ); - return chartTimezone === TimeZone.UTC - ? time.format('hh:mm:ss A') - : time.local().format('hh:mm:ss A'); - }); - }, [chartTimezone, startedAt, chartTimeInterval, totalDurationSec]); - - return ( -
- {labels.map(label => { - return ( -
- {label} -
- ); - })} -
- ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimeline.tsx b/packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimeline.tsx deleted file mode 100644 index 3fd9a32d3..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimeline.tsx +++ /dev/null @@ -1,245 +0,0 @@ -import React, { - createRef, - useContext, - useEffect, - useRef, - useState, -} from 'react'; -import { makeStyles, Typography } from '@material-ui/core'; -import { tableHeaderColor } from 'components/Theme/constants'; -import { timestampToDate } from 'common/utils'; -import { dNode } from 'models/Graph/types'; -import { - fetchChildrenExecutions, - searchNode, -} from 'components/Executions/utils'; -import { useQueryClient } from 'react-query'; -import { eq, merge } from 'lodash'; -import { useNodeExecutionsById } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { ExecutionContext } from 'components/Executions/contexts'; -import { useExecutionMetrics } from 'components/Executions/useExecutionMetrics'; -import { convertToPlainNodes } from './helpers'; -import { ChartHeader } from './ChartHeader'; -import { useScaleContext } from './scaleContext'; -import { TaskNames } from './TaskNames'; -import { getChartDurationData } from './TimelineChart/chartData'; -import { TimelineChart } from './TimelineChart'; -import t from '../strings'; -import { - getExecutionMetricsOperationIds, - parseSpanData, -} from './TimelineChart/utils'; - -interface StyleProps { - chartWidth: number; - itemsShown: number; -} - -const useStyles = makeStyles(theme => ({ - chartHeader: (props: StyleProps) => ({ - marginTop: -10, - marginLeft: -15, - width: `${props.chartWidth + 20}px`, - height: `${56 * props.itemsShown + 20}px`, - }), - taskNames: { - display: 'flex', - flexDirection: 'column', - borderRight: `1px solid ${theme.palette.divider}`, - overflowY: 'auto', - }, - taskNamesHeader: { - textTransform: 'uppercase', - fontSize: 12, - fontWeight: 'bold', - lineHeight: '16px', - color: tableHeaderColor, - height: 45, - flexBasis: 45, - display: 'flex', - alignItems: 'center', - borderBottom: `4px solid ${theme.palette.divider}`, - paddingLeft: 30, - }, - taskDurations: { - borderLeft: `1px solid ${theme.palette.divider}`, - marginLeft: 4, - flex: 1, - overflow: 'hidden', - display: 'flex', - flexDirection: 'column', - }, - taskDurationsLabelsView: { - overflow: 'hidden', - borderBottom: `4px solid ${theme.palette.divider}`, - }, - taskDurationsView: { - flex: 1, - overflowY: 'hidden', - }, -})); - -const INTERVAL_LENGTH = 110; - -interface ExProps { - chartTimezone: string; - initialNodes: dNode[]; -} - -export const ExecutionTimeline: React.FC = ({ - chartTimezone, - initialNodes, -}) => { - const [chartWidth, setChartWidth] = useState(0); - const [labelInterval, setLabelInterval] = useState(INTERVAL_LENGTH); - const durationsRef = useRef(null); - const durationsLabelsRef = useRef(null); - const taskNamesRef = createRef(); - - const [originalNodes, setOriginalNodes] = useState(initialNodes); - const [showNodes, setShowNodes] = useState([]); - const [startedAt, setStartedAt] = useState(new Date()); - const queryClient = useQueryClient(); - const { nodeExecutionsById, setCurrentNodeExecutionsById } = - useNodeExecutionsById(); - const { chartInterval: chartTimeInterval } = useScaleContext(); - const { execution } = useContext(ExecutionContext); - const executionMetricsData = useExecutionMetrics(execution.id, 10); - - useEffect(() => { - setOriginalNodes(ogn => { - const newNodes = merge(initialNodes, ogn); - - if (!eq(newNodes, ogn)) { - return newNodes; - } - - return ogn; - }); - - const plainNodes = convertToPlainNodes(originalNodes); - const updatedShownNodesMap = plainNodes.map(node => { - const execution = nodeExecutionsById[node.scopedId]; - return { - ...node, - startedAt: execution?.closure.startedAt, - execution, - }; - }); - setShowNodes(updatedShownNodesMap); - - // set startTime for all timeline offset and duration calculations. - const firstStartedAt = updatedShownNodesMap[0]?.startedAt; - if (firstStartedAt) { - setStartedAt(timestampToDate(firstStartedAt)); - } - }, [initialNodes, originalNodes, nodeExecutionsById]); - - const { items: barItemsData, totalDurationSec } = getChartDurationData( - showNodes, - startedAt, - ); - const styles = useStyles({ - chartWidth: chartWidth, - itemsShown: showNodes.length, - }); - - useEffect(() => { - // Sync width of elements and intervals of ChartHeader (time labels) and TimelineChart - const calcWidth = - Math.ceil(totalDurationSec / chartTimeInterval) * INTERVAL_LENGTH; - if (durationsRef.current && calcWidth < durationsRef.current.clientWidth) { - setLabelInterval( - durationsRef.current.clientWidth / - Math.ceil(totalDurationSec / chartTimeInterval), - ); - setChartWidth(durationsRef.current.clientWidth); - } else { - setChartWidth(calcWidth); - setLabelInterval(INTERVAL_LENGTH); - } - }, [totalDurationSec, chartTimeInterval, durationsRef]); - - const onGraphScroll = () => { - // cover horizontal scroll only - const scrollLeft = durationsRef?.current?.scrollLeft ?? 0; - const labelView = durationsLabelsRef?.current; - if (labelView) { - labelView.scrollTo({ - left: scrollLeft, - }); - } - }; - - const onVerticalNodesScroll = () => { - const scrollTop = taskNamesRef?.current?.scrollTop ?? 0; - const graphView = durationsRef?.current; - if (graphView) { - graphView.scrollTo({ - top: scrollTop, - }); - } - }; - - const toggleNode = async (id: string, scopedId: string, level: number) => { - await fetchChildrenExecutions( - queryClient, - scopedId, - nodeExecutionsById, - setCurrentNodeExecutionsById, - ); - searchNode(originalNodes, 0, id, scopedId, level); - setOriginalNodes([...originalNodes]); - }; - - const operationIds = getExecutionMetricsOperationIds( - executionMetricsData.value, - ); - - const parsedExecutionMetricsData = parseSpanData(executionMetricsData.value); - - return ( - <> -
- - {t('taskNameColumnHeader')} - - -
-
-
- -
-
-
- -
-
-
- - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineContainer.tsx b/packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineContainer.tsx deleted file mode 100644 index efcd92e00..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineContainer.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import * as React from 'react'; -import { makeStyles } from '@material-ui/core/styles'; -import { useState } from 'react'; -import { useNodeExecutionsById } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { ExecutionTimeline } from './ExecutionTimeline'; -import { ExecutionTimelineFooter } from './ExecutionTimelineFooter'; -import { TimeZone } from './helpers'; - -const useStyles = makeStyles(() => ({ - wrapper: { - display: 'flex', - flexDirection: 'column', - flex: '1 1 100%', - }, - container: { - display: 'flex', - flex: '1 1 0', - overflowY: 'auto', - }, -})); - -export const ExecutionTimelineContainer: React.FC<{}> = () => { - const styles = useStyles(); - const [chartTimezone, setChartTimezone] = useState(TimeZone.Local); - const handleTimezoneChange = tz => setChartTimezone(tz); - - const { initialDNodes: initialNodes } = useNodeExecutionsById(); - return ( -
-
- -
- -
- ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineFooter.tsx b/packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineFooter.tsx deleted file mode 100644 index c9c356242..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/Timeline/ExecutionTimelineFooter.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import * as React from 'react'; -import { Theme, Radio, RadioGroup, Slider } from '@material-ui/core'; -import { makeStyles, withStyles } from '@material-ui/styles'; -import FormControlLabel from '@material-ui/core/FormControlLabel'; -import { COLOR_SPECTRUM } from 'components/Theme/colorSpectrum'; -import { TimeZone } from './helpers'; -import { useScaleContext } from './scaleContext'; - -function valueText(value: number) { - return `${value}s`; -} - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - borderTop: `1px solid ${theme.palette.divider}`, - padding: '20px 24px', - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - }, -})); - -const CustomSlider = withStyles({ - root: { - color: COLOR_SPECTRUM.indigo60.color, - height: 4, - padding: '15px 0', - width: 360, - }, - active: {}, - valueLabel: { - left: 'calc(-50% + 12px)', - color: COLOR_SPECTRUM.black.color, - top: -22, - '& *': { - background: 'transparent', - color: COLOR_SPECTRUM.black.color, - }, - }, - track: { - height: 4, - }, - rail: { - height: 4, - opacity: 0.5, - backgroundColor: COLOR_SPECTRUM.gray20.color, - }, - mark: { - backgroundColor: COLOR_SPECTRUM.gray20.color, - height: 8, - width: 2, - marginTop: -2, - }, - markLabel: { - top: -6, - fontSize: 12, - color: COLOR_SPECTRUM.gray40.color, - }, - markActive: { - opacity: 1, - backgroundColor: 'currentColor', - }, - marked: { - marginBottom: 0, - }, -})(Slider); - -interface ExecutionTimelineFooterProps { - onTimezoneChange?: (timezone: string) => void; -} - -export const ExecutionTimelineFooter: React.FC< - ExecutionTimelineFooterProps -> = ({ onTimezoneChange }) => { - const styles = useStyles(); - const [timezone, setTimezone] = React.useState(TimeZone.Local); - - const timeScale = useScaleContext(); - - const handleTimezoneChange = (event: React.ChangeEvent) => { - const newTimezone = (event.target as HTMLInputElement).value; - setTimezone(newTimezone); - if (onTimezoneChange) { - onTimezoneChange(newTimezone); - } - }; - - const handleTimeIntervalChange = (event, newValue) => { - timeScale.setScaleFactor(newValue); - }; - - return ( -
- <>{children}} - valueLabelDisplay="on" - getAriaValueText={valueText} - /> - - } - label="Local Time" - /> - } - label="UTC" - /> - -
- ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/Timeline/NodeExecutionName.tsx b/packages/console/src/components/Executions/ExecutionDetails/Timeline/NodeExecutionName.tsx deleted file mode 100644 index f3cfc30e4..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/Timeline/NodeExecutionName.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core'; -import Typography from '@material-ui/core/Typography'; -import classNames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import { useNodeExecutionContext } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { SelectNodeExecutionLink } from 'components/Executions/Tables/SelectNodeExecutionLink'; -import { isEqual } from 'lodash'; -import { NodeExecutionPhase } from 'models/Execution/enums'; -import { NodeExecution } from 'models/Execution/types'; -import React, { useEffect, useState } from 'react'; -import { useDetailsPanel } from '../DetailsPanelContext'; - -interface NodeExecutionTimelineNameData { - name: string; - templateName?: string; - execution?: NodeExecution; - className?: string; -} - -const useStyles = makeStyles((_theme: Theme) => ({ - selectedExecutionName: { - fontWeight: 'bold', - }, - displayName: { - marginTop: 4, - textOverflow: 'ellipsis', - width: '100%', - overflow: 'hidden', - }, -})); - -export const NodeExecutionName: React.FC = ({ - name, - templateName, - execution, - className, -}) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - - const { getNodeExecutionDetails } = useNodeExecutionContext(); - const { selectedExecution, setSelectedExecution } = useDetailsPanel(); - const [displayName, setDisplayName] = useState(); - - useEffect(() => { - let isCurrent = true; - getNodeExecutionDetails(execution).then(res => { - if (isCurrent) { - setDisplayName(res?.displayName); - } - }); - return () => { - isCurrent = false; - }; - }); - - if (!execution) { - // to avoid crash - disable items which do not have associated execution. - // as we won't be able to provide task info for them anyway. - return {name}; - } - const isSelected = - selectedExecution != null && isEqual(execution.id, selectedExecution); - - const defaultName = displayName ?? name; - const truncatedName = defaultName?.split('.').pop() || defaultName; - - return ( - <> - {isSelected || - execution.closure.phase === NodeExecutionPhase.UNDEFINED ? ( - - {truncatedName} - - ) : ( - - )} - {templateName && ( - - {templateName} - - )} - - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/Timeline/TaskNames.tsx b/packages/console/src/components/Executions/ExecutionDetails/Timeline/TaskNames.tsx deleted file mode 100644 index 32040a6f8..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/Timeline/TaskNames.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import React from 'react'; -import { IconButton, makeStyles, Theme, Tooltip } from '@material-ui/core'; -import { RowExpander } from 'components/Executions/Tables/RowExpander'; -import { getNodeTemplateName } from 'components/WorkflowGraph/utils'; -import { dNode } from 'models/Graph/types'; -import { PlayCircleOutline } from '@material-ui/icons'; -import { isParentNode } from 'components/Executions/utils'; -import { useNodeExecutionsById } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { isExpanded } from 'models/Node/utils'; -import { NodeExecutionName } from './NodeExecutionName'; -import t from '../strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - taskNamesList: { - overflowY: 'scroll', - flex: 1, - }, - namesContainer: { - display: 'flex', - flexDirection: 'row', - alignItems: 'flex-start', - justifyContent: 'left', - padding: '0 10px', - height: 56, - width: 256, - borderBottom: `1px solid ${theme.palette.divider}`, - whiteSpace: 'nowrap', - }, - namesContainerExpander: { - display: 'flex', - marginTop: 'auto', - marginBottom: 'auto', - }, - namesContainerBody: { - display: 'flex', - flexDirection: 'column', - alignItems: 'flex-start', - justifyContent: 'center', - whiteSpace: 'nowrap', - height: '100%', - overflow: 'hidden', - }, - leaf: { - width: 30, - }, -})); - -interface TaskNamesProps { - nodes: dNode[]; - onToggle: (id: string, scopeId: string, level: number) => void; - onAction?: (id: string) => void; - onScroll?: () => void; -} - -export const TaskNames = React.forwardRef( - ({ nodes, onScroll, onToggle, onAction }, ref) => { - const styles = useStyles(); - const { nodeExecutionsById } = useNodeExecutionsById(); - - const expanderRef = React.useRef(); - - return ( -
- {nodes.map(node => { - const nodeLevel = node?.level ?? 0; - const nodeExecution = nodeExecutionsById[node.scopedId]; - - return ( -
-
-
- {nodeExecution && isParentNode(nodeExecution) ? ( - } - expanded={isExpanded(node)} - onClick={() => - onToggle(node.id, node.scopedId, nodeLevel) - } - /> - ) : ( -
- )} -
- -
- -
-
- {onAction && ( - - onAction(node.id)} - data-testid={`resume-gate-node-${node.id}`} - > - - - - )} -
- ); - })} -
- ); - }, -); diff --git a/packages/console/src/components/Executions/ExecutionDetails/Timeline/TimelineChart/index.tsx b/packages/console/src/components/Executions/ExecutionDetails/Timeline/TimelineChart/index.tsx deleted file mode 100644 index 23b747a85..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/Timeline/TimelineChart/index.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import * as React from 'react'; -import { Bar } from 'react-chartjs-2'; -import { dNode } from 'models/Graph/types'; -import { Box, Theme, makeStyles } from '@material-ui/core'; - -import { NodeExecutionPhase } from 'models'; -import { getNodeExecutionPhaseConstants } from 'components/Executions/utils'; -import { - BarItemData, - formatSecondsToHmsFormat, - generateChartData, - getChartData, - getDuration, - parseSpanData, -} from './utils'; -import { getBarOptions } from './barOptions'; - -interface TimelineChartProps { - items: BarItemData[]; - nodes: dNode[]; - chartTimeIntervalSec: number; - operationIds: string[]; - parsedExecutionMetricsData: ReturnType; -} - -interface StyleProps { - opacity: number; - top: number; - left: number; - phaseColor: string; -} - -const useStyles = makeStyles(theme => ({ - tooltipContainer: { - position: 'absolute', - background: theme.palette.grey[100], - color: theme.palette.common.black, - padding: theme.spacing(2), - borderRadius: 8, - width: 'fit-content', - maxContent: 'fit-content', - top: ({ top }) => top + 10, - left: ({ left }) => left + 10, - display: ({ opacity }) => (opacity ? 'block' : 'none'), - }, - phaseText: { - width: 'fit-content', - marginBlockEnd: theme.spacing(1), - }, - tooltipText: { - minWidth: '50px', - }, - tooltipTextContainer: { - display: 'flex', - gap: 1, - color: theme.palette.grey[700], - }, - operationIdContainer: { - textAlign: 'left', - flex: 1, - }, -})); - -export const TimelineChart = (props: TimelineChartProps) => { - const [tooltip, setTooltip] = React.useState({ - opacity: 0, - top: 0, - left: 0, - dataIndex: -1, - }); - const chartRef = React.useRef(null); - const phaseData = generateChartData(props.items); - - const options = getBarOptions( - props.chartTimeIntervalSec, - phaseData.tooltipLabel, - chartRef, - tooltip, - setTooltip, - ) as any; - - const data = getChartData(phaseData); - const node = props.nodes[tooltip.dataIndex]; - const phase = node?.execution?.closure.phase ?? NodeExecutionPhase.UNDEFINED; - const phaseConstant = getNodeExecutionPhaseConstants(phase); - const spans = (node && props.parsedExecutionMetricsData[node.scopedId]) || []; - - const styles = useStyles({ - opacity: tooltip.opacity, - top: tooltip.top, - left: tooltip.left, - phaseColor: phaseConstant.badgeColor, - }); - - return ( - <> - - - {phase && {phaseConstant.text}} - {spans?.map(span => ( - - - {formatSecondsToHmsFormat( - Math.round( - (getDuration(span.startTime, span.endTime) / 1000) * 100, - ) / 100, - )} - - - {span.operationId} - - - ))} - - - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/Timeline/scaleContext.tsx b/packages/console/src/components/Executions/ExecutionDetails/Timeline/scaleContext.tsx deleted file mode 100644 index 6389e40bc..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/Timeline/scaleContext.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { Mark } from '@material-ui/core/Slider'; -import { log } from 'common/log'; -import * as React from 'react'; -import { createContext, useContext } from 'react'; -import { formatSecondsToHmsFormat } from './TimelineChart/utils'; - -const MIN_SCALE_VALUE = 60; // 1 min -const MAX_SCALE_VALUE = 3600; // 1h - -const DEFAULT_MAX = MIN_SCALE_VALUE; -const DEFAULT_SCALE_FACTOR = 1; - -const percentage = [0.02, 0.1, 0.4, 0.6, 0.8, 1]; -const maxScaleValue = percentage.length - 1; - -interface TimelineScaleState { - scaleFactor: number; - chartInterval: number; // value in seconds for one tic of an interval - marks: Mark[]; - setMaxValue: (newMax: number) => void; - setScaleFactor: (newScale: number) => void; -} - -/** Use this Context to redefine Provider returns in storybooks */ -export const ScaleContext = createContext({ - /** Default values used if ContextProvider wasn't initialized. */ - scaleFactor: DEFAULT_SCALE_FACTOR, - chartInterval: 20, - marks: [], - setMaxValue: () => { - log.error('ERROR: No ScaleContextProvider was found in parent components.'); - }, - setScaleFactor: () => { - log.error('ERROR: No ScaleContextProvider was found in parent components.'); - }, -}); - -/** Could be used to access the whole TimelineScaleState */ -export const useScaleContext = (): TimelineScaleState => - useContext(ScaleContext); - -interface ScaleProviderProps { - children?: React.ReactNode; -} - -/** Should wrap "top level" component in Execution view, will build a nodeExecutions tree for specific workflow */ -export const ScaleProvider = (props: ScaleProviderProps) => { - const [maxValue, setMaxValue] = React.useState(DEFAULT_MAX); - const [scaleFactor, setScaleFactor] = - React.useState(DEFAULT_SCALE_FACTOR); - const [marks, setMarks] = React.useState([]); - const [chartInterval, setChartInterval] = React.useState(1); - - React.useEffect(() => { - const getIntervalValue = (scale: number): number => { - const intervalValue = Math.ceil(maxValue * percentage[scale]); - return intervalValue > 0 ? intervalValue : 1; - }; - - setChartInterval(getIntervalValue(scaleFactor)); - - const newMarks: Mark[] = []; - for (let i = 0; i < percentage.length; ++i) { - newMarks.push({ - value: i, - label: formatSecondsToHmsFormat(getIntervalValue(i)), - }); - } - setMarks(newMarks); - }, [maxValue, scaleFactor]); - - const setMaxTimeValue = (newMax: number) => { - // use min and max caps - let newValue = - newMax < MIN_SCALE_VALUE - ? MIN_SCALE_VALUE - : newMax > MAX_SCALE_VALUE - ? MAX_SCALE_VALUE - : newMax; - // round a value to have full amount of minutes: - newValue = Math.ceil(newValue / 60) * 60; - setMaxValue(newValue); - }; - - const setNewScaleFactor = (newScale: number) => { - const applyScale = - newScale < 0 ? 0 : newScale > maxScaleValue ? maxScaleValue : newScale; - setScaleFactor(applyScale); - }; - - return ( - - {props.children} - - ); -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/index.ts b/packages/console/src/components/Executions/ExecutionDetails/index.ts deleted file mode 100644 index 27be36577..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './ExecutionDetails'; -export * from './ExecutionDetailsActions'; -export * from './useExecutionNodeViewsState'; -export * from './ExecutionNodeDeck'; diff --git a/packages/console/src/components/Executions/ExecutionDetails/test/ExecutionNodeViews.test.tsx b/packages/console/src/components/Executions/ExecutionDetails/test/ExecutionNodeViews.test.tsx deleted file mode 100644 index 9502e0702..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/test/ExecutionNodeViews.test.tsx +++ /dev/null @@ -1,227 +0,0 @@ -import * as React from 'react'; -import { fireEvent, render, waitFor, screen } from '@testing-library/react'; -import { filterLabels } from 'components/Executions/filters/constants'; -import { nodeExecutionStatusFilters } from 'components/Executions/filters/statusFilters'; -import { oneFailedTaskWorkflow } from 'mocks/data/fixtures/oneFailedTaskWorkflow'; -import { insertFixture } from 'mocks/data/insertFixture'; -import { mockServer } from 'mocks/server'; -import { Execution, NodeExecution } from 'models/Execution/types'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { createTestQueryClient } from 'test/utils'; -import { ExecutionContext } from 'components/Executions/contexts'; -import { listNodeExecutions, listTaskExecutions } from 'models/Execution/api'; -import { NodeExecutionPhase } from 'models'; -import { mockWorkflowId } from 'mocks/data/fixtures/types'; -import { - NodeExecutionDetailsContext, - WorkflowNodeExecutionsProvider, -} from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { transformerWorkflowToDag } from 'components/WorkflowGraph/transformerWorkflowToDag'; -import { ExecutionNodeViews } from '../ExecutionNodeViews'; -import { tabs } from '../constants'; - -jest.mock('components/Executions/Tables/NodeExecutionRow', () => ({ - NodeExecutionRow: jest.fn(({ node }) => ( -
- {node?.execution?.id?.nodeId} -
- )), -})); - -jest.mock( - 'components/Executions/ExecutionDetails/Timeline/ExecutionTimelineFooter', - () => ({ - ExecutionTimelineFooter: jest.fn(() =>
), - }), -); - -jest.mock( - 'components/Executions/ExecutionDetails/Timeline/TimelineChart/index', - () => ({ - TimelineChart: jest.fn(() =>
), - }), -); - -jest.mock( - 'components/Executions/ExecutionDetails/Timeline/NodeExecutionName', - () => ({ - NodeExecutionName: jest.fn(({ name }) =>
{name}
), - }), -); -jest.mock('models/Execution/api', () => ({ - listNodeExecutions: jest.fn(), - listTaskExecutions: jest.fn(), -})); - -jest.mock('components/WorkflowGraph/transformerWorkflowToDag', () => ({ - transformerWorkflowToDag: jest.fn(), -})); - -describe('ExecutionNodeViews', () => { - let queryClient: QueryClient; - let execution: Execution; - let fixture: ReturnType; - let nodeExecutionsArray: NodeExecution[]; - beforeEach(() => { - fixture = oneFailedTaskWorkflow.generate(); - execution = fixture.workflowExecutions.top.data; - insertFixture(mockServer, fixture); - const nodeExecutions = fixture.workflowExecutions.top.nodeExecutions; - nodeExecutionsArray = Object.values(nodeExecutions).map(({ data }) => data); - - transformerWorkflowToDag.mockImplementation(_ => { - const nodes = nodeExecutionsArray.map(n => ({ - id: n.id.nodeId, - scopedId: n.scopedId, - execution: n, - // type: dTypes.gateNode, - name: n.id.nodeId, - type: 3, - nodes: [], - edges: [], - })); - return { - dag: { - id: 'start-node', - scopedId: 'start-node', - value: { - id: 'start-node', - }, - type: 4, - name: 'start', - nodes: [ - { - id: 'start-node', - scopedId: 'start-node', - value: { - inputs: [], - upstreamNodeIds: [], - outputAliases: [], - id: 'start-node', - }, - type: 4, - name: 'start', - nodes: [], - edges: [], - }, - { - id: 'end-node', - scopedId: 'end-node', - value: { - inputs: [], - upstreamNodeIds: [], - outputAliases: [], - id: 'end-node', - }, - type: 5, - name: 'end', - nodes: [], - edges: [], - }, - ...nodes, - ], - }, - staticExecutionIdsMap: {}, - }; - }); - listNodeExecutions.mockImplementation((_, filters) => { - let finalNodes = nodeExecutionsArray; - if (filters?.filter?.length) { - const phases = filters?.filter - ?.filter(f => f.key === 'phase')?.[0] - .value?.map(f => NodeExecutionPhase[f]); - finalNodes = finalNodes.filter(n => { - return phases.includes(n.closure.phase); - }); - } - return Promise.resolve({ - entities: Object.values(finalNodes), - }); - }); - listTaskExecutions.mockImplementation(() => { - return Promise.resolve({ - entities: [], - }); - }); - queryClient = createTestQueryClient(); - }); - - const renderViews = () => - render( - - - - - - - - - , - ); - - it('maintains filter when switching back to nodes tab', async () => { - const { nodeExecutions } = fixture.workflowExecutions.top; - const failedNodeName = nodeExecutions.failedNode.data.id.nodeId; - const succeededNodeName = nodeExecutions.pythonNode.data.id.nodeId; - - const { getByText, queryByText, queryAllByTestId } = renderViews(); - - await waitFor(() => getByText(tabs.nodes.label)); - - const nodesTab = getByText(tabs.nodes.label); - const timelineTab = getByText(tabs.timeline.label); - - // Ensure we are on Nodes tab - await fireEvent.click(nodesTab); - await waitFor(() => { - const nodes = queryAllByTestId('node-execution-row'); - return nodes?.length === 2; - }); - - await waitFor(() => queryByText(succeededNodeName)); - - const statusButton = await waitFor(() => getByText(filterLabels.status)); - - // Apply 'Failed' filter and wait for list to include only the failed item - await fireEvent.click(statusButton); - - const failedFilter = await waitFor(() => - screen.getByLabelText(nodeExecutionStatusFilters.failed.label), - ); - - // Wait for succeeded task to disappear and ensure failed task remains - await fireEvent.click(failedFilter); - - await waitFor(() => { - const nodes = queryAllByTestId('node-execution-row'); - return nodes?.length === 1; - }); - - expect(queryByText(succeededNodeName)).not.toBeInTheDocument(); - - expect(queryByText(failedNodeName)).toBeInTheDocument(); - - // Switch to the Graph tab - await fireEvent.click(statusButton); - await fireEvent.click(timelineTab); - await waitFor(() => queryByText(succeededNodeName)); - - // expect all initital nodes to be rendered - expect(queryByText(succeededNodeName)).toBeInTheDocument(); - expect(queryByText(failedNodeName)).toBeInTheDocument(); - - // Switch back to Nodes Tab and verify filter still applied - await fireEvent.click(nodesTab); - await waitFor(() => queryByText(failedNodeName)); - expect(queryByText(succeededNodeName)).not.toBeInTheDocument(); - expect(queryByText(failedNodeName)).toBeInTheDocument(); - }); -}); diff --git a/packages/console/src/components/Executions/ExecutionDetails/test/ExecutionTabContent.test.tsx b/packages/console/src/components/Executions/ExecutionDetails/test/ExecutionTabContent.test.tsx deleted file mode 100644 index 63ddae854..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/test/ExecutionTabContent.test.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { render, waitFor } from '@testing-library/react'; -import { NodeExecutionDetailsContextProvider } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { WorkflowNodeExecutionsContext } from 'components/Executions/contexts'; -import { basicPythonWorkflow } from 'mocks/data/fixtures/basicPythonWorkflow'; -import { mockWorkflowId } from 'mocks/data/fixtures/types'; -import { insertFixture } from 'mocks/data/insertFixture'; -import { mockServer } from 'mocks/server'; -import * as React from 'react'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { createTestQueryClient } from 'test/utils'; -import { ExecutionTab } from '../ExecutionTab'; -import { tabs } from '../constants'; - -jest.mock('components/Workflow/workflowQueries'); -const { fetchWorkflow } = require('components/Workflow/workflowQueries'); - -jest.mock('components/common/DetailsPanel', () => ({ - DetailsPanel: jest.fn(({ children }) => ( -
{children}
- )), -})); - -jest.mock('components/Executions/Tables/NodeExecutionsTable', () => ({ - NodeExecutionsTable: jest.fn(({ children }) => ( -
{children}
- )), -})); -jest.mock( - 'components/Executions/ExecutionDetails/Timeline/ExecutionTimeline', - () => ({ - ExecutionTimeline: jest.fn(({ children }) => ( -
{children}
- )), - }), -); -jest.mock( - 'components/Executions/ExecutionDetails/Timeline/ExecutionTimelineFooter', - () => ({ - ExecutionTimelineFooter: jest.fn(({ children }) => ( -
{children}
- )), - }), -); -jest.mock('components/WorkflowGraph/WorkflowGraph', () => ({ - WorkflowGraph: jest.fn(({ children }) => ( -
{children}
- )), -})); - -describe('Executions > ExecutionDetails > ExecutionTabContent', () => { - let queryClient: QueryClient; - let fixture: ReturnType; - - beforeEach(() => { - queryClient = createTestQueryClient(); - fixture = basicPythonWorkflow.generate(); - insertFixture(mockServer, fixture); - fetchWorkflow.mockImplementation(() => - Promise.resolve(fixture.workflows.top), - ); - }); - - const renderTabContent = ({ tabType, nodeExecutionsById }) => { - return render( - - - - - - - , - ); - }; - - it('renders NodeExecutionsTable when the Nodes tab is selected', async () => { - const { queryByTestId } = renderTabContent({ - tabType: tabs.nodes.id, - nodeExecutionsById: {}, - }); - - await waitFor(() => queryByTestId('node-executions-table')); - expect(queryByTestId('node-executions-table')).toBeInTheDocument(); - }); - - it('renders WorkflowGraph when the Graph tab is selected', async () => { - const { queryByTestId } = renderTabContent({ - tabType: tabs.graph.id, - nodeExecutionsById: {}, - }); - - await waitFor(() => queryByTestId('workflow-graph')); - expect(queryByTestId('workflow-graph')).toBeInTheDocument(); - }); - - it('renders ExecutionTimeline when the Timeline tab is selected', async () => { - const { queryByTestId } = renderTabContent({ - tabType: tabs.timeline.id, - nodeExecutionsById: {}, - }); - - await waitFor(() => queryByTestId('execution-timeline')); - expect(queryByTestId('execution-timeline')).toBeInTheDocument(); - }); -}); diff --git a/packages/console/src/components/Executions/ExecutionDetails/test/NodeExecutionDetailsPanelContent.test.tsx b/packages/console/src/components/Executions/ExecutionDetails/test/NodeExecutionDetailsPanelContent.test.tsx deleted file mode 100644 index 4d41a184b..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/test/NodeExecutionDetailsPanelContent.test.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import * as React from 'react'; -import { render, waitFor } from '@testing-library/react'; -import { NodeExecutionDetailsContextProvider } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { basicPythonWorkflow } from 'mocks/data/fixtures/basicPythonWorkflow'; -import { mockWorkflowId } from 'mocks/data/fixtures/types'; -import { insertFixture } from 'mocks/data/insertFixture'; -import { mockServer } from 'mocks/server'; -import { TaskExecutionPhase } from 'models/Execution/enums'; -import { NodeExecution } from 'models/Execution/types'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { MemoryRouter } from 'react-router'; -import { createTestQueryClient } from 'test/utils'; -import { NodeExecutionDetailsPanelContent } from '../NodeExecutionDetailsPanelContent'; - -jest.mock( - 'components/Executions/ExecutionDetails/ExecutionDetailsActions', - () => ({ - ExecutionDetailsActions: jest.fn(() => ( -
- )), - }), -); -jest.mock('components/Workflow/workflowQueries'); -const { fetchWorkflow } = require('components/Workflow/workflowQueries'); - -describe('NodeExecutionDetailsPanelContent', () => { - let fixture: ReturnType; - let execution: NodeExecution; - let queryClient: QueryClient; - - beforeEach(() => { - fixture = basicPythonWorkflow.generate(); - execution = fixture.workflowExecutions.top.nodeExecutions.pythonNode.data; - insertFixture(mockServer, fixture); - fetchWorkflow.mockImplementation(() => - Promise.resolve(fixture.workflows.top), - ); - queryClient = createTestQueryClient(); - }); - - const renderComponent = () => - render( - - - - - - - , - ); - - it('renders name for task nodes', async () => { - const { name } = fixture.tasks.python.id; - const { getByText } = renderComponent(); - await waitFor(() => expect(getByText(name)).toBeInTheDocument()); - }); -}); diff --git a/packages/console/src/components/Executions/ExecutionDetails/test/NodeExecutionName.test.tsx b/packages/console/src/components/Executions/ExecutionDetails/test/NodeExecutionName.test.tsx deleted file mode 100644 index 7165a89c9..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/test/NodeExecutionName.test.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import * as React from 'react'; -import { render, waitFor } from '@testing-library/react'; -import { NodeExecutionDetailsContextProvider } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { mockWorkflowId } from 'mocks/data/fixtures/types'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { createTestQueryClient } from 'test/utils'; -import { insertFixture } from 'mocks/data/insertFixture'; -import { mockServer } from 'mocks/server'; -import { basicPythonWorkflow } from 'mocks/data/fixtures/basicPythonWorkflow'; -import { NodeExecution } from 'models/Execution/types'; -import { NodeExecutionName } from '../Timeline/NodeExecutionName'; - -jest.mock('components/Workflow/workflowQueries'); -const { fetchWorkflow } = require('components/Workflow/workflowQueries'); - -const name = 'Test'; -const templateName = 'TemplateTest'; - -describe('Executions > ExecutionDetails > NodeExecutionName', () => { - let queryClient: QueryClient; - let fixture: ReturnType; - let execution: NodeExecution; - - beforeEach(() => { - fixture = basicPythonWorkflow.generate(); - execution = fixture.workflowExecutions.top.nodeExecutions.pythonNode.data; - queryClient = createTestQueryClient(); - insertFixture(mockServer, fixture); - fetchWorkflow.mockImplementation(() => - Promise.resolve(fixture.workflows.top), - ); - }); - - const renderComponent = props => - render( - - - - - , - ); - - it('should only display title if execution is not provided', async () => { - const { queryByText } = renderComponent({ name, templateName }); - await waitFor(() => queryByText(name)); - - expect(queryByText(name)).toBeInTheDocument(); - expect(queryByText(templateName)).not.toBeInTheDocument(); - }); - - it('should only display title if template name is not provided', async () => { - const resultName = 'PythonTask'; - const { queryByText } = renderComponent({ name, execution }); - await waitFor(() => queryByText(resultName)); - - expect(queryByText(resultName)).toBeInTheDocument(); - expect(queryByText(templateName)).not.toBeInTheDocument(); - }); - - it('should display title and subtitle if template name is provided', async () => { - const resultName = 'PythonTask'; - const { queryByText } = renderComponent({ name, templateName, execution }); - await waitFor(() => queryByText(resultName)); - - expect(queryByText(resultName)).toBeInTheDocument(); - expect(queryByText(templateName)).toBeInTheDocument(); - }); -}); diff --git a/packages/console/src/components/Executions/ExecutionDetails/useNodeExecutionRow.ts b/packages/console/src/components/Executions/ExecutionDetails/useNodeExecutionRow.ts deleted file mode 100644 index b714131ff..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/useNodeExecutionRow.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { useConditionalQuery } from 'components/hooks/useConditionalQuery'; -import { NodeExecution } from 'models/Execution/types'; - -import { QueryClient, UseQueryResult } from 'react-query'; -import { nodeExecutionRefreshIntervalMs } from '../constants'; -import { makeNodeExecutionQueryEnhanced } from '../nodeExecutionQueries'; - -export const useNodeExecutionRow = ( - queryClient: QueryClient, - execution: NodeExecution, - shouldEnableQuery: (data: NodeExecution[]) => boolean, -): { - nodeExecutionRowQuery: UseQueryResult; -} => { - const nodeExecutionRowQuery = useConditionalQuery( - { - ...makeNodeExecutionQueryEnhanced(execution, queryClient), - refetchInterval: nodeExecutionRefreshIntervalMs, - }, - shouldEnableQuery, - ); - - return { nodeExecutionRowQuery }; -}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/utils.ts b/packages/console/src/components/Executions/ExecutionDetails/utils.ts deleted file mode 100644 index a6b1dc4fc..000000000 --- a/packages/console/src/components/Executions/ExecutionDetails/utils.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Identifier, ResourceType } from 'models/Common/types'; -import { - Execution, - NodeExecution, - TaskExecution, -} from 'models/Execution/types'; -import { Routes } from 'routes/routes'; -import { timestampToDate } from 'common'; -import { formatDateUTC } from 'common/formatters'; - -export function isSingleTaskExecution(execution: Execution) { - return execution.spec.launchPlan.resourceType === ResourceType.TASK; -} - -export function getExecutionSourceId(execution: Execution): Identifier { - return isSingleTaskExecution(execution) - ? execution.spec.launchPlan - : execution.closure.workflowId; -} - -export function getExecutionBackLink(execution: Execution): string { - const { project, domain, name } = getExecutionSourceId(execution); - return isSingleTaskExecution(execution) - ? Routes.TaskDetails.makeUrl(project, domain, name) - : Routes.WorkflowDetails.makeUrl(project, domain, name); -} - -export function getTaskExecutionDetailReasons( - taskExecutionDetails?: TaskExecution[], -): (string | null | undefined)[] { - let reasons: string[] = []; - taskExecutionDetails?.forEach?.(taskExecution => { - const finalReasons = ( - taskExecution.closure.reasons?.length - ? taskExecution.closure.reasons - : [{ message: taskExecution.closure.reason }] - ).filter(r => !!r); - if ( - finalReasons && - finalReasons.some(eachReason => eachReason?.message?.trim() !== '') - ) { - reasons = reasons.concat( - finalReasons.map( - reason => - (reason.occurredAt - ? `${formatDateUTC(timestampToDate(reason.occurredAt))} ` - : '') + reason.message, - ), - ); - } - }); - return reasons; -} - -export function isChildGroupsFetched( - scopedId: string, - nodeExecutionsById: Dictionary, -): boolean { - return Object.values(nodeExecutionsById).some( - v => v?.fromUniqueParentId === scopedId, - ); -} diff --git a/packages/console/src/components/Executions/Tables/ExecutionsTableHeader.tsx b/packages/console/src/components/Executions/Tables/ExecutionsTableHeader.tsx deleted file mode 100644 index 0a1481098..000000000 --- a/packages/console/src/components/Executions/Tables/ExecutionsTableHeader.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { Typography } from '@material-ui/core'; -import classnames from 'classnames'; -import { isFunction } from 'common/typeCheckers'; -import * as React from 'react'; -import { useExecutionTableStyles } from './styles'; -import { ColumnDefinition } from './types'; - -/** Layout/rendering logic for the header row of an ExecutionsTable */ -export const ExecutionsTableHeader: React.FC<{ - columns: ColumnDefinition[]; - scrollbarPadding?: number; - versionView?: boolean; -}> = ({ columns, scrollbarPadding = 0, versionView = false }) => { - const tableStyles = useExecutionTableStyles(); - const scrollbarSpacer = - scrollbarPadding > 0 ?
: null; - return ( -
- {versionView && ( -
-   -
- )} - {columns.map(({ key, label, className }) => { - const labelContent = isFunction(label) ? ( - React.createElement(label) - ) : ( - {label} - ); - return ( -
- {labelContent} -
- ); - })} - {scrollbarSpacer} -
- ); -}; diff --git a/packages/console/src/components/Executions/Tables/ExpandableExecutionError.tsx b/packages/console/src/components/Executions/Tables/ExpandableExecutionError.tsx deleted file mode 100644 index 30525d600..000000000 --- a/packages/console/src/components/Executions/Tables/ExpandableExecutionError.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Admin } from '@flyteorg/flyteidl-types'; -import { ExpandableMonospaceText } from 'components/common/ExpandableMonospaceText'; -import { ExecutionError } from 'models/Execution/types'; -import * as React from 'react'; -import { useExecutionTableStyles } from './styles'; - -/** Renders an expandable/collapsible container for an ExecutionErorr, along with - * a button for copying the error string. - */ -export const ExpandableExecutionError: React.FC<{ - abortMetadata?: Admin.IAbortMetadata; - error?: ExecutionError; - initialExpansionState?: boolean; - onExpandCollapse?(expanded: boolean): void; -}> = ({ - abortMetadata, - error, - initialExpansionState = false, - onExpandCollapse, -}) => { - const styles = useExecutionTableStyles(); - return ( -
- -
- ); -}; diff --git a/packages/console/src/components/Executions/Tables/NoExecutionsContent.tsx b/packages/console/src/components/Executions/Tables/NoExecutionsContent.tsx deleted file mode 100644 index 3ad69b85f..000000000 --- a/packages/console/src/components/Executions/Tables/NoExecutionsContent.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Typography } from '@material-ui/core'; -import { noExecutionsFoundString } from 'common/constants'; -import * as React from 'react'; -import { useExecutionTableStyles } from './styles'; - -type SizeVariant = 'small' | 'large'; - -/** A message to show as a placeholder when we have an empty list of executions */ -export const NoExecutionsContent: React.FC<{ size?: SizeVariant }> = ({ - size = 'small', -}) => ( -
- - {noExecutionsFoundString} - -
-); diff --git a/packages/console/src/components/Executions/Tables/NodeExecutionActions.tsx b/packages/console/src/components/Executions/Tables/NodeExecutionActions.tsx deleted file mode 100644 index 79cfd5967..000000000 --- a/packages/console/src/components/Executions/Tables/NodeExecutionActions.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import { IconButton, Tooltip } from '@material-ui/core'; -import { NodeExecution, NodeExecutionIdentifier } from 'models/Execution/types'; -import * as React from 'react'; -import InputsAndOutputsIcon from '@material-ui/icons/Tv'; -import PlayCircleOutlineIcon from '@material-ui/icons/PlayCircleOutline'; -import { RerunIcon } from '@flyteorg/ui-atoms'; -import { Identifier, ResourceIdentifier } from 'models/Common/types'; -import { LaunchFormDialog } from 'components/Launch/LaunchForm/LaunchFormDialog'; -import { getTask } from 'models/Task/api'; -import { useNodeExecutionData } from 'components/hooks/useNodeExecution'; -import { TaskInitialLaunchParameters } from 'components/Launch/LaunchForm/types'; -import { literalsToLiteralValueMap } from 'components/Launch/LaunchForm/utils'; -import { useEffect, useState } from 'react'; -import { NodeExecutionPhase } from 'models/Execution/enums'; -import { extractCompiledNodes } from 'components/hooks/utils'; -import { useNodeExecutionContext } from '../contextProvider/NodeExecutionDetails'; -import { NodeExecutionDetails } from '../types'; -import t from './strings'; -import { getNodeFrontendPhase, isNodeGateNode } from '../utils'; -import { useDetailsPanel } from '../ExecutionDetails/DetailsPanelContext'; - -interface NodeExecutionActionsProps { - execution: NodeExecution; - className?: string; -} - -export const NodeExecutionActions = ({ - execution, - className, -}: NodeExecutionActionsProps): JSX.Element => { - const { compiledWorkflowClosure, getNodeExecutionDetails } = - useNodeExecutionContext(); - const { setSelectedExecution } = useDetailsPanel(); - - const [showLaunchForm, setShowLaunchForm] = useState(false); - const [showResumeForm, setShowResumeForm] = useState(false); - const [nodeExecutionDetails, setNodeExecutionDetails] = useState< - NodeExecutionDetails | undefined - >(undefined); - const [initialParameters, setInitialParameters] = useState< - TaskInitialLaunchParameters | undefined - >(undefined); - - const executionData = useNodeExecutionData(execution.id); - const id = nodeExecutionDetails?.taskTemplate?.id; - - const isGateNode = isNodeGateNode( - extractCompiledNodes(compiledWorkflowClosure), - execution.metadata?.specNodeId || execution.id.nodeId, - ); - - const phase = getNodeFrontendPhase(execution.closure.phase, isGateNode); - const compiledNode = extractCompiledNodes(compiledWorkflowClosure)?.find( - node => - node.id === execution.metadata?.specNodeId || - node.id === execution.id.nodeId, - ); - - useEffect(() => { - let isCurrent = true; - getNodeExecutionDetails(execution).then(res => { - if (isCurrent) { - setNodeExecutionDetails(res); - } - }); - return () => { - isCurrent = false; - }; - }); - - useEffect(() => { - if (!id) { - return; - } - - (async () => { - const task = await getTask(id as Identifier); - - const literals = executionData.value.fullInputs?.literals; - const taskInputsTypes = - task.closure.compiledTask.template?.interface?.inputs?.variables; - - const tempInitialParameters: TaskInitialLaunchParameters = { - values: - literals && - taskInputsTypes && - literalsToLiteralValueMap(literals, taskInputsTypes), - taskId: id as Identifier | undefined, - }; - - setInitialParameters(tempInitialParameters); - })(); - }, [id]); - - // open the side panel for selected execution's detail - const inputsAndOutputsIconOnClick = (e: React.MouseEvent) => { - // prevent the parent row body onClick event trigger - e.stopPropagation(); - // use null in case if there is no execution provided - when it is null will close panel - setSelectedExecution(execution?.id ?? null); - }; - - const rerunIconOnClick = (e: React.MouseEvent) => { - e.stopPropagation(); - setShowLaunchForm(true); - }; - - const onResumeClick = (e: React.MouseEvent) => { - e.stopPropagation(); - setShowResumeForm(true); - }; - - return ( -
- {phase === NodeExecutionPhase.PAUSED && ( - - - - - - )} - - - - - - {id && initialParameters ? ( - <> - - - - - - - - ) : null} - {compiledNode && ( - - )} -
- ); -}; diff --git a/packages/console/src/components/Executions/Tables/NodeExecutionRow.tsx b/packages/console/src/components/Executions/Tables/NodeExecutionRow.tsx deleted file mode 100644 index 03be656a6..000000000 --- a/packages/console/src/components/Executions/Tables/NodeExecutionRow.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import React from 'react'; -import classnames from 'classnames'; -import { dNode } from 'models/Graph/types'; -import { NodeExecutionPhase } from 'models/Execution/enums'; -import { isEqual } from 'lodash'; -import { useTheme } from 'components/Theme/useTheme'; -import { makeStyles } from '@material-ui/core'; -import { isExpanded } from 'models/Node/utils'; -import { dateToTimestamp } from 'common/utils'; -import { - grayedClassName, - selectedClassName, - useExecutionTableStyles, -} from './styles'; -import { NodeExecutionColumnDefinition } from './types'; -import { useDetailsPanel } from '../ExecutionDetails/DetailsPanelContext'; -import { RowExpander } from './RowExpander'; -import { calculateNodeExecutionRowLeftSpacing } from './utils'; -import { isParentNode } from '../utils'; -import { useNodeExecutionDynamicContext } from '../contextProvider/NodeExecutionDetails/NodeExecutionDynamicProvider'; - -const useStyles = makeStyles(theme => ({ - [`${grayedClassName}`]: { - color: `${theme.palette.grey[300]} !important`, - }, - namesContainerExpander: { - display: 'flex', - marginTop: 'auto', - marginBottom: 'auto', - }, - leaf: { - width: 30, - }, -})); - -interface NodeExecutionRowProps { - columns: NodeExecutionColumnDefinition[]; - level?: number; - style?: React.CSSProperties; - node: dNode; - onToggle: (id: string, scopeId: string, level: number) => void; -} - -/** Renders a NodeExecution as a row inside a `NodeExecutionsTable` */ -export const NodeExecutionRow: React.FC = ({ - columns, - node, - style, - onToggle, -}) => { - const styles = useStyles(); - const theme = useTheme(); - const tableStyles = useExecutionTableStyles(); - const { childCount, componentProps } = useNodeExecutionDynamicContext(); - const nodeLevel = node?.level ?? 0; - - // For the first level, we want the borders to span the entire table, - // so we'll use padding to space the content. For nested rows, we want the - // border to start where the content does, so we'll use margin. - const spacingProp = nodeLevel === 0 ? 'paddingLeft' : 'marginLeft'; - const rowContentStyle = { - [spacingProp]: `${calculateNodeExecutionRowLeftSpacing( - nodeLevel, - theme.spacing, - )}px`, - }; - - const expanderRef = React.useRef(); - - const { selectedExecution, setSelectedExecution } = useDetailsPanel(); - - const selected = selectedExecution - ? isEqual(selectedExecution, node.execution?.id) - : false; - - const expanderContent = React.useMemo(() => { - const isParent = node?.execution ? isParentNode(node.execution) : false; - const isExpandedVal = isExpanded(node); - - return isParent ? ( - } - expanded={isExpandedVal} - onClick={() => { - onToggle(node.id, node.scopedId, nodeLevel); - }} - disabled={!childCount} - /> - ) : ( -
- ); - }, [node, nodeLevel, node.execution, childCount]); - - // open the side panel for selected execution's detail - // use null in case if there is no execution provided - when it is null, will close side panel - const onClickRow = () => - node?.execution?.closure.phase !== NodeExecutionPhase.UNDEFINED && - setSelectedExecution(node.execution?.id ?? null); - - return ( -
-
-
-
-
- {expanderContent} -
-
- {columns.map(({ className, key: columnKey, cellRenderer }) => ( -
- {cellRenderer({ - node, - execution: node.execution || { - closure: { - createdAt: dateToTimestamp(new Date()), - outputUri: '', - phase: NodeExecutionPhase.UNDEFINED, - }, - id: { - executionId: { - domain: node.value?.taskNode?.referenceId?.domain, - name: node.value?.taskNode?.referenceId?.name, - project: node.value?.taskNode?.referenceId?.project, - }, - nodeId: node.id, - }, - inputUri: '', - scopedId: node.scopedId, - }, - className: node.grayedOut ? tableStyles.grayed : '', - })} -
- ))} -
-
-
- ); -}; diff --git a/packages/console/src/components/Executions/Tables/NodeExecutionsTable.tsx b/packages/console/src/components/Executions/Tables/NodeExecutionsTable.tsx deleted file mode 100644 index ec32c6e2a..000000000 --- a/packages/console/src/components/Executions/Tables/NodeExecutionsTable.tsx +++ /dev/null @@ -1,296 +0,0 @@ -import React, { useMemo, useEffect, useState, useContext } from 'react'; -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import scrollbarSize from 'dom-helpers/scrollbarSize'; -import { NodeExecution } from 'models/Execution/types'; -import { merge, isEqual, cloneDeep } from 'lodash'; -import { extractCompiledNodes } from 'components/hooks/utils'; -import { - FilterOperation, - FilterOperationName, - FilterOperationValueList, -} from 'models'; -import { dNode } from 'models/Graph/types'; -import { ExecutionsTableHeader } from './ExecutionsTableHeader'; -import { generateColumns } from './nodeExecutionColumns'; -import { NoExecutionsContent } from './NoExecutionsContent'; -import { useColumnStyles, useExecutionTableStyles } from './styles'; -import { convertToPlainNodes } from '../ExecutionDetails/Timeline/helpers'; -import { - useNodeExecutionContext, - useNodeExecutionsById, -} from '../contextProvider/NodeExecutionDetails'; -import { NodeExecutionRow } from './NodeExecutionRow'; -import { ExecutionFiltersState } from '../filters/useExecutionFiltersState'; -import { searchNode } from '../utils'; -import { nodeExecutionPhaseConstants } from '../constants'; -import { NodeExecutionDynamicProvider } from '../contextProvider/NodeExecutionDetails/NodeExecutionDynamicProvider'; -import { ExecutionFilters } from '../ExecutionFilters'; -import { - ExecutionContext, - FilteredNodeExecutions, - NodeExecutionsById, -} from '../contexts'; -import { useExecutionNodeViewsStatePoll } from '../ExecutionDetails/useExecutionNodeViewsState'; -import { stringifyIsEqual } from '../contextProvider/NodeExecutionDetails/utils'; - -const scrollbarPadding = scrollbarSize(); - -const mergeOriginIntoNodes = (target: dNode[], origin: dNode[]) => { - if (!target?.length) { - return target; - } - const originClone = cloneDeep(origin); - const newTarget = cloneDeep(target); - newTarget?.forEach(value => { - const originalNode = originClone.find( - og => og.id === value.id && og.scopedId === value.scopedId, - ); - const newNodes = mergeOriginIntoNodes( - value.nodes, - originalNode?.nodes || [], - ); - - value = merge(value, originalNode); - value.nodes = newNodes; - return value; - }); - - return newTarget; -}; - -const executionMatchesPhaseFilter = ( - nodeExecution: NodeExecution, - { key, value, operation }: FilterOperation, -) => { - if (key === 'phase' && operation === FilterOperationName.VALUE_IN) { - // default to UNKNOWN phase if the field does not exist on a closure - const itemValue = - nodeExecutionPhaseConstants()[nodeExecution?.closure[key]]?.value ?? - nodeExecutionPhaseConstants()[0].value; - // phase check filters always return values in an array - const valuesArray = value as FilterOperationValueList; - return valuesArray.includes(itemValue); - } - return false; -}; - -const filterNodes = ( - initialNodes: dNode[], - nodeExecutionsById: NodeExecutionsById, - appliedFilters: FilterOperation[], -) => { - if (!initialNodes?.length) { - return []; - } - - let initialClone = cloneDeep(initialNodes); - - for (const n of initialClone) { - n.nodes = filterNodes(n.nodes, nodeExecutionsById, appliedFilters); - } - - initialClone = initialClone.filter(node => { - const hasFilteredChildren = !!node.nodes?.length; - const shouldBeIncluded = executionMatchesPhaseFilter( - nodeExecutionsById[node.scopedId], - appliedFilters[0], - ); - const result = hasFilteredChildren || shouldBeIncluded; - - if (hasFilteredChildren && !shouldBeIncluded) { - node.grayedOut = true; - } - - return result; - }); - - return initialClone; -}; - -const isPhaseFilter = (appliedFilters: FilterOperation[] = []) => { - if (appliedFilters.length === 1 && appliedFilters[0].key === 'phase') { - return true; - } - return false; -}; - -/** Renders a table of NodeExecution records. Executions with errors will - * have an expanadable container rendered as part of the table row. - * NodeExecutions are expandable and will potentially render a list of child - * TaskExecutions - */ -export const NodeExecutionsTable: React.FC<{ - filterState: ExecutionFiltersState; -}> = ({ filterState }) => { - const commonStyles = useCommonStyles(); - const tableStyles = useExecutionTableStyles(); - const columnStyles = useColumnStyles(); - - const { execution } = useContext(ExecutionContext); - - const { appliedFilters } = filterState; - const [filteredNodeExecutions, setFilteredNodeExecutions] = - useState(); - const { nodeExecutionsById, initialDNodes: initialNodes } = - useNodeExecutionsById(); - - const [filters, setFilters] = useState([]); - const [originalNodes, setOriginalNodes] = useState([]); - - // query to get filtered data to narrow down Table outputs - const { nodeExecutionsQuery: filteredNodeExecutionsQuery } = - useExecutionNodeViewsStatePoll(execution, filters); - - const { compiledWorkflowClosure } = useNodeExecutionContext(); - const [showNodes, setShowNodes] = useState([]); - - const [initialFilteredNodes, setInitialFilteredNodes] = useState< - dNode[] | undefined - >(undefined); - - useEffect(() => { - // keep original nodes as a record of the nodes' toggle status - setOriginalNodes(prev => { - const newOgNodes = merge(initialNodes, prev); - if (stringifyIsEqual(prev, newOgNodes)) { - return prev; - } - return newOgNodes; - }); - }, [initialNodes]); - - // wait for changes to filtered node executions - useEffect(() => { - if (filteredNodeExecutionsQuery.isFetching) { - return; - } - - const newFilteredNodeExecutions = isPhaseFilter(filters) - ? undefined - : filteredNodeExecutionsQuery.data; - - setFilteredNodeExecutions(prev => { - if (isEqual(prev, newFilteredNodeExecutions)) { - return prev; - } - - return newFilteredNodeExecutions; - }); - }, [filteredNodeExecutionsQuery]); - - useEffect(() => { - const newShownNodes = - filters.length > 0 && initialFilteredNodes - ? // if there are filtered nodes, merge original ones into them to preserve toggle status - mergeOriginIntoNodes( - cloneDeep(initialFilteredNodes), - cloneDeep(originalNodes), - ) - : // else, merge originalNodes into initialNodes to preserve toggle status - mergeOriginIntoNodes( - cloneDeep(initialNodes), - cloneDeep(originalNodes), - ); - - const plainNodes = convertToPlainNodes(newShownNodes || []); - const updatedShownNodesMap = plainNodes.map(node => { - const execution = nodeExecutionsById?.[node?.scopedId]; - return { - ...node, - startedAt: execution?.closure.startedAt, - execution, - }; - }); - setShowNodes(updatedShownNodesMap); - }, [ - initialNodes, - initialFilteredNodes, - originalNodes, - nodeExecutionsById, - filters, - ]); - - useEffect(() => { - setFilters(prev => { - if (isEqual(prev, appliedFilters)) { - return prev; - } - return JSON.parse(JSON.stringify(appliedFilters)); - }); - }, [appliedFilters]); - - // Memoizing columns so they won't be re-generated unless the styles change - const compiledNodes = extractCompiledNodes(compiledWorkflowClosure); - const columns = useMemo( - () => generateColumns(columnStyles, compiledNodes), - [columnStyles, compiledNodes], - ); - - useEffect(() => { - if (filters.length > 0) { - // if filter was apllied, but filteredNodeExecutions is empty, we only appliied Phase filter, - // and need to clear out items manually - if (!filteredNodeExecutions) { - // top level - const filteredNodes = filterNodes( - initialNodes, - nodeExecutionsById, - filters, - ); - - setInitialFilteredNodes(filteredNodes); - } else { - const filteredNodes = initialNodes.filter((node: dNode) => - filteredNodeExecutions.find( - (execution: NodeExecution) => execution.scopedId === node.scopedId, - ), - ); - setInitialFilteredNodes(filteredNodes); - } - } - }, [initialNodes, filteredNodeExecutions, filters]); - - const toggleNode = async (id: string, scopedId: string, level: number) => { - searchNode(originalNodes, 0, id, scopedId, level); - setOriginalNodes([...originalNodes]); - }; - - return ( - <> -
- -
-
- -
- {showNodes.length > 0 ? ( - showNodes.map(node => { - return ( - - - - ); - }) - ) : ( - - )} -
-
- - ); -}; diff --git a/packages/console/src/components/Executions/Tables/RowExpander.tsx b/packages/console/src/components/Executions/Tables/RowExpander.tsx deleted file mode 100644 index 42f8cdb70..000000000 --- a/packages/console/src/components/Executions/Tables/RowExpander.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import * as React from 'react'; -import { IconButton } from '@material-ui/core'; -import ChevronRight from '@material-ui/icons/ChevronRight'; -import ExpandMore from '@material-ui/icons/ExpandMore'; -import t from './strings'; - -interface RowExpanderProps { - expanded: boolean; - disabled?: boolean; - key?: string; - onClick: () => void; -} -/** A simple expand/collapse arrow to be rendered next to row items. */ -export const RowExpander = React.forwardRef< - HTMLButtonElement, - RowExpanderProps ->(({ disabled, expanded, key, onClick }, ref) => { - return ( - ) => { - // prevent the parent row body onClick event trigger - e.stopPropagation(); - onClick(); - }} - disabled={disabled} - > - {expanded ? : } - - ); -}); diff --git a/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/WorkflowExecutionRow.tsx b/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/WorkflowExecutionRow.tsx deleted file mode 100644 index 64a9d9ea0..000000000 --- a/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/WorkflowExecutionRow.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import * as React from 'react'; -import { useState } from 'react'; -import { useMutation } from 'react-query'; -import { makeStyles, Theme } from '@material-ui/core'; -import classnames from 'classnames'; -import { useSnackbar } from 'notistack'; -import { Execution } from 'models/Execution/types'; -import { ExecutionState } from 'models/Execution/enums'; -import { updateExecution } from 'models/Execution/api'; -import { ListRowProps } from 'react-virtualized'; -import { isExecutionArchived } from '../../utils'; -import { ExpandableExecutionError } from '../ExpandableExecutionError'; -import { useExecutionTableStyles } from '../styles'; -import { - WorkflowExecutionColumnDefinition, - WorkflowExecutionsTableState, -} from '../types'; -import { showOnHoverClass } from './cells'; -import { - useConfirmationSection, - useWorkflowExecutionsTableColumns, -} from './useWorkflowExecutionsTableColumns'; -import t from './strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - row: { - paddingLeft: theme.spacing(2), - // All children using the showOnHover class will be hidden until - // the mouse enters the container - [`& .${showOnHoverClass}`]: { - opacity: 0, - }, - [`&:hover .${showOnHoverClass}`]: { - opacity: 1, - }, - }, -})); - -export interface WorkflowExecutionRowProps extends Partial { - showWorkflowName: boolean; - errorExpanded?: boolean; - execution: Execution; - onExpandCollapseError?(expanded: boolean): void; - state: WorkflowExecutionsTableState; -} - -/** Renders a single `Execution` record as a row. Designed to be used as a child - * of `WorkflowExecutionTable`. - */ -export const WorkflowExecutionRow: React.FC< - WorkflowExecutionRowProps & { - style?: React.CSSProperties; - } -> = ({ - showWorkflowName, - errorExpanded, - execution, - onExpandCollapseError, - state, - style, -}) => { - const { enqueueSnackbar } = useSnackbar(); - const tableStyles = useExecutionTableStyles(); - const styles = useStyles(); - - const isArchived = isExecutionArchived(execution); - const [hideItem, setHideItem] = useState(false); - const [isUpdating, setIsUpdating] = useState(false); - const [showConfirmation, setShowConfirmation] = useState(false); - - const mutation = useMutation( - (newState: ExecutionState) => updateExecution(execution.id, newState), - { - onMutate: () => setIsUpdating(true), - onSuccess: () => { - enqueueSnackbar(t('archiveSuccess', !isArchived), { - variant: 'success', - }); - setHideItem(true); - // ensure to collapse error info and re-calculate rows positions. - onExpandCollapseError?.(false); - }, - onError: () => { - enqueueSnackbar(`${mutation.error ?? t('archiveError', !isArchived)}`, { - variant: 'error', - }); - }, - onSettled: () => { - setShowConfirmation(false); - setIsUpdating(false); - }, - }, - ); - - const onArchiveConfirmClick = () => { - mutation.mutate( - isArchived - ? ExecutionState.EXECUTION_ACTIVE - : ExecutionState.EXECUTION_ARCHIVED, - ); - }; - - const columns = useWorkflowExecutionsTableColumns({ - showWorkflowName, - onArchiveClick: () => setShowConfirmation(true), - }); - const confirmation = useConfirmationSection({ - isArchived, - isLoading: isUpdating, - onCancel: () => setShowConfirmation(false), - onConfirmClick: onArchiveConfirmClick, - }); - // To hide the onHover action buttons, - // we take off the last column which is onHover actions buttons - const columnsWithApproval = [...columns.slice(0, -1), confirmation]; - - // we show error info only on active items - const { abortMetadata, error } = execution.closure; - const showErrorInfo = !isArchived && (error || abortMetadata); - - const renderCell = ({ - className, - key: columnKey, - cellRenderer, - }: WorkflowExecutionColumnDefinition): JSX.Element => ( -
- {cellRenderer({ execution, state })} -
- ); - - if (hideItem) { - return null; - } - - return ( -
-
- {!showConfirmation - ? columns.map(renderCell) - : columnsWithApproval.map(renderCell)} -
- {showErrorInfo ? ( - - ) : null} -
- ); -}; diff --git a/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/cells.tsx b/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/cells.tsx deleted file mode 100644 index 0a0e68718..000000000 --- a/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/cells.tsx +++ /dev/null @@ -1,227 +0,0 @@ -import * as React from 'react'; -import { - Typography, - IconButton, - Button, - CircularProgress, -} from '@material-ui/core'; -import ArchiveOutlined from '@material-ui/icons/ArchiveOutlined'; -import UnarchiveOutline from '@material-ui/icons/UnarchiveOutlined'; -import LaunchPlanIcon from '@material-ui/icons/AssignmentOutlined'; -import InputOutputIcon from '@material-ui/icons/Tv'; -import { - formatDateLocalTimezone, - formatDateUTC, - millisecondsToHMS, -} from 'common/formatters'; -import { timestampToDate } from 'common/utils'; - -import { ExecutionStatusBadge } from 'components/Executions/ExecutionStatusBadge'; -import { Execution } from 'models/Execution/types'; -import { ExecutionState, WorkflowExecutionPhase } from 'models/Execution/enums'; -import classnames from 'classnames'; -import { LaunchPlanLink } from 'components/LaunchPlan/LaunchPlanLink'; -import { WorkflowExecutionsTableState } from '../types'; -import { WorkflowExecutionLink } from '../WorkflowExecutionLink'; -import { getWorkflowExecutionTimingMS, isExecutionArchived } from '../../utils'; -import { useStyles } from './styles'; -import t from './strings'; - -export function getExecutionIdCell( - execution: Execution, - className: string, - showWorkflowName?: boolean, -): React.ReactNode { - const { startedAt, workflowId } = execution.closure; - const isArchived = isExecutionArchived(execution); - - return ( - <> - - - {showWorkflowName ? workflowId.name : t('lastRunStartedAt', startedAt)} - - - ); -} - -export function getStatusCell(execution: Execution): React.ReactNode { - const isArchived = isExecutionArchived(execution); - const phase = execution.closure.phase ?? WorkflowExecutionPhase.UNDEFINED; - - return ( - - ); -} - -export function getStartTimeCell(execution: Execution): React.ReactNode { - const { startedAt } = execution.closure; - - if (!startedAt) { - return null; - } - - const startedAtDate = timestampToDate(startedAt); - const isArchived = isExecutionArchived(execution); - - return ( - <> - - {formatDateUTC(startedAtDate)} - - - {formatDateLocalTimezone(startedAtDate)} - - - ); -} - -export function getDurationCell(execution: Execution): React.ReactNode { - const isArchived = isExecutionArchived(execution); - const timing = getWorkflowExecutionTimingMS(execution); - - return ( - - {timing !== null ? millisecondsToHMS(timing.duration) : ''} - - ); -} - -export function getLaunchPlanCell( - execution: Execution, - className: string, -): React.ReactNode { - const isArchived = isExecutionArchived(execution); - const lp = execution.spec.launchPlan; - const version = execution.spec.launchPlan.version; - - return ( - <> - - - {version} - - - ); -} - -export const showOnHoverClass = 'showOnHover'; -export function getActionsCell( - execution: Execution, - state: WorkflowExecutionsTableState, - showLaunchPlan: boolean, - wrapperClassName: string, - iconClassName: string, - onArchiveClick?: () => void, // (newState: ExecutionState) => void, -): React.ReactNode { - const isArchived = isExecutionArchived(execution); - const onClick = () => state.setSelectedIOExecution(execution); - - const getArchiveIcon = (isArchived: boolean) => - isArchived ? : ; - - return ( -
- - - - {showLaunchPlan && ( - { - /* Not implemented */ - }} - > - - - )} - {!!onArchiveClick && ( - - {getArchiveIcon(isArchived)} - - )} -
- ); -} - -/** - * ApprovalDooubleCell - represents approval request to Archive/Cancel operation on specific execution - */ -export interface ApprovalDoubleCellProps { - isArchived: boolean; - isLoading: boolean; - onCancel: () => void; - onConfirmClick: (newState: ExecutionState) => void; -} - -export function ApprovalDoubleCell(props: ApprovalDoubleCellProps) { - const { isArchived, isLoading, onCancel, onConfirmClick } = props; - const styles = useStyles(); - - if (isLoading) { - return ( -
- -
- ); - } - - return ( - <> - - - - ); -} diff --git a/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/strings.ts b/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/strings.ts deleted file mode 100644 index 36885a578..000000000 --- a/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/strings.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { createLocalizedString } from '@flyteorg/locale'; -import { dateFromNow } from 'common/formatters'; -import { timestampToDate } from 'common/utils'; -import { Protobuf } from '@flyteorg/flyteidl-types'; - -const str = { - tableLabel_name: 'execution id', - tableLabel_launchPlan: 'launch plan', - tableLabel_phase: 'status', - tableLabel_startedAt: 'start time', - tableLabel_duration: 'duration', - tableLabel_actions: '', - cancelAction: 'Cancel', - inputOutputTooltip: 'View Inputs & Outputs', - launchPlanTooltip: 'View Launch Plan', - archiveAction: (isArchived: boolean) => - isArchived ? 'Unarchive' : 'Archive', - archiveSuccess: (isArchived: boolean) => - `Item was successfully ${isArchived ? 'archived' : 'unarchived'}`, - archiveError: (isArchived: boolean) => - `Error: Something went wrong, we can not ${ - isArchived ? 'archive' : 'unarchive' - } item`, - lastRunStartedAt: (startedAt?: Protobuf.ITimestamp) => { - return startedAt - ? `Last run ${dateFromNow(timestampToDate(startedAt))}` - : ''; - }, -}; - -export { patternKey } from '@flyteorg/locale'; -export default createLocalizedString(str); diff --git a/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/styles.ts b/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/styles.ts deleted file mode 100644 index e5b01992a..000000000 --- a/packages/console/src/components/Executions/Tables/WorkflowExecutionTable/styles.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core'; -import { workflowExecutionsTableColumnWidths } from '../constants'; - -export const useStyles = makeStyles((theme: Theme) => ({ - cellName: { - paddingLeft: theme.spacing(1), - }, - columnName: { - flexGrow: 1, - flexBasis: workflowExecutionsTableColumnWidths.name, - whiteSpace: 'normal', - }, - columnLaunchPlan: { - flexGrow: 1, - flexBasis: workflowExecutionsTableColumnWidths.launchPlan, - overflow: 'hidden', - }, - columnLastRun: { - flexBasis: workflowExecutionsTableColumnWidths.lastRun, - }, - columnStatus: { - flexBasis: workflowExecutionsTableColumnWidths.phase, - }, - columnStartedAt: { - flexBasis: workflowExecutionsTableColumnWidths.startedAt, - }, - columnDuration: { - flexBasis: workflowExecutionsTableColumnWidths.duration, - textAlign: 'right', - }, - columnActions: { - flexBasis: workflowExecutionsTableColumnWidths.actions, - marginLeft: theme.spacing(2), - marginRight: theme.spacing(2), - textAlign: 'right', - }, - rightMargin: { - marginRight: theme.spacing(1), - }, - confirmationButton: { - borderRadius: 0, - // make the button responsive, so the button won't overflow - width: '50%', - minHeight: '53px', - // cancel margins that are coming from table row style - marginTop: theme.spacing(-1), - marginBottom: theme.spacing(-1), - }, - actionContainer: { - transition: theme.transitions.create('opacity', { - duration: theme.transitions.duration.shorter, - easing: theme.transitions.easing.easeInOut, - }), - }, - actionProgress: { - width: '100px', // same as confirmationButton size - textAlign: 'center', - }, -})); diff --git a/packages/console/src/components/Executions/Tables/WorkflowExecutionsTable.tsx b/packages/console/src/components/Executions/Tables/WorkflowExecutionsTable.tsx deleted file mode 100644 index f3ad23e1c..000000000 --- a/packages/console/src/components/Executions/Tables/WorkflowExecutionsTable.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import classnames from 'classnames'; -import * as React from 'react'; -import { ListRowRenderer } from 'react-virtualized'; -import { noExecutionsFoundString } from 'common/constants'; -import { getCacheKey } from 'components/Cache/utils'; -import { useCommonStyles } from 'components/common/styles'; -import { ListProps } from 'components/common/types'; -import { DataList, DataListRef } from 'components/Tables/DataList'; -import { Execution } from 'models/Execution/types'; -import { ExecutionInputsOutputsModal } from '../ExecutionInputsOutputsModal'; -import { ExecutionsTableHeader } from './ExecutionsTableHeader'; -import { useExecutionTableStyles } from './styles'; -import { useWorkflowExecutionsTableColumns } from './WorkflowExecutionTable/useWorkflowExecutionsTableColumns'; -import { useWorkflowExecutionsTableState } from './useWorkflowExecutionTableState'; -import { WorkflowExecutionRow } from './WorkflowExecutionTable/WorkflowExecutionRow'; - -export interface WorkflowExecutionsTableProps extends ListProps { - showWorkflowName?: boolean; -} - -/** Renders a table of WorkflowExecution records. Executions with errors will - * have an expanadable container rendered as part of the table row. - */ -export const WorkflowExecutionsTable: React.FC< - WorkflowExecutionsTableProps -> = props => { - const { value: executions, showWorkflowName = false } = props; - const [expandedErrors, setExpandedErrors] = React.useState< - Dictionary - >({}); - const state = useWorkflowExecutionsTableState(); - const commonStyles = useCommonStyles(); - const tableStyles = useExecutionTableStyles(); - const listRef = React.useRef(null); - - // Reset error expansion states whenever list changes - React.useLayoutEffect(() => { - setExpandedErrors({}); - }, [executions]); - - // passing an empty property list, as we only use it for table headers info here - const columns = useWorkflowExecutionsTableColumns({}); - - const retry = () => props.fetch(); - const onCloseIOModal = () => state.setSelectedIOExecution(null); - const recomputeRow = (rowIndex: number) => { - if (listRef.current !== null) { - listRef.current.recomputeRowHeights(rowIndex); - } - }; - - // Custom renderer to allow us to append error content to executions which - // are in a failed state - const rowRenderer: ListRowRenderer = rowProps => { - const execution = executions[rowProps.index]; - const cacheKey = getCacheKey(execution.id); - const onExpandCollapseError = (expanded: boolean) => { - setExpandedErrors(currentExpandedErrors => ({ - ...currentExpandedErrors, - [cacheKey]: expanded, - })); - recomputeRow(rowProps.index); - }; - return ( - - ); - }; - - return ( -
- - - -
- ); -}; diff --git a/packages/console/src/components/Executions/Tables/__mocks__/WorkflowExecutionsTable.tsx b/packages/console/src/components/Executions/Tables/__mocks__/WorkflowExecutionsTable.tsx deleted file mode 100644 index 88487098c..000000000 --- a/packages/console/src/components/Executions/Tables/__mocks__/WorkflowExecutionsTable.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import * as React from 'react'; -import { ExecutionsTableHeader } from '../ExecutionsTableHeader'; -import { useExecutionTableStyles } from '../styles'; -import { useWorkflowExecutionsTableColumns } from '../WorkflowExecutionTable/useWorkflowExecutionsTableColumns'; -import { useWorkflowExecutionsTableState } from '../useWorkflowExecutionTableState'; -import { WorkflowExecutionRow } from '../WorkflowExecutionTable/WorkflowExecutionRow'; -import { WorkflowExecutionsTableProps } from '../WorkflowExecutionsTable'; - -/** Mocked, simpler version of WorkflowExecutionsTable which does not use a DataList since - * that will not work in a test environment. - */ -export const WorkflowExecutionsTable: React.FC< - WorkflowExecutionsTableProps -> = props => { - const { value: executions, showWorkflowName = false } = props; - const state = useWorkflowExecutionsTableState(); - const commonStyles = useCommonStyles(); - const tableStyles = useExecutionTableStyles(); - const columns = useWorkflowExecutionsTableColumns({}); - - return ( -
- - {executions.map(execution => ( - - ))} -
- ); -}; diff --git a/packages/console/src/components/Executions/Tables/__stories__/WorkflowExecutionsTable.stories.tsx b/packages/console/src/components/Executions/Tables/__stories__/WorkflowExecutionsTable.stories.tsx deleted file mode 100644 index 4bbd96a0f..000000000 --- a/packages/console/src/components/Executions/Tables/__stories__/WorkflowExecutionsTable.stories.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { action } from '@storybook/addon-actions'; -import { storiesOf } from '@storybook/react'; -import { ExecutionState } from 'models/Execution/enums'; -import { createMockWorkflowExecutionsListResponse } from 'models/Execution/__mocks__/mockWorkflowExecutionsData'; -import { - WorkflowExecutionsTable, - WorkflowExecutionsTableProps, -} from '../WorkflowExecutionsTable'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - borderLeft: `1px solid ${theme.palette.grey[400]}`, - display: 'flex', - height: '100vh', - padding: `${theme.spacing(2)}px 0`, - width: '100vw', - }, -})); - -const fetchAction = action('fetch'); - -const propsArchived: WorkflowExecutionsTableProps = { - value: createMockWorkflowExecutionsListResponse( - 10, - ExecutionState.EXECUTION_ARCHIVED, - ).executions, - lastError: null, - isFetching: false, - moreItemsAvailable: false, - fetch: () => Promise.resolve(() => fetchAction() as unknown), -}; - -const props: WorkflowExecutionsTableProps = { - value: createMockWorkflowExecutionsListResponse( - 10, - ExecutionState.EXECUTION_ACTIVE, - ).executions, - lastError: null, - isFetching: false, - moreItemsAvailable: false, - fetch: () => Promise.resolve(() => fetchAction() as unknown), -}; - -const stories = storiesOf('Tables/WorkflowExecutionsTable', module); -stories.addDecorator(story => ( -
{story()}
-)); -stories.add('Basic', () => ); -stories.add('Only archived items', () => ( - -)); -stories.add('With more items available', () => ( - -)); -stories.add('With no items', () => ( - -)); diff --git a/packages/console/src/components/Executions/Tables/nodeExecutionColumns.tsx b/packages/console/src/components/Executions/Tables/nodeExecutionColumns.tsx deleted file mode 100644 index 23a1795c7..000000000 --- a/packages/console/src/components/Executions/Tables/nodeExecutionColumns.tsx +++ /dev/null @@ -1,212 +0,0 @@ -import { Tooltip, Typography } from '@material-ui/core'; -import { - formatDateLocalTimezone, - formatDateUTC, - millisecondsToHMS, -} from 'common/formatters'; -import { timestampToDate } from 'common/utils'; -import { useCommonStyles } from 'components/common/styles'; -import * as React from 'react'; -import { useEffect, useState } from 'react'; -import { CompiledNode } from 'models/Node/types'; -import { NodeExecutionPhase } from 'models/Execution/enums'; -import { getNodeTemplateName } from 'components/WorkflowGraph/utils'; -import classnames from 'classnames'; -import { useNodeExecutionContext } from '../contextProvider/NodeExecutionDetails'; -import { ExecutionStatusBadge } from '../ExecutionStatusBadge'; -import { NodeExecutionCacheStatus } from '../NodeExecutionCacheStatus'; -import { - getNodeExecutionTimingMS, - getNodeFrontendPhase, - isNodeGateNode, -} from '../utils'; -import { NodeExecutionActions } from './NodeExecutionActions'; -import { useColumnStyles } from './styles'; -import { - NodeExecutionCellRendererData, - NodeExecutionColumnDefinition, -} from './types'; -import t from '../strings'; -import { NodeExecutionName } from '../ExecutionDetails/Timeline/NodeExecutionName'; - -const DisplayId: React.FC = ({ - execution, - className, -}) => { - const commonStyles = useCommonStyles(); - const { getNodeExecutionDetails } = useNodeExecutionContext(); - const [displayId, setDisplayId] = useState(); - - useEffect(() => { - let isCurrent = true; - getNodeExecutionDetails(execution).then(res => { - if (isCurrent) { - setDisplayId(res?.displayId); - } - }); - return () => { - isCurrent = false; - }; - }); - - const nodeId = displayId ?? execution.id.nodeId; - return ( - -
- {nodeId} -
-
- ); -}; - -const DisplayType: React.FC = ({ - execution, - className, -}) => { - const { getNodeExecutionDetails } = useNodeExecutionContext(); - const [type, setType] = useState(); - - useEffect(() => { - let isCurrent = true; - getNodeExecutionDetails(execution).then(res => { - if (isCurrent) { - setType(res?.displayType); - } - }); - return () => { - isCurrent = false; - }; - }); - - return ( - - {type} - - ); -}; - -export function generateColumns( - styles: ReturnType, - nodes: CompiledNode[], -): NodeExecutionColumnDefinition[] { - return [ - { - cellRenderer: ({ node, className }) => ( - - ), - className: styles.columnName, - key: 'name', - label: t('nameLabel'), - }, - { - cellRenderer: props => , - className: styles.columnNodeId, - key: 'nodeId', - label: t('nodeIdLabel'), - }, - { - cellRenderer: props => , - className: styles.columnType, - key: 'type', - label: t('typeLabel'), - }, - { - cellRenderer: ({ execution, className }) => { - const isGateNode = isNodeGateNode( - nodes, - execution.metadata?.specNodeId || execution.id.nodeId, - ); - - const phase = getNodeFrontendPhase( - execution.closure?.phase ?? NodeExecutionPhase.UNDEFINED, - isGateNode, - ); - - return ( - <> - - - - ); - }, - className: styles.columnStatus, - key: 'phase', - label: t('phaseLabel'), - }, - { - cellRenderer: ({ execution: { closure }, className }) => { - const { startedAt } = closure; - if (!startedAt) { - return ''; - } - const startedAtDate = timestampToDate(startedAt); - return ( - <> - - {formatDateUTC(startedAtDate)} - - - {formatDateLocalTimezone(startedAtDate)} - - - ); - }, - className: styles.columnStartedAt, - key: 'startedAt', - label: t('startedAtLabel'), - }, - { - cellRenderer: ({ execution, className }) => { - const timing = getNodeExecutionTimingMS(execution); - if (timing === null) { - return ''; - } - return ( - <> - - {millisecondsToHMS(timing.duration)} - - - ); - }, - className: styles.columnDuration, - key: 'duration', - label: () => ( - <> - - {t('durationLabel')} - - - {t('queuedTimeLabel')} - - - ), - }, - { - cellRenderer: ({ execution, className }) => - execution.closure.phase === NodeExecutionPhase.UNDEFINED ? null : ( - - ), - className: styles.columnLogs, - key: 'actions', - label: '', - }, - ]; -} diff --git a/packages/console/src/components/Executions/Tables/styles.ts b/packages/console/src/components/Executions/Tables/styles.ts deleted file mode 100644 index b76fa4f79..000000000 --- a/packages/console/src/components/Executions/Tables/styles.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core'; -import { headerGridHeight } from 'components/Tables/constants'; -import { - headerFontFamily, - listhoverColor, - tableHeaderColor, - tablePlaceholderColor, -} from 'components/Theme/constants'; -import { - nodeExecutionsTableColumnWidths, - workflowVersionsTableColumnWidths, -} from './constants'; - -export const selectedClassName = 'selected'; -export const grayedClassName = 'grayed'; - -// NOTE: The order of these `makeStyles` calls is important, as it determines -// specificity in the browser. The execution table styles are overridden by -// the columns styles in some cases. So the column styles should be defined -// last. -export const useExecutionTableStyles = makeStyles((theme: Theme) => ({ - filters: { - paddingLeft: theme.spacing(3), - }, - [grayedClassName]: { - color: theme.palette.grey[300], - }, - borderBottom: { - borderBottom: `1px solid ${theme.palette.divider}`, - }, - errorContainer: { - padding: `0 ${theme.spacing(8)}px ${theme.spacing(2)}px`, - }, - expander: { - alignItems: 'center', - display: 'flex', - justifyContent: 'center', - marginLeft: theme.spacing(-4), - marginRight: theme.spacing(1), - width: theme.spacing(3), - }, - headerColumn: { - marginRight: theme.spacing(1), - minWidth: 0, - '&:first-of-type': { - marginLeft: theme.spacing(2), - }, - }, - headerColumnVersion: { - width: theme.spacing(4), - }, - headerRow: { - alignItems: 'center', - borderBottom: `4px solid ${theme.palette.divider}`, - borderTop: `1px solid ${theme.palette.divider}`, - color: tableHeaderColor, - display: 'flex', - fontFamily: headerFontFamily, - flexDirection: 'row', - height: theme.spacing(headerGridHeight), - }, - noRowsContent: { - color: tablePlaceholderColor, - margin: `${theme.spacing(5)}px auto`, - textAlign: 'center', - }, - row: { - display: 'flex', - flexDirection: 'column', - justifyContent: 'center', - '&:hover': { - backgroundColor: listhoverColor, - }, - [`&.${selectedClassName}`]: { - backgroundColor: listhoverColor, - }, - [`&.${grayedClassName}`]: { - color: theme.palette.grey[300], - }, - }, - clickableRow: { - cursor: 'pointer', - }, - rowColumns: { - alignItems: 'center', - display: 'flex', - flexDirection: 'row', - }, - rowColumn: { - marginRight: theme.spacing(1), - minWidth: 0, - paddingBottom: theme.spacing(1), - paddingTop: theme.spacing(1), - overflow: 'hidden', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', - }, - scrollContainer: { - flex: '1 1 0', - overflowY: 'scroll', - paddingBottom: theme.spacing(3), - }, - tableContainer: { - display: 'flex', - flexDirection: 'column', - }, -})); - -export const nameColumnLeftMarginGridWidth = 6; -export const useColumnStyles = makeStyles((theme: Theme) => ({ - [`&.${grayedClassName}`]: { - color: theme.palette.grey[400], - }, - columnName: { - flexGrow: 1, - // We want this to fluidly expand into whatever available space, - // so no minimum width. - flexBasis: 0, - overflow: 'hidden', - '&:first-of-type': { - marginLeft: theme.spacing(nameColumnLeftMarginGridWidth), - }, - [`&.${grayedClassName}`]: { - color: theme.palette.grey[400], - }, - }, - columnNodeId: { - flexBasis: nodeExecutionsTableColumnWidths.nodeId, - [`&.${grayedClassName}`]: { - color: theme.palette.grey[400], - }, - }, - columnType: { - flexBasis: nodeExecutionsTableColumnWidths.type, - textTransform: 'capitalize', - [`&.${grayedClassName}`]: { - color: theme.palette.grey[400], - }, - }, - columnStatus: { - display: 'flex', - flexBasis: nodeExecutionsTableColumnWidths.phase, - }, - columnStartedAt: { - flexBasis: nodeExecutionsTableColumnWidths.startedAt, - [`&.${grayedClassName}`]: { - color: theme.palette.grey[400], - }, - }, - columnDuration: { - flexBasis: nodeExecutionsTableColumnWidths.duration, - textAlign: 'right', - [`&.${grayedClassName}`]: { - color: theme.palette.grey[400], - }, - }, - columnLogs: { - flexBasis: nodeExecutionsTableColumnWidths.logs, - marginLeft: theme.spacing(4), - marginRight: theme.spacing(2), - [`&.${grayedClassName}`]: { - color: theme.palette.grey[400], - }, - }, - selectedExecutionName: { - fontWeight: 'bold', - }, -})); - -export const useWorkflowVersionsColumnStyles = makeStyles(() => ({ - columnRadioButton: { - width: workflowVersionsTableColumnWidths.radio, - }, - columnName: { - flexBasis: workflowVersionsTableColumnWidths.name, - whiteSpace: 'normal', - flexGrow: 1, - }, - columnCreatedAt: { - flexBasis: workflowVersionsTableColumnWidths.createdAt, - }, - columnLastRun: { - flexBasis: workflowVersionsTableColumnWidths.lastRun, - }, - columnRecentRun: { - flexBasis: workflowVersionsTableColumnWidths.recentRun, - }, -})); diff --git a/packages/console/src/components/Executions/Tables/test/NodeExecutionActions.test.tsx b/packages/console/src/components/Executions/Tables/test/NodeExecutionActions.test.tsx deleted file mode 100644 index 71f501b37..000000000 --- a/packages/console/src/components/Executions/Tables/test/NodeExecutionActions.test.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import * as React from 'react'; -import { act, fireEvent, render, waitFor } from '@testing-library/react'; -import { NodeExecutionDetailsContextProvider } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { mockWorkflowId } from 'mocks/data/fixtures/types'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { createTestQueryClient } from 'test/utils'; -import { insertFixture } from 'mocks/data/insertFixture'; -import { mockServer } from 'mocks/server'; -import { basicPythonWorkflow } from 'mocks/data/fixtures/basicPythonWorkflow'; -import { NodeExecution } from 'models/Execution/types'; -import { cloneDeep } from 'lodash'; -import { DetailsPanelContextProvider } from 'components/Executions/ExecutionDetails/DetailsPanelContext'; -import { NodeExecutionActions } from '../NodeExecutionActions'; - -jest.mock('components/Workflow/workflowQueries'); -jest.mock('components/Launch/LaunchForm/ResumeForm', () => ({ - ResumeForm: jest.fn(({ children }) => ( -
{children}
- )), -})); - -const { fetchWorkflow } = require('components/Workflow/workflowQueries'); - -const state = { selectedExecution: null, setSelectedExeccution: jest.fn() }; - -describe('Executions > Tables > NodeExecutionActions', () => { - let queryClient: QueryClient; - let fixture: ReturnType; - let execution: NodeExecution; - - beforeEach(() => { - fixture = basicPythonWorkflow.generate(); - execution = cloneDeep( - fixture.workflowExecutions.top.nodeExecutions.pythonNode.data, - ); - queryClient = createTestQueryClient(); - insertFixture(mockServer, fixture); - fetchWorkflow.mockImplementation(() => - Promise.resolve(fixture.workflows.top), - ); - }); - - const renderComponent = props => - render( - - - - - - - , - ); - - it('should render rerun action, if id can be determined', async () => { - let queryByTitle; - await act(() => { - const component = renderComponent({ execution, state }); - queryByTitle = component.queryByTitle; - }); - await waitFor(() => queryByTitle('View Inputs & Outputs')); - - expect(queryByTitle('View Inputs & Outputs')).toBeInTheDocument(); - expect(queryByTitle('Resume')).not.toBeInTheDocument(); - expect(queryByTitle('Rerun')).toBeInTheDocument(); - }); - - it('should render resume action, if the status is PAUSED', async () => { - const mockExecution = { ...execution, closure: { phase: 100 } }; - let queryByTitle; - await act(() => { - const component = renderComponent({ execution: mockExecution, state }); - queryByTitle = component.queryByTitle; - }); - await waitFor(() => queryByTitle('Resume')); - - expect(queryByTitle('View Inputs & Outputs')).toBeInTheDocument(); - expect(queryByTitle('Rerun')).toBeInTheDocument(); - expect(queryByTitle('Resume')).toBeInTheDocument(); - }); - - it('should render ResumeForm on resume button click', async () => { - const mockExecution = { ...execution, closure: { phase: 100 } }; - let queryByTitle, getByTitle, queryByTestId; - await act(() => { - const component = renderComponent({ execution: mockExecution, state }); - queryByTitle = component.queryByTitle; - getByTitle = component.getByTitle; - queryByTestId = component.queryByTestId; - }); - await waitFor(() => queryByTitle('Resume')); - - expect(queryByTitle('Resume')).toBeInTheDocument(); - - const resumeButton = getByTitle('Resume'); - await fireEvent.click(resumeButton); - - expect(queryByTestId('resume-form')).toBeInTheDocument(); - }); -}); diff --git a/packages/console/src/components/Executions/Tables/test/NodeExecutionRow.test.tsx b/packages/console/src/components/Executions/Tables/test/NodeExecutionRow.test.tsx deleted file mode 100644 index a6ebf92bc..000000000 --- a/packages/console/src/components/Executions/Tables/test/NodeExecutionRow.test.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import * as React from 'react'; -import { render, waitFor } from '@testing-library/react'; -import { NodeExecutionDetailsContextProvider } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import { mockWorkflowId } from 'mocks/data/fixtures/types'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { createTestQueryClient } from 'test/utils'; -import { insertFixture } from 'mocks/data/insertFixture'; -import { mockServer } from 'mocks/server'; -import { basicPythonWorkflow } from 'mocks/data/fixtures/basicPythonWorkflow'; -import { NodeExecution } from 'models/Execution/types'; -import { dNode, dTypes } from 'models/Graph/types'; -import { NodeExecutionDynamicContext } from 'components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDynamicProvider'; -import { cloneDeep } from 'lodash'; -import { NodeExecutionRow } from '../NodeExecutionRow'; - -jest.mock('components/Workflow/workflowQueries'); -const { fetchWorkflow } = require('components/Workflow/workflowQueries'); - -const columns = []; -const node: dNode = { - id: 'n1', - scopedId: 'n1', - type: dTypes.start, - name: 'node1', - nodes: [], - edges: [], -}; -const onToggle = jest.fn(); - -describe('Executions > Tables > NodeExecutionRow', () => { - let queryClient: QueryClient; - let fixture: ReturnType; - let execution: NodeExecution; - - beforeEach(() => { - fixture = basicPythonWorkflow.generate(); - execution = fixture.workflowExecutions.top.nodeExecutions.pythonNode.data; - node.execution = cloneDeep(execution); - queryClient = createTestQueryClient(); - insertFixture(mockServer, fixture); - fetchWorkflow.mockImplementation(() => - Promise.resolve(fixture.workflows.top), - ); - }); - - const renderComponent = props => { - const { node } = props; - return render( - - - n.execution), - componentProps: { - ref: null, - }, - inView: false, - }} - > - - - - , - ); - }; - it('should not render expander if node is a leaf', async () => { - const { queryByRole, queryByTestId } = renderComponent({ - columns, - node, - onToggle, - }); - await waitFor(() => queryByRole('listitem')); - - expect(queryByRole('listitem')).toBeInTheDocument(); - expect(queryByTestId('expander')).not.toBeInTheDocument(); - }); - - it('should render expander if node contains list of nodes', async () => { - node.execution!.metadata!.isParentNode = true; - const mockNode = { - ...node, - nodes: [node, node], - }; - - const { queryByRole, queryByTitle } = renderComponent({ - columns, - node: mockNode, - nodeExecution: execution, - onToggle, - }); - await waitFor(() => queryByRole('listitem')); - - expect(queryByRole('listitem')).toBeInTheDocument(); - expect(queryByTitle('Expand row')).toBeInTheDocument(); - }); -}); diff --git a/packages/console/src/components/Executions/Tables/types.ts b/packages/console/src/components/Executions/Tables/types.ts deleted file mode 100644 index ffa7eb4e1..000000000 --- a/packages/console/src/components/Executions/Tables/types.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { PaginatedFetchableData } from 'components/hooks/types'; -import { - Execution, - NodeExecution, - NodeExecutionIdentifier, -} from 'models/Execution/types'; -import { dNode } from 'models/Graph/types'; -import { Workflow } from 'models/Workflow/types'; - -export interface WorkflowExecutionsTableState { - selectedIOExecution: Execution | null; - setSelectedIOExecution(execution: Execution | null): void; -} -export interface NodeExecutionsTableState { - selectedExecution?: NodeExecutionIdentifier | null; - setSelectedExecution: ( - selectedExecutionId: NodeExecutionIdentifier | null, - ) => void; -} - -export interface ColumnDefinition { - cellRenderer(data: CellRendererData): React.ReactNode; - className?: string; - key: string; - label: string | React.FC; -} - -export interface NodeExecutionCellRendererData { - execution: NodeExecution; - node: dNode; - className: string; -} -export type NodeExecutionColumnDefinition = - ColumnDefinition; - -export interface WorkflowExecutionCellRendererData { - execution: Execution; - state: WorkflowExecutionsTableState; -} -export type WorkflowExecutionColumnDefinition = - ColumnDefinition; - -export interface WorkflowVersionCellRendererData { - workflow: Workflow; - state: WorkflowExecutionsTableState; - executions: PaginatedFetchableData; -} - -export type WorkflowVersionColumnDefinition = - ColumnDefinition; diff --git a/packages/console/src/components/Executions/Tables/utils.ts b/packages/console/src/components/Executions/Tables/utils.ts deleted file mode 100644 index d90568b17..000000000 --- a/packages/console/src/components/Executions/Tables/utils.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Spacing } from '@material-ui/core/styles/createSpacing'; -import { nameColumnLeftMarginGridWidth } from './styles'; - -export function calculateNodeExecutionRowLeftSpacing( - level: number, - spacing: Spacing, -) { - return spacing(nameColumnLeftMarginGridWidth + 3 * level); -} diff --git a/packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionDetails.tsx b/packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionDetails.tsx deleted file mode 100644 index 6b0813e3d..000000000 --- a/packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionDetails.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { unknownValueString } from 'common/constants'; -import { dateWithFromNow, protobufDurationToHMS } from 'common/formatters'; -import { timestampToDate } from 'common/utils'; -import { DetailsGroup } from 'components/common/DetailsGroup'; -import * as React from 'react'; -import { Protobuf } from '@flyteorg/flyteidl-types'; - -/** Renders the less important details for a `TaskExecution` as a `DetailsGroup` - */ -export const TaskExecutionDetails: React.FC<{ - startedAt?: Protobuf.ITimestamp; - updatedAt?: Protobuf.ITimestamp | null; - duration?: Protobuf.Duration; -}> = ({ startedAt, duration, updatedAt }) => { - const labelWidthGridUnits = startedAt ? 7 : 10; - const detailItems = React.useMemo(() => { - if (startedAt) { - return [ - { - name: 'started', - content: dateWithFromNow(timestampToDate(startedAt)), - }, - { - name: 'run time', - content: duration - ? protobufDurationToHMS(duration) - : unknownValueString, - }, - ]; - } else { - return [ - { - name: 'last updated', - content: updatedAt - ? dateWithFromNow(timestampToDate(updatedAt)) - : unknownValueString, - }, - ]; - } - }, [startedAt, duration, updatedAt]); - - return ( -
- -
- ); -}; diff --git a/packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionError.tsx b/packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionError.tsx deleted file mode 100644 index 43496af23..000000000 --- a/packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionError.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { ExpandableContentLink } from 'components/common/ExpandableContentLink'; -import { useCommonStyles } from 'components/common/styles'; -import { ExecutionError } from 'models/Execution/types'; -import * as React from 'react'; - -/** Renders an expandable error for a `TaskExecution` */ -export const TaskExecutionError: React.FC<{ error: ExecutionError }> = ({ - error, -}) => { - const commonStyles = useCommonStyles(); - const renderContent = () => ( -
{error.message}
- ); - return ( - - ); -}; diff --git a/packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionLogsCard.tsx b/packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionLogsCard.tsx deleted file mode 100644 index e3f0cb4b7..000000000 --- a/packages/console/src/components/Executions/TaskExecutionsList/TaskExecutionLogsCard.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import Typography from '@material-ui/core/Typography'; -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import { TaskExecutionPhase } from 'models/Execution/enums'; -import { MapTaskExecution, TaskExecution } from 'models/Execution/types'; -import { Core } from '@flyteorg/flyteidl-types'; -import { ExternalConfigHoc } from 'basics/ExternalConfigHoc'; -import { useExternalConfigurationContext } from 'basics/ExternalConfigurationProvider'; -import { isMapTaskV1 } from 'models'; -import { ExecutionStatusBadge } from '../ExecutionStatusBadge'; -import { TaskExecutionDetails } from './TaskExecutionDetails'; -import { TaskExecutionError } from './TaskExecutionError'; -import { TaskExecutionLogs } from './TaskExecutionLogs'; - -const useStyles = makeStyles((theme: Theme) => ({ - detailsLink: { - fontWeight: 'normal', - }, - header: { - marginBottom: theme.spacing(1), - }, - title: { - marginBottom: theme.spacing(1), - - '& > svg': { - verticalAlign: 'middle', - }, - }, - showDetailsButton: { - marginTop: theme.spacing(1), - }, - section: { - marginBottom: theme.spacing(2), - }, -})); - -interface TaskExecutionLogsCardProps { - taskExecution: TaskExecution | MapTaskExecution; - headerText: string; - phase: TaskExecutionPhase; - logs: Core.ITaskLog[]; - mappedItem?: any; -} - -export const TaskExecutionLogsCard: React.FC< - TaskExecutionLogsCardProps -> = props => { - const { taskExecution, headerText, phase, logs } = props; - const commonStyles = useCommonStyles(); - const styles = useStyles(); - const { registry } = useExternalConfigurationContext(); - - const { - closure: { - error, - startedAt, - updatedAt, - duration, - metadata, - eventVersion, - taskType, - }, - } = taskExecution; - - const taskHasStarted = phase >= TaskExecutionPhase.QUEUED; - const defaultHeader = ( - - {headerText} - - ); - - const externalHeader = registry?.taskExecutionAttemps && ( - - ); - - const isMapTask = isMapTaskV1( - eventVersion!, - metadata?.externalResources?.length ?? 0, - taskType ?? undefined, - ); - return ( - <> -
-
- {externalHeader || defaultHeader} -
- -
- {!!error && ( -
- -
- )} - {taskHasStarted && ( - <> -
- -
- {!isMapTask && ( -
- -
- )} - - )} - - ); -}; diff --git a/packages/console/src/components/Executions/TaskExecutionsList/index.ts b/packages/console/src/components/Executions/TaskExecutionsList/index.ts deleted file mode 100644 index 59a46cbd9..000000000 --- a/packages/console/src/components/Executions/TaskExecutionsList/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './TaskExecutionDetails'; -export * from './utils'; diff --git a/packages/console/src/components/Executions/TaskExecutionsList/test/TaskExecutionsList.test.tsx b/packages/console/src/components/Executions/TaskExecutionsList/test/TaskExecutionsList.test.tsx deleted file mode 100644 index fcd206f41..000000000 --- a/packages/console/src/components/Executions/TaskExecutionsList/test/TaskExecutionsList.test.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import * as React from 'react'; -import { render, waitFor } from '@testing-library/react'; -import { noExecutionsFoundString } from 'common/constants'; -import { APIContext } from 'components/data/apiContext'; -import { mockAPIContextValue } from 'components/data/__mocks__/apiContext'; -import { listTaskExecutions } from 'models/Execution/api'; -import { NodeExecution } from 'models/Execution/types'; -import { mockNodeExecutionResponse } from 'models/Execution/__mocks__/mockNodeExecutionsData'; -import { TaskExecutionsList } from '../TaskExecutionsList'; -import { MockPythonTaskExecution } from '../TaskExecutions.mocks'; - -describe('TaskExecutionsList', () => { - let nodeExecution: NodeExecution; - let mockListTaskExecutions: jest.Mock>; - - const renderList = () => - render( - - - , - ); - beforeEach(() => { - nodeExecution = { ...mockNodeExecutionResponse } as NodeExecution; - mockListTaskExecutions = jest.fn().mockResolvedValue({ entities: [] }); - }); - - it('Renders message when no task executions exist', async () => { - const { queryByText } = renderList(); - await waitFor(() => {}); - expect(queryByText(noExecutionsFoundString)).toBeInTheDocument(); - }); - - it('Renders tasks when task executions exist', async () => { - nodeExecution = { - ...mockNodeExecutionResponse, - startedAt: '2021-01-01T00:00:00Z', - taskExecutions: [MockPythonTaskExecution], - } as NodeExecution; - - const { queryByText } = renderList(); - await waitFor(() => {}); - expect(queryByText('Attempt 01')).toBeInTheDocument(); - expect(queryByText('Succeeded')).toBeInTheDocument(); - }); -}); diff --git a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDetailsContextProvider.tsx b/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDetailsContextProvider.tsx deleted file mode 100644 index ed8f7bf98..000000000 --- a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDetailsContextProvider.tsx +++ /dev/null @@ -1,193 +0,0 @@ -import React, { - PropsWithChildren, - createContext, - useContext, - useEffect, - useRef, - useState, -} from 'react'; -import { log } from 'common/log'; -import { Identifier } from 'models/Common/types'; -import { NodeExecution } from 'models/Execution/types'; -import { CompiledWorkflowClosure } from 'models/Workflow/types'; -import { useQueryClient } from 'react-query'; -import { fetchWorkflow } from 'components/Workflow/workflowQueries'; -import { NodeExecutionDetails } from '../../types'; -import { UNKNOWN_DETAILS } from './types'; -import { - createExecutionDetails, - CurrentExecutionDetails, -} from './createExecutionArray'; -import { getTaskThroughExecution } from './getTaskThroughExecution'; - -interface NodeExecutionDetailsState { - getNodeExecutionDetails: ( - nodeExecution?: NodeExecution, - ) => Promise; - workflowId: Identifier; - compiledWorkflowClosure: CompiledWorkflowClosure | null; -} - -const NOT_AVAILABLE = 'NotAvailable'; -/** Use this Context to redefine Provider returns in storybooks */ -export const NodeExecutionDetailsContext = - createContext({ - /** Default values used if ContextProvider wasn't initialized. */ - getNodeExecutionDetails: async () => { - log.error( - 'ERROR: No NodeExecutionDetailsContextProvider was found in parent components.', - ); - return UNKNOWN_DETAILS; - }, - workflowId: { - project: NOT_AVAILABLE, - domain: NOT_AVAILABLE, - name: NOT_AVAILABLE, - version: NOT_AVAILABLE, - }, - compiledWorkflowClosure: null, - }); - -/** Should be used to get NodeExecutionDetails for a specific nodeExecution. */ -export const useNodeExecutionDetails = (nodeExecution?: NodeExecution) => - useContext(NodeExecutionDetailsContext).getNodeExecutionDetails( - nodeExecution, - ); - -/** Could be used to access the whole NodeExecutionDetailsState */ -export const useNodeExecutionContext = (): NodeExecutionDetailsState => - useContext(NodeExecutionDetailsContext); - -export type ProviderProps = PropsWithChildren<{ - workflowId: Identifier; -}>; - -/** Should wrap "top level" component in Execution view, will build a nodeExecutions tree for specific workflow */ -export const NodeExecutionDetailsContextProvider = ({ - workflowId, - children, -}: ProviderProps) => { - // workflow Identifier - separated to parameters, to minimize re-render count - // as useEffect doesn't know how to do deep comparison - const { resourceType, project, domain, name, version } = workflowId; - - const [executionTree, setExecutionTree] = useState( - {} as CurrentExecutionDetails, - ); - const [tasks, setTasks] = useState(new Map()); - const [closure, setClosure] = useState( - {} as CompiledWorkflowClosure, - ); - - const resetState = () => { - setExecutionTree({} as CurrentExecutionDetails); - setClosure({} as CompiledWorkflowClosure); - }; - - const queryClient = useQueryClient(); - const isMounted = useRef(false); - useEffect(() => { - isMounted.current = true; - return () => { - isMounted.current = false; - }; - }, []); - - useEffect(() => { - let isCurrent = true; - async function fetchData() { - const workflowId: Identifier = { - resourceType, - project, - domain, - name, - version, - }; - const result = await fetchWorkflow(queryClient, workflowId); - if (!result) { - resetState(); - return; - } - const fetchedWorkflow = JSON.parse(JSON.stringify(result)); - const tree = createExecutionDetails(fetchedWorkflow); - if (isCurrent) { - setClosure(fetchedWorkflow.closure?.compiledWorkflow ?? null); - setExecutionTree(tree); - } - } - - fetchData(); - - // This handles the unmount case - return () => { - isCurrent = false; - resetState(); - }; - }, [queryClient, resourceType, project, domain, name, version]); - - const getDynamicTasks = async (nodeExecution: NodeExecution) => { - const taskDetails = await getTaskThroughExecution( - queryClient, - nodeExecution, - closure, - ); - - const tasksMap = tasks; - tasksMap.set(nodeExecution.id.nodeId, taskDetails); - if (isMounted.current) { - setTasks(tasksMap); - } - - return taskDetails; - }; - - const getDetails = async ( - nodeExecution?: NodeExecution, - ): Promise => { - if (!executionTree || !nodeExecution) { - return UNKNOWN_DETAILS; - } - - const specId = - nodeExecution.scopedId || - nodeExecution.metadata?.specNodeId || - nodeExecution.id.nodeId; - const nodeDetail = executionTree.nodes?.filter(n => n.scopedId === specId); - if (nodeDetail?.length === 0) { - let details = tasks.get(nodeExecution.id.nodeId); - if (details) { - // we already have looked for it and found - return details; - } - - // look for specific task by nodeId in current execution - if ( - nodeExecution.metadata?.isDynamic || - nodeExecution.dynamicParentNodeId - ) { - details = await getDynamicTasks(nodeExecution); - } - return details; - } - - return nodeDetail?.[0] ?? UNKNOWN_DETAILS; - }; - - return ( - - {children} - - ); -}; diff --git a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDynamicProvider.tsx b/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDynamicProvider.tsx deleted file mode 100644 index 7456454e3..000000000 --- a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDynamicProvider.tsx +++ /dev/null @@ -1,172 +0,0 @@ -import React, { - createContext, - PropsWithChildren, - useContext, - useEffect, - useMemo, - Ref, - useState, -} from 'react'; -import { WorkflowNodeExecution } from 'components/Executions/contexts'; -import { useNodeExecutionRow } from 'components/Executions/ExecutionDetails/useNodeExecutionRow'; -import { - isParentNode, - nodeExecutionIsTerminal, -} from 'components/Executions/utils'; -import { keyBy, values } from 'lodash'; -import { useInView } from 'react-intersection-observer'; -import { useQueryClient } from 'react-query'; -import { dNode } from 'models/Graph/types'; -import { useNodeExecutionsById } from './WorkflowNodeExecutionsProvider'; - -export type RefType = Ref; -export interface INodeExecutionDynamicContext { - node: dNode; - childExecutions: WorkflowNodeExecution[]; - childCount: number; - inView: boolean; - componentProps: React.DetailedHTMLProps< - React.HTMLAttributes, - HTMLDivElement - >; -} - -export const NodeExecutionDynamicContext = - createContext({ - node: {} as dNode, - childExecutions: [], - childCount: 0, - inView: false, - componentProps: { - ref: null, - }, - }); - -const checkEnableChildQuery = ( - childExecutions: WorkflowNodeExecution[], - nodeExecution: WorkflowNodeExecution, - inView: boolean, -) => { - // check that we fetched all children otherwise force fetch - const missingChildren = - isParentNode(nodeExecution) && !childExecutions.length; - - const childrenStillRunning = childExecutions?.some( - c => !nodeExecutionIsTerminal(c), - ); - - const executionRunning = !nodeExecutionIsTerminal(nodeExecution); - - const tasksFetched = nodeExecution.tasksFetched; - - const forceRefetch = - inView && - (!tasksFetched || - missingChildren || - childrenStillRunning || - executionRunning); - - // force fetch: - // if parent's children haven't been fetched - // if parent is still running or - // if any childExecutions are still running - return forceRefetch; -}; - -export type NodeExecutionDynamicProviderProps = PropsWithChildren<{ - node: dNode; - overrideInViewValue?: boolean; -}>; -/** Should wrap "top level" component in Execution view, will build a nodeExecutions tree for specific workflow */ -export const NodeExecutionDynamicProvider = ({ - node, - overrideInViewValue, - children, -}: NodeExecutionDynamicProviderProps) => { - const queryClient = useQueryClient(); - const { ref, inView } = useInView(); - const [overloadedInView, setOverloadedInView] = useState(false); - const [fetchedChildCount, setFetchedChildCount] = useState(0); - - useEffect(() => { - setOverloadedInView(prev => { - const newVal = - overrideInViewValue === undefined ? inView : overrideInViewValue; - if (newVal === prev) { - return prev; - } - - return newVal; - }); - }, [inView, overrideInViewValue]); - // get running data - const { setCurrentNodeExecutionsById, nodeExecutionsById } = - useNodeExecutionsById(); - - const childExecutions = useMemo(() => { - const children = values(nodeExecutionsById).filter(execution => { - return execution.fromUniqueParentId === node?.scopedId; - }); - - return children; - }, [nodeExecutionsById]); - - const { nodeExecutionRowQuery } = useNodeExecutionRow( - queryClient, - node?.execution!, - () => { - const shouldRun = checkEnableChildQuery( - childExecutions, - node?.execution!, - !!overloadedInView, - ); - - return shouldRun; - }, - ); - - useEffect(() => { - // don't update if still fetching - if (nodeExecutionRowQuery.isFetching || !nodeExecutionRowQuery.data) { - return; - } - - const parentAndChildren = nodeExecutionRowQuery.data; - - // update parent context with tnew executions data - const parentAndChildrenById = keyBy(parentAndChildren, 'scopedId'); - setCurrentNodeExecutionsById(parentAndChildrenById, true); - - const newChildCount = (parentAndChildren?.length || 1) - 1; - - // update known children count - setFetchedChildCount(prev => { - if (prev === newChildCount) { - return prev; - } - return newChildCount; - }); - }, [nodeExecutionRowQuery]); - - return ( - - {children} - - ); -}; - -export const useNodeExecutionDynamicContext = - (): INodeExecutionDynamicContext => { - return useContext(NodeExecutionDynamicContext); - }; diff --git a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/WorkflowNodeExecutionsProvider.tsx b/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/WorkflowNodeExecutionsProvider.tsx deleted file mode 100644 index a2f08d31d..000000000 --- a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/WorkflowNodeExecutionsProvider.tsx +++ /dev/null @@ -1,236 +0,0 @@ -import React, { - PropsWithChildren, - useContext, - useEffect, - useState, -} from 'react'; -import { NodeExecution } from 'models/Execution/types'; -import { - IWorkflowNodeExecutionsContext, - NodeExecutionsById, - WorkflowNodeExecutionsContext, -} from 'components/Executions/contexts'; -import { isEqual, keyBy, merge, mergeWith, cloneDeep } from 'lodash'; -import { dNode } from 'models/Graph/types'; -import { - NodeExecutionDynamicWorkflowQueryResult, - makeNodeExecutionDynamicWorkflowQuery, -} from 'components/Workflow/workflowQueries'; -import { transformerWorkflowToDag } from 'components/WorkflowGraph/transformerWorkflowToDag'; -import { checkForDynamicExecutions } from 'components/common/utils'; -import { useQuery } from 'react-query'; -import { convertToPlainNodes } from 'components/Executions/ExecutionDetails/Timeline/helpers'; -import { useNodeExecutionContext } from './NodeExecutionDetailsContextProvider'; -import { - mapStringifyReplacer, - mergeNodeExecutions, - stringifyIsEqual, -} from './utils'; - -export type WorkflowNodeExecutionsProviderProps = PropsWithChildren<{ - initialNodeExecutions?: NodeExecution[]; -}>; - -/** Should wrap "top level" component in Execution view, will build a nodeExecutions tree for specific workflow */ -export const WorkflowNodeExecutionsProvider = ({ - initialNodeExecutions, - children, -}: WorkflowNodeExecutionsProviderProps) => { - const [shouldUpdate, setShouldUpdate] = useState(false); - const { compiledWorkflowClosure } = useNodeExecutionContext(); - - const [nodeExecutionsById, setNodeExecutionsById] = - useState({}); - - const [dagError, setDagError] = useState(); - const [mergedDag, setMergedDag] = useState({}); - const [initialDNodes, setInitialDNodes] = useState([]); - - const [dynamicWorkflows, setDynamicWorkflows] = - useState({}); - const [staticExecutionIdsMap, setstaticExecutionIdsMap] = useState({}); - - const [dynamicParents, setDynamicParents] = useState({}); - - const nodeExecutionDynamicWorkflowQuery = useQuery( - makeNodeExecutionDynamicWorkflowQuery(dynamicParents), - ); - - useEffect(() => { - const initialNodeExecutionsById = keyBy(initialNodeExecutions, 'scopedId'); - - setCurrentNodeExecutionsById(initialNodeExecutionsById, true); - }, [initialNodeExecutions]); - - useEffect(() => { - const { staticExecutionIdsMap: newstaticExecutionIdsMap } = - compiledWorkflowClosure - ? transformerWorkflowToDag(compiledWorkflowClosure) - : { staticExecutionIdsMap: {} }; - - setstaticExecutionIdsMap(prev => { - if (isEqual(prev, newstaticExecutionIdsMap)) { - return prev; - } - - return newstaticExecutionIdsMap; - }); - }, [compiledWorkflowClosure]); - - useEffect(() => { - const newdynamicParents = checkForDynamicExecutions( - nodeExecutionsById, - staticExecutionIdsMap, - ); - setDynamicParents(prev => { - if (isEqual(prev, newdynamicParents)) { - return prev; - } - - return newdynamicParents; - }); - }, [nodeExecutionsById]); - - useEffect(() => { - const dagData = compiledWorkflowClosure - ? transformerWorkflowToDag( - compiledWorkflowClosure, - dynamicWorkflows, - nodeExecutionsById, - ) - : { dag: {} as dNode, staticExecutionIdsMap: {}, error: undefined }; - - const { dag, staticExecutionIdsMap, error } = dagData; - - if (error) { - // if an error occured, stop processing - setDagError(error); - return; - } - - const nodes = dag?.nodes ?? []; - - let newMergedDag = dag; - - for (const dynamicId in dynamicWorkflows) { - if (staticExecutionIdsMap[dynamicId]) { - if (compiledWorkflowClosure) { - const dynamicWorkflow = transformerWorkflowToDag( - compiledWorkflowClosure, - dynamicWorkflows, - nodeExecutionsById, - ); - newMergedDag = dynamicWorkflow.dag; - } - } - } - setMergedDag(prev => { - if (stringifyIsEqual(prev, newMergedDag)) { - return prev; - } - return newMergedDag; - }); - - // we remove start/end node info in the root dNode list during first assignment - const plainNodes = convertToPlainNodes(nodes); - plainNodes.map(node => { - const initialNode = initialDNodes.find(n => n.scopedId === node.scopedId); - if (initialNode) { - node.expanded = initialNode.expanded; - } - }); - setInitialDNodes(prev => { - if (stringifyIsEqual(prev, plainNodes)) { - return prev; - } - return plainNodes; - }); - }, [ - compiledWorkflowClosure, - dynamicWorkflows, - dynamicParents, - nodeExecutionsById, - ]); - - useEffect(() => { - if (nodeExecutionDynamicWorkflowQuery.isFetching) { - return; - } - setDynamicWorkflows(prev => { - const newDynamicWorkflows = merge( - { ...(prev || {}) }, - nodeExecutionDynamicWorkflowQuery.data, - ); - if (isEqual(prev, newDynamicWorkflows)) { - return prev; - } - - return newDynamicWorkflows; - }); - }, [nodeExecutionDynamicWorkflowQuery]); - - useEffect(() => { - if (shouldUpdate) { - const newDynamicParents = checkForDynamicExecutions( - nodeExecutionsById, - staticExecutionIdsMap, - ); - setDynamicParents(prev => { - if (isEqual(prev, newDynamicParents)) { - return prev; - } - - return newDynamicParents; - }); - setShouldUpdate(false); - } - }, [shouldUpdate]); - - const setCurrentNodeExecutionsById = ( - newNodeExecutionsById: NodeExecutionsById, - checkForDynamicParents?: boolean, - ): void => { - const mergedNodes = mergeWith( - cloneDeep(nodeExecutionsById), - cloneDeep(newNodeExecutionsById), - mergeNodeExecutions, - ); - - setNodeExecutionsById(prev => { - if ( - JSON.stringify(prev, mapStringifyReplacer) === - JSON.stringify(mergedNodes, mapStringifyReplacer) - ) { - return prev; - } - - if (checkForDynamicParents) { - setShouldUpdate(true); - } - - return mergedNodes; - }); - }; - - return ( - - {children} - - ); -}; - -export const useNodeExecutionsById = (): IWorkflowNodeExecutionsContext => { - return useContext(WorkflowNodeExecutionsContext); -}; diff --git a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/createExecutionArray.tsx b/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/createExecutionArray.tsx deleted file mode 100644 index 751b07864..000000000 --- a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/createExecutionArray.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { transformerWorkflowToDag } from 'components/WorkflowGraph/transformerWorkflowToDag'; -import { getTaskDisplayType } from 'components/Executions/utils'; -import { - NodeExecutionDetails, - NodeExecutionDisplayType, -} from 'components/Executions/types'; -import { Workflow } from 'models/Workflow/types'; -import { Identifier } from 'models/Common/types'; -import { CompiledTask } from 'models/Task/types'; -import { dNode } from 'models/Graph/types'; -import { isEndNode, isStartNode } from 'models/Node/utils'; -import { UNKNOWN_DETAILS } from './types'; - -interface NodeExecutionInfo extends NodeExecutionDetails { - scopedId?: string; -} - -export interface CurrentExecutionDetails { - executionId: Identifier; - nodes: NodeExecutionInfo[]; -} - -function convertToPlainNodes(nodes: dNode[], level = 0): dNode[] { - const result: dNode[] = []; - if (!nodes || nodes.length === 0) { - return result; - } - nodes.forEach(node => { - if (isStartNode(node) || isEndNode(node)) { - return; - } - result.push({ ...node, level }); - if (node.nodes.length > 0) { - result.push(...convertToPlainNodes(node.nodes, level + 1)); - } - }); - return result; -} - -const getNodeDetails = ( - node: dNode, - tasks: CompiledTask[], -): NodeExecutionInfo => { - if (node.value.taskNode) { - const templateName = node.value.taskNode.referenceId.name ?? node.name; - const task = tasks.find(t => t.template.id.name === templateName); - const taskType = getTaskDisplayType(task?.template.type); - - return { - scopedId: node.scopedId, - displayId: node.value.id ?? node.id, - displayName: templateName, - displayType: taskType, - taskTemplate: task?.template, - }; - } - - if (node.value.workflowNode) { - const workflowNode = node.value.workflowNode; - const info = workflowNode.launchplanRef ?? workflowNode.subWorkflowRef; - return { - scopedId: node.scopedId, - displayId: node.value.id ?? node.id, - displayName: node.name ?? info?.name ?? 'N/A', - displayType: NodeExecutionDisplayType.Workflow, - }; - } - - // TODO: https://github.com/flyteorg/flyteconsole/issues/274 - if (node.value.branchNode) { - return { - scopedId: node.scopedId, - displayId: node.value.id ?? node.id, - displayName: 'branchNode', - displayType: NodeExecutionDisplayType.BranchNode, - }; - } - - if (node.value.gateNode) { - const templateName = node.name; - const task = tasks.find(t => t.template.id.name === templateName); - const taskType = getTaskDisplayType(task?.template.type); - return { - scopedId: node.scopedId, - displayId: node.value.id ?? node.id, - displayName: 'gateNode', - displayType: taskType, - taskTemplate: task?.template, - }; - } - - return UNKNOWN_DETAILS; -}; - -export function createExecutionDetails( - workflow: Workflow, -): CurrentExecutionDetails { - const result: CurrentExecutionDetails = { - executionId: workflow.id, - nodes: [], - }; - - if (!workflow.closure?.compiledWorkflow) { - return result; - } - - const compiledWorkflow = workflow.closure?.compiledWorkflow; - const { tasks = [] } = compiledWorkflow; - - let dNodes = transformerWorkflowToDag(compiledWorkflow).dag.nodes ?? []; - dNodes = convertToPlainNodes(dNodes); - - dNodes.forEach(n => { - const details = getNodeDetails(n, tasks); - result.nodes.push({ - ...details, - }); - }); - - return result; -} diff --git a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/getTaskThroughExecution.ts b/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/getTaskThroughExecution.ts deleted file mode 100644 index b97730df9..000000000 --- a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/getTaskThroughExecution.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { getTaskDisplayType } from 'components/Executions/utils'; -import { fetchTaskExecutionList } from 'components/Executions/taskExecutionQueries'; -import { NodeExecutionDetails } from 'components/Executions/types'; -import { fetchTaskTemplate } from 'components/Task/taskQueries'; -import { TaskTemplate } from 'models/Task/types'; -import { QueryClient } from 'react-query/types/core/queryClient'; -import { WorkflowNodeExecution } from 'components/Executions/contexts'; -import { CompiledWorkflowClosure } from 'models'; -import { isEqual } from 'lodash'; - -export const getTaskThroughExecution = async ( - queryClient: QueryClient, - nodeExecution: WorkflowNodeExecution, - closure: CompiledWorkflowClosure, -): Promise => { - const taskExecutions = await (nodeExecution?.tasksFetched - ? // if the nodeExecution tasks were already fetched, use them - Promise.resolve(nodeExecution.taskExecutions || []) - : // otherwise, fetch them - fetchTaskExecutionList(queryClient, nodeExecution.id)); - - let taskTemplate: TaskTemplate = closure?.tasks?.find(task => - isEqual(task.template.id, taskExecutions[0].id.taskId), - )?.template as TaskTemplate; - - if ( - // skip request if the template was found - !taskTemplate && - // skip request if the node has a dynamic parent - !nodeExecution.dynamicParentNodeId && - taskExecutions && - taskExecutions.length > 0 - ) { - taskTemplate = await fetchTaskTemplate( - queryClient, - taskExecutions[0].id.taskId, - ); - - if (!taskTemplate) { - // eslint-disable-next-line no-console - console.error( - `ERROR: Unexpected missing task template while fetching NodeExecution details: ${JSON.stringify( - taskExecutions[0].id.taskId, - )}`, - ); - } - } - - const taskDetails: NodeExecutionDetails = { - displayId: nodeExecution.id.nodeId, - displayName: taskExecutions?.[0]?.id.taskId.name, - displayType: getTaskDisplayType(taskTemplate?.type), - taskTemplate: taskTemplate, - }; - - return taskDetails; -}; diff --git a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/index.ts b/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/index.ts deleted file mode 100644 index 1211650c2..000000000 --- a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './NodeExecutionDetailsContextProvider'; -export * from './WorkflowNodeExecutionsProvider'; -export * from './NodeExecutionDynamicProvider'; -export * from './utils'; diff --git a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/types.ts b/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/types.ts deleted file mode 100644 index dae3e1afb..000000000 --- a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/types.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { NodeExecutionDisplayType } from 'components/Executions/types'; -import { Core } from '@flyteorg/flyteidl-types'; - -export const UNKNOWN_DETAILS = { - displayId: 'unknownNode', - displayType: NodeExecutionDisplayType.Unknown, -}; - -export function isIdEqual(lhs: Core.IIdentifier, rhs: Core.IIdentifier) { - return ( - lhs.resourceType === rhs.resourceType && - lhs.project === rhs.project && - lhs.domain === rhs.domain && - lhs.name === rhs.name && - lhs.version === rhs.version - ); -} diff --git a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/utils.ts b/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/utils.ts deleted file mode 100644 index c954576e4..000000000 --- a/packages/console/src/components/Executions/contextProvider/NodeExecutionDetails/utils.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { cloneDeep, merge, mergeWith } from 'lodash'; - -export const mapStringifyReplacer = (key: string, value: any) => { - if (value instanceof Map) { - return { - dataType: 'Map', - value: Array.from(value.entries()), // or with spread: value: [...value] - }; - } else { - return value; - } -}; - -export const stringifyIsEqual = (a: any, b: any) => { - return ( - JSON.stringify(a, mapStringifyReplacer) === - JSON.stringify(b, mapStringifyReplacer) - ); -}; - -export const mergeNodeExecutions = (val, srcVal, _topkey) => { - const retVal = mergeWith(val, srcVal, (target, src, _key) => { - if (!target) { - return src; - } - if (src instanceof Map) { - return src; - } - const finaVal = typeof src === 'object' ? merge(target, src) : src; - return finaVal; - }); - return retVal; -}; diff --git a/packages/console/src/components/Executions/contextProvider/index.ts b/packages/console/src/components/Executions/contextProvider/index.ts deleted file mode 100644 index 05a2a8bf9..000000000 --- a/packages/console/src/components/Executions/contextProvider/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './NodeExecutionDetails'; diff --git a/packages/console/src/components/Executions/contexts.ts b/packages/console/src/components/Executions/contexts.ts deleted file mode 100644 index 9a8ea77e3..000000000 --- a/packages/console/src/components/Executions/contexts.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Task } from 'models'; -import { - Execution, - ExecutionData, - LogsByPhase, - MapTaskExecution, - NodeExecution, -} from 'models/Execution/types'; -import { dNode } from 'models/Graph/types'; -import { createContext } from 'react'; - -export interface ExecutionContextData { - execution: Execution; -} - -export type WorkflowTaskExecution = MapTaskExecution & { - task?: Task; - taskData?: ExecutionData; -}; -export interface WorkflowNodeExecution extends NodeExecution { - tasksFetched?: boolean; - logsByPhase?: LogsByPhase; - taskExecutions?: WorkflowTaskExecution[]; - nodeExecutionData?: ExecutionData; -} - -export const ExecutionContext = createContext( - {} as ExecutionContextData, -); - -export type NodeExecutionsById = Dictionary; -export type FilteredNodeExecutions = WorkflowNodeExecution[] | undefined; -export type SetCurrentNodeExecutionsById = ( - currentNodeExecutionsById: Dictionary, - checkForDynamicParents?: boolean, -) => void; - -export interface IWorkflowNodeExecutionsContext { - nodeExecutionsById: NodeExecutionsById; - setCurrentNodeExecutionsById: SetCurrentNodeExecutionsById; - shouldUpdate: boolean; - setShouldUpdate: (val: boolean) => void; - // Tabs - initialDNodes: dNode[]; - dagData: { - mergedDag: any; - dagError: any; - }; -} - -export const WorkflowNodeExecutionsContext = - createContext({ - nodeExecutionsById: {}, - setCurrentNodeExecutionsById: () => { - throw new Error('Must use NodeExecutionsByIdContextProvider'); - }, - shouldUpdate: false, - setShouldUpdate: _val => { - throw new Error('Must use NodeExecutionsByIdContextProvider'); - }, - initialDNodes: [], - dagData: { - mergedDag: {}, - dagError: null, - }, - }); diff --git a/packages/console/src/components/Executions/index.ts b/packages/console/src/components/Executions/index.ts deleted file mode 100644 index 9058bf7a3..000000000 --- a/packages/console/src/components/Executions/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export * from './types'; -export * from './contexts'; -export * from './contextProvider'; -export * from './ExecutionDetails'; -export * from './nodeExecutionQueries'; -export * from './utils'; -export * from './ExecutionStatusBadge'; -export * from './TaskExecutionsList'; -export * from './taskExecutionQueries'; -export * from './useWorkflowExecution'; -export * from './useWorkflowExecution'; -export * from './nodeExecutionQueries'; diff --git a/packages/console/src/components/Executions/nodeExecutionQueries.ts b/packages/console/src/components/Executions/nodeExecutionQueries.ts deleted file mode 100644 index 41adff1a4..000000000 --- a/packages/console/src/components/Executions/nodeExecutionQueries.ts +++ /dev/null @@ -1,532 +0,0 @@ -import { QueryInput, QueryType } from 'components/data/types'; -import { retriesToZero } from 'components/flytegraph/ReactFlow/utils'; -import { cloneDeep, isEqual } from 'lodash'; -import { - PaginatedEntityResponse, - RequestConfig, -} from 'models/AdminEntity/types'; -import { - getNodeExecution, - getNodeExecutionData, - getTaskExecutionData, - listNodeExecutions, - listTaskExecutionChildren, - listTaskExecutions, -} from 'models/Execution/api'; -import { nodeExecutionQueryParams } from 'models/Execution/constants'; -import { - ExternalResource, - LogsByPhase, - NodeExecution, - NodeExecutionIdentifier, - TaskExecution, - TaskExecutionIdentifier, - WorkflowExecutionIdentifier, -} from 'models/Execution/types'; -import { ignoredNodeIds } from 'models/Node/constants'; -import { isMapTaskV1 } from 'models/Task/utils'; -import { QueryClient } from 'react-query'; -import { getTask } from 'models'; -import { createDebugLogger } from 'common/log'; -import { WorkflowNodeExecution, WorkflowTaskExecution } from './contexts'; -import { fetchTaskExecutionList } from './taskExecutionQueries'; -import { formatRetryAttempt, getGroupedLogs } from './TaskExecutionsList/utils'; -import { NodeExecutionGroup } from './types'; -import { isDynamicNode, isParentNode, nodeExecutionIsTerminal } from './utils'; - -const debug = createDebugLogger('@nodeExecutionQueries'); - -function removeSystemNodes(nodeExecutions: NodeExecution[]): NodeExecution[] { - return nodeExecutions.filter(ne => { - if (ignoredNodeIds.includes(ne.id.nodeId)) { - return false; - } - const specId = ne.metadata?.specNodeId; - if (specId != null && ignoredNodeIds.includes(specId)) { - return false; - } - return true; - }); -} - -/** A query for fetching a single `NodeExecution` by id. */ -export function makeNodeExecutionQuery( - id: NodeExecutionIdentifier, -): QueryInput { - return { - queryKey: [QueryType.NodeExecution, id], - queryFn: () => getNodeExecution(id), - }; -} - -/** A query for fetching a single `NodeExecution` by id. */ -export function makeNodeExecutionAndTasksQuery( - id: NodeExecutionIdentifier, - queryClient: QueryClient, - dynamicParentNodeId?: string, -) { - return { - queryKey: [QueryType.NodeExecutionAndTasks, id], - queryFn: async () => { - // step 1: Fetch the Node execution - const nodeExecutionPure = await getNodeExecution(id); - - const dynamicParent = dynamicParentNodeId - ? await getNodeExecution({ ...id, nodeId: dynamicParentNodeId }) - : null; - - // step 2: Fetch the task executions and attach them to the node execution - const workflowNodeExecution = (await getTaskExecutions( - queryClient, - nodeExecutionPure, - )) as WorkflowNodeExecution; - - if (!workflowNodeExecution) { - return [{} as WorkflowNodeExecution]; - } - - workflowNodeExecution.scopedId = workflowNodeExecution?.id?.nodeId; - // step 3: get the node executiondata - const nodeExecutionData = await getNodeExecutionData(id); - - // step 4: get the compiled task closure - // -- only one request is made as it is constant across all attempts - const taskExecutions = workflowNodeExecution?.taskExecutions || []; - const taskId = taskExecutions?.[0]?.id?.taskId; - - // don't issue a task compiled closure request if the node has a dynamic parent - // TODO: fetch dynamic parent to get the compiled closure - const compiledTaskClosure = await (taskId && !dynamicParentNodeId - ? getTask(taskId!).catch(() => null) - : Promise.resolve(null)); - - // step 5: get each task's executions data - const tasksExecutionData = await Promise.all( - taskExecutions?.map(te => - getTaskExecutionData(te.id).then(executionData => { - const finalTask: WorkflowTaskExecution = { - ...te, - // append data to each task individually - task: compiledTaskClosure!, - taskData: executionData, - }; - return finalTask; - }), - ), - ); - - const final = [ - { - ...workflowNodeExecution, - taskExecutions: tasksExecutionData, - nodeExecutionData, - } as WorkflowNodeExecution, - ]; - - if (dynamicParent) { - final.push({ - ...(dynamicParent as WorkflowNodeExecution), - scopedId: dynamicParentNodeId, - }); - } - - return final; - }, - }; -} - -export const getTaskExecutions = async ( - queryClient: QueryClient, - nodeExecution: WorkflowNodeExecution, -): Promise => { - const isTerminal = nodeExecutionIsTerminal(nodeExecution); - const isDynamic = isDynamicNode(nodeExecution); - - return await fetchTaskExecutionList( - queryClient, - nodeExecution.id as any, - ).then(taskExecutions => { - const finalTaskExecutions = cloneDeep(taskExecutions)?.map( - taskExecution => - ({ - ...taskExecution, - dynamicParentNodeId: nodeExecution.dynamicParentNodeId, - } as WorkflowTaskExecution), - ); - - const useNewMapTaskView = finalTaskExecutions?.every(taskExecution => { - const { - closure: { taskType, metadata, eventVersion = 0 }, - } = taskExecution; - return isMapTaskV1( - eventVersion, - metadata?.externalResources?.length ?? 0, - taskType ?? undefined, - ); - }); - - const externalResources: ExternalResource[] = finalTaskExecutions - .map(taskExecution => taskExecution.closure.metadata?.externalResources) - .flat() - .filter((resource): resource is ExternalResource => !!resource); - - const logsByPhase: LogsByPhase = getGroupedLogs(externalResources); - - const appendTasksFetched = !isDynamic || (isDynamic && isTerminal); - - return { - ...nodeExecution, - taskExecutions: finalTaskExecutions, - ...(useNewMapTaskView && logsByPhase.size > 0 && { logsByPhase }), - ...((appendTasksFetched && { tasksFetched: true }) || {}), - } as any as WorkflowNodeExecution; - }); -}; - -/** A query for fetching a single `NodeExecution` by id. */ -export function makeNodeExecutionQueryEnhanced( - nodeExecution: WorkflowNodeExecution, - queryClient: QueryClient, -): QueryInput { - const { id } = nodeExecution || {}; - - return { - enabled: !!id, - queryKey: [QueryType.NodeExecutionEnhanced, id], - queryFn: async () => { - // complexity: - // +1 for parent node tasks - // +1 for node execution list - // +n= executionList.length - const parentExecution = cloneDeep(nodeExecution); - const isParent = isParentNode(parentExecution); - const fromUniqueParentId = parentExecution.id.nodeId; - const parentScopeId = - parentExecution.scopedId ?? parentExecution.metadata?.specNodeId; - parentExecution.scopedId = parentScopeId; - const dynamicParentNodeId = isDynamicNode(parentExecution) - ? fromUniqueParentId - : parentExecution.dynamicParentNodeId; - - // if the node is a parent, force refetch its children - // called by NodeExecutionDynamicProvider - const parentNodeExecutions = isParent - ? () => - fetchNodeExecutionList( - // requests listNodeExecutions - queryClient, - id.executionId, - { - params: { - [nodeExecutionQueryParams.parentNodeId]: fromUniqueParentId, - }, - }, - ).then(childExecutions => { - const children = childExecutions.map(e => { - const scopedId = e.metadata?.specNodeId - ? retriesToZero(e?.metadata?.specNodeId) - : retriesToZero(e?.id?.nodeId); - - return { - ...e, - scopedId: `${parentScopeId}-0-${scopedId}`, - fromUniqueParentId, - ...(dynamicParentNodeId ? { dynamicParentNodeId } : {}), - }; - }); - return children; - }) - : () => Promise.resolve([]); - - const parentNodeAndTaskExecutions = await Promise.all([ - getTaskExecutions(queryClient, parentExecution), - parentNodeExecutions(), - ]).then(([parent, children]) => { - // strip closure and metadata to avoid overwriting data from queries that handle status updates - const { - closure: _, - metadata: __, - ...parentLight - } = parent || ({} as WorkflowNodeExecution); - return [parentLight, ...children].filter(n => !!n); - }); - - return parentNodeAndTaskExecutions as NodeExecution[]; - }, - }; -} - -export function makeListTaskExecutionsQuery( - id: NodeExecutionIdentifier, -): QueryInput> { - return { - queryKey: [QueryType.TaskExecutionList, id], - queryFn: () => listTaskExecutions(id), - }; -} - -/** Composable fetch function which wraps `makeNodeExecutionQuery` */ -export function fetchNodeExecution( - queryClient: QueryClient, - id: NodeExecutionIdentifier, -) { - return queryClient.fetchQuery(makeNodeExecutionQuery(id)); -} - -// On successful node execution list queries, extract and store all -// executions so they are individually fetchable from the cache. -function cacheNodeExecutions( - queryClient: QueryClient, - nodeExecutions: NodeExecution[], -) { - nodeExecutions.forEach(ne => - queryClient.setQueryData([QueryType.NodeExecution, ne.id], ne), - ); -} - -/** A query for fetching a list of `NodeExecution`s which are children of a given - * `Execution`. - */ -export function makeNodeExecutionListQuery( - queryClient: QueryClient, - id: WorkflowExecutionIdentifier, - config?: RequestConfig, -): QueryInput { - /** - * Note on scopedId: - * We use scopedId as a key between various UI elements built from static data - * (eg, CompiledWorkflowClosure for the graph) that need to be mapped to runtime - * values like nodeExecutions; rendering from a static entity has no way to know - * the actual retry value so we use '0' for this key -- the actual value of retries - * remains as the nodeId. - */ - return { - queryKey: [QueryType.NodeExecutionList, id, config], - queryFn: async () => { - const promise = (await listNodeExecutions(id, config)).entities; - const nodeExecutions = removeSystemNodes(promise); - nodeExecutions.map(exe => { - if (exe.metadata?.specNodeId) { - return (exe.scopedId = retriesToZero(exe.metadata.specNodeId)); - } else { - return (exe.scopedId = retriesToZero(exe.id.nodeId)); - } - }); - cacheNodeExecutions(queryClient, nodeExecutions); - - return nodeExecutions; - }, - }; -} - -/** Composable fetch function which wraps `makeNodeExecutionListQuery`. */ -export function fetchNodeExecutionList( - queryClient: QueryClient, - id: WorkflowExecutionIdentifier, - config?: RequestConfig, -) { - return queryClient.fetchQuery( - makeNodeExecutionListQuery(queryClient, id, config), - ); -} - -/** A query for fetching a list of `NodeExecution`s which are children of a given - * `TaskExecution`. - */ -export function makeTaskExecutionChildListQuery( - queryClient: QueryClient, - id: TaskExecutionIdentifier, - config?: RequestConfig, -): QueryInput { - return { - queryKey: [QueryType.TaskExecutionChildList, id, config], - queryFn: async () => { - const nodeExecutions = removeSystemNodes( - (await listTaskExecutionChildren(id, config)).entities, - ); - cacheNodeExecutions(queryClient, nodeExecutions); - return nodeExecutions; - }, - onSuccess: nodeExecutions => { - nodeExecutions.forEach(ne => - queryClient.setQueryData([QueryType.NodeExecution, ne.id], ne), - ); - }, - }; -} - -/** Composable fetch function which wraps `makeTaskExecutionChildListQuery`. */ -export function fetchTaskExecutionChildList( - queryClient: QueryClient, - id: TaskExecutionIdentifier, - config?: RequestConfig, -) { - return queryClient.fetchQuery( - makeTaskExecutionChildListQuery(queryClient, id, config), - ); -} - -/** --- Queries for fetching children of a NodeExecution --- */ - -async function fetchGroupForTaskExecution( - queryClient: QueryClient, - taskExecutionId: TaskExecutionIdentifier, - config: RequestConfig, -): Promise { - return { - // NodeExecutions created by a TaskExecution are grouped - // by the retry attempt of the task. - name: formatRetryAttempt(taskExecutionId.retryAttempt), - nodeExecutions: await fetchTaskExecutionChildList( - queryClient, - taskExecutionId, - config, - ), - }; -} - -async function fetchGroupForWorkflowExecution( - queryClient: QueryClient, - executionId: WorkflowExecutionIdentifier, - config: RequestConfig, -): Promise { - return { - // NodeExecutions created by a workflow execution are grouped - // by the execution id, since workflow executions are not retryable. - name: executionId.name, - nodeExecutions: await fetchNodeExecutionList( - queryClient, - executionId, - config, - ), - }; -} - -async function fetchGroupsForTaskExecutionNode( - queryClient: QueryClient, - nodeExecution: NodeExecution, - config: RequestConfig, -): Promise { - const taskExecutions = await fetchTaskExecutionList( - queryClient, - nodeExecution.id, - config, - ); - - // For TaskExecutions marked as parents, fetch its children and create a group. - // Otherwise, return null and we will filter it out later. - const groups = await Promise.all( - taskExecutions.map(execution => - execution.isParent - ? fetchGroupForTaskExecution(queryClient, execution.id, config) - : Promise.resolve(null), - ), - ); - - // Remove any empty groups - return groups.filter( - group => group !== null && group.nodeExecutions.length > 0, - ) as NodeExecutionGroup[]; -} - -async function fetchGroupsForWorkflowExecutionNode( - queryClient: QueryClient, - nodeExecution: NodeExecution, - config: RequestConfig, -): Promise { - if (!nodeExecution.closure.workflowNodeMetadata) { - throw new Error('Unexpected empty `workflowNodeMetadata`'); - } - const { executionId } = nodeExecution.closure.workflowNodeMetadata; - // We can only have one WorkflowExecution (no retries), so there is only - // one group to return. But calling code expects it as an array. - const group = await fetchGroupForWorkflowExecution( - queryClient, - executionId, - config, - ); - return group.nodeExecutions.length > 0 ? [group] : []; -} - -async function fetchGroupsForParentNodeExecution( - queryClient: QueryClient, - nodeExecution: NodeExecution, - config: RequestConfig, -): Promise { - const finalConfig = { - ...config, - params: { - ...config.params, - [nodeExecutionQueryParams.parentNodeId]: nodeExecution.id.nodeId, - }, - }; - - const parentScopeId = - nodeExecution.scopedId ?? nodeExecution.metadata?.specNodeId; - nodeExecution.scopedId = parentScopeId; - - const children = await fetchNodeExecutionList( - queryClient, - nodeExecution.id.executionId, - finalConfig, - ); - - const groupsByName = children.reduce>( - (out, child) => { - const retryAttempt = formatRetryAttempt(child.metadata?.retryGroup); - let group = out.get(retryAttempt); - if (!group) { - group = { name: retryAttempt, nodeExecutions: [] }; - out.set(retryAttempt, group); - } - - /** GraphUX uses workflowClosure which uses scopedId. This builds a scopedId via parent - * nodeExecution to enable mapping between graph and other components */ - let scopedId = parentScopeId; - if (scopedId !== undefined) { - scopedId += `-0-${child.metadata?.specNodeId}`; - child['scopedId'] = scopedId; - } else { - child['scopedId'] = child.metadata?.specNodeId; - } - child['fromUniqueParentId'] = nodeExecution.id.nodeId; - group.nodeExecutions.push(child); - return out; - }, - new Map(), - ); - - return Array.from(groupsByName.values()); -} - -export function fetchChildNodeExecutionGroups( - queryClient: QueryClient, - nodeExecution: NodeExecution, - config: RequestConfig, -) { - const { workflowNodeMetadata } = nodeExecution.closure; - // Newer NodeExecution structures can directly indicate their parent - // status and have their children fetched in bulk. - if (isParentNode(nodeExecution)) { - return fetchGroupsForParentNodeExecution( - queryClient, - nodeExecution, - config, - ); - } - // Otherwise, we need to determine the type of the node and - // recursively fetch NodeExecutions for the corresponding Workflow - // or Task executions. - if ( - workflowNodeMetadata && - !isEqual(workflowNodeMetadata.executionId, nodeExecution.id.executionId) && - !isEqual(nodeExecution.metadata?.specNodeId, nodeExecution.scopedId) - ) { - return fetchGroupsForWorkflowExecutionNode( - queryClient, - nodeExecution, - config, - ); - } - return fetchGroupsForTaskExecutionNode(queryClient, nodeExecution, config); -} diff --git a/packages/console/src/components/Executions/taskExecutionQueries.ts b/packages/console/src/components/Executions/taskExecutionQueries.ts deleted file mode 100644 index 3869c04ad..000000000 --- a/packages/console/src/components/Executions/taskExecutionQueries.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { QueryInput, QueryType } from 'components/data/types'; -import { RequestConfig } from 'models/AdminEntity/types'; -import { getTaskExecution, listTaskExecutions } from 'models/Execution/api'; -import { - NodeExecutionIdentifier, - TaskExecution, - TaskExecutionIdentifier, -} from 'models/Execution/types'; -import { QueryClient } from 'react-query'; - -/** A query for fetching a single `TaskExecution` by id. */ -export function makeTaskExecutionQuery( - id: TaskExecutionIdentifier, -): QueryInput { - return { - queryKey: [QueryType.TaskExecution, id], - queryFn: () => getTaskExecution(id), - }; -} - -// On successful task execution list queries, extract and store all -// executions so they are individually fetchable from the cache. -function cacheTaskExecutions( - queryClient: QueryClient, - taskExecutions: TaskExecution[], -) { - taskExecutions.forEach(te => - queryClient.setQueryData([QueryType.TaskExecution, te.id], te), - ); -} - -/** A query for fetching a list of `TaskExecution`s which are children of a given - * `NodeExecution`. - */ -export function makeTaskExecutionListQuery( - queryClient: QueryClient, - id: NodeExecutionIdentifier, - config?: RequestConfig, -): QueryInput { - return { - queryKey: [QueryType.TaskExecutionList, id, config], - queryFn: async () => { - const taskExecutions = (await listTaskExecutions(id, config)).entities; - cacheTaskExecutions(queryClient, taskExecutions); - return taskExecutions; - }, - }; -} - -/** Composable fetch function which wraps `makeTaskExecutionListQuery` */ -export function fetchTaskExecutionList( - queryClient: QueryClient, - id: NodeExecutionIdentifier, - config?: RequestConfig, -) { - return queryClient.fetchQuery( - makeTaskExecutionListQuery(queryClient, id, config), - ); -} diff --git a/packages/console/src/components/Executions/useExecutionMetrics.tsx b/packages/console/src/components/Executions/useExecutionMetrics.tsx deleted file mode 100644 index 4c1cfb93c..000000000 --- a/packages/console/src/components/Executions/useExecutionMetrics.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { Admin } from '@flyteorg/flyteidl-types'; -import { APIContextValue, useAPIContext } from 'components/data/apiContext'; -import { useFetchableData } from 'components/hooks/useFetchableData'; -import { WorkflowExecutionIdentifier } from 'models'; - -export const fetchExecutionMetrics = async ( - id: WorkflowExecutionIdentifier, - depth: number, - apiContext: APIContextValue, -) => { - const { getExecutionMetrics } = apiContext; - const metrics = await getExecutionMetrics(id, { - params: { - depth, - }, - }); - return metrics; -}; - -export function useExecutionMetrics( - id: WorkflowExecutionIdentifier, - depth = 0, -) { - const apiContext = useAPIContext(); - - return useFetchableData< - Admin.WorkflowExecutionGetMetricsResponse, - WorkflowExecutionIdentifier - >( - { - debugName: 'ExecutionMetrics', - defaultValue: [] as Admin.WorkflowExecutionGetMetricsResponse, - doFetch: id => fetchExecutionMetrics(id, depth, apiContext), - }, - id, - ); -} diff --git a/packages/console/src/components/Executions/useTaskExecutions.ts b/packages/console/src/components/Executions/useTaskExecutions.ts deleted file mode 100644 index d6fad401e..000000000 --- a/packages/console/src/components/Executions/useTaskExecutions.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { APIContextValue, useAPIContext } from 'components/data/apiContext'; -import { useDataRefresher } from 'components/hooks/useDataRefresher'; -import { every } from 'lodash'; -import { limits } from 'models/AdminEntity/constants'; -import { SortDirection } from 'models/AdminEntity/types'; -import { - ExecutionData, - NodeExecution, - NodeExecutionIdentifier, - TaskExecution, - TaskExecutionIdentifier, -} from 'models/Execution/types'; -import { taskSortFields } from 'models/Task/constants'; -import { FetchableData } from '../hooks/types'; -import { useFetchableData } from '../hooks/useFetchableData'; -import { executionRefreshIntervalMs } from './constants'; -import { nodeExecutionIsTerminal, taskExecutionIsTerminal } from './utils'; - -/** Fetches a list of `TaskExecution`s which are children of the given `NodeExecution`. - * This function is meant to be consumed by hooks which are composing data. - * If you're calling it from a component, consider using `useTaskExecutions` instead. - */ -export const fetchTaskExecutions = async ( - id: NodeExecutionIdentifier, - apiContext: APIContextValue, -) => { - const { listTaskExecutions } = apiContext; - const { entities } = await listTaskExecutions(id, { - limit: limits.NONE, - sort: { - key: taskSortFields.createdAt, - direction: SortDirection.ASCENDING, - }, - }); - return entities; -}; - -/** A hook for fetching the list of TaskExecutions associated with a - * NodeExecution - */ -export function useTaskExecutions( - id: NodeExecutionIdentifier, -): FetchableData { - const apiContext = useAPIContext(); - return useFetchableData( - { - debugName: 'TaskExecutions', - defaultValue: [], - doFetch: async (id: NodeExecutionIdentifier) => - fetchTaskExecutions(id, apiContext), - }, - id, - ); -} - -/** Fetches the signed URLs for TaskExecution data (inputs/outputs) */ -export function useTaskExecutionData( - id: TaskExecutionIdentifier, -): FetchableData { - const { getTaskExecutionData } = useAPIContext(); - return useFetchableData( - { - debugName: 'TaskExecutionData', - defaultValue: {} as ExecutionData, - doFetch: id => getTaskExecutionData(id), - }, - id, - ); -} - -/** Wraps the result of `useTaskExecutions` and will refresh the data as long - * as the given `NodeExecution` is still in a non-final state. - */ -export function useTaskExecutionsRefresher( - nodeExecution: NodeExecution, - taskExecutionsFetchable: ReturnType, -) { - return useDataRefresher(nodeExecution.id, taskExecutionsFetchable, { - interval: executionRefreshIntervalMs, - valueIsFinal: taskExecutions => - every(taskExecutions, taskExecutionIsTerminal) && - nodeExecutionIsTerminal(nodeExecution), - }); -} diff --git a/packages/console/src/components/Executions/workflowExecutionQueries.ts b/packages/console/src/components/Executions/workflowExecutionQueries.ts deleted file mode 100644 index 575483851..000000000 --- a/packages/console/src/components/Executions/workflowExecutionQueries.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createPaginationQuery } from 'components/data/queryUtils'; -import { InfiniteQueryInput, QueryType } from 'components/data/types'; -import { RequestConfig } from 'models/AdminEntity/types'; -import { DomainIdentifierScope } from 'models/Common/types'; -import { listExecutions } from 'models/Execution/api'; -import { Execution } from 'models/Execution/types'; - -/** A query for fetching a list of workflow executions belonging to a project/domain */ -export function makeWorkflowExecutionListQuery( - { domain, project }: DomainIdentifierScope, - config?: RequestConfig, -): InfiniteQueryInput { - return createPaginationQuery({ - queryKey: [QueryType.WorkflowExecutionList, { domain, project }, config], - queryFn: async ({ pageParam }) => { - const finalConfig = pageParam ? { ...config, token: pageParam } : config; - const { entities: data, token } = await listExecutions( - { domain, project }, - finalConfig, - ); - return { data, token }; - }, - }); -} diff --git a/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/DatetimeInput.tsx b/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/DatetimeInput.tsx deleted file mode 100644 index a77da19fd..000000000 --- a/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/DatetimeInput.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import * as momentUtils from '@date-io/moment'; -import { - KeyboardDateTimePicker, - MuiPickersUtilsProvider, -} from '@material-ui/pickers'; -// Flyte dates are specified in UTC -import { Moment, utc as moment } from 'moment'; -import React, { FC } from 'react'; -import { InputProps } from '../types'; -import { getLaunchInputId } from '../utils'; - -const momentDateUtils = momentUtils.default ? momentUtils.default : momentUtils; - -/** A form field for selecting a date/time from a picker or entering it via - * keyboard. - */ -export const DatetimeInput: FC = props => { - const { error, label, name, onChange, value: propValue } = props; - const hasError = !!error; - const helperText = hasError ? error : props.helperText; - const value = - typeof propValue === 'string' && propValue.length > 0 ? propValue : null; - - const handleChange = ( - dateValue: Moment | null, - stringValue?: string | null, - ) => { - if (dateValue && dateValue.isValid()) { - onChange(dateValue.toISOString()); - } else if (stringValue != null) { - onChange(stringValue); - } else { - onChange(''); - } - }; - return ( - - - - ); -}; diff --git a/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/EnumInput.tsx b/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/EnumInput.tsx deleted file mode 100644 index f196accf2..000000000 --- a/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/EnumInput.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React, { ChangeEvent, FC } from 'react'; -import { FormControl, InputLabel, MenuItem, Select } from '@material-ui/core'; -import { makeStyles } from '@material-ui/core/styles'; -import { InputProps } from '../types'; -import { getLaunchInputId } from '../utils'; - -const useStyles = makeStyles(() => ({ - formControl: { - minWidth: '100%', - }, -})); - -/** Handles rendering of the input component for any primitive-type input */ -export const EnumInput: FC = props => { - const { - label, - name, - onChange, - typeDefinition: { literalType }, - value, - error, - } = props; - const classes = useStyles(); - - const handleEnumChange = (event: ChangeEvent<{ value: unknown }>) => { - onChange(event.target.value as string); - }; - - const inputId = getLaunchInputId(name); - const labelId = `${inputId}-label`; - return ( - - {label} - - - ); -}; diff --git a/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/SearchableSelector.tsx b/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/SearchableSelector.tsx deleted file mode 100644 index 2fcc38c85..000000000 --- a/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/SearchableSelector.tsx +++ /dev/null @@ -1,303 +0,0 @@ -import React, { ChangeEvent, FC, useState, MouseEvent, useRef } from 'react'; -import { - IconButton, - InputAdornment, - MenuItem, - Paper, - TextField, -} from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import ExpandLess from '@material-ui/icons/ExpandLess'; -import ExpandMore from '@material-ui/icons/ExpandMore'; -import { escapeKeyListener } from 'components/common/keyboardEvents'; -import { useCommonStyles } from 'components/common/styles'; -import { isLoadingState } from 'components/hooks/fetchMachine'; -import { FetchableData, FetchFn } from 'components/hooks/types'; -import { useDebouncedValue } from 'components/hooks/useDebouncedValue'; -import { useFetchableData } from 'components/hooks/useFetchableData'; -import reactLoadingSkeleton from 'react-loading-skeleton'; - -const Skeleton = reactLoadingSkeleton; - -const minimumQuerySize = 3; -const searchDebounceTimeMs = 500; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - flexGrow: 1, - position: 'relative', - display: 'inline-block', - marginBottom: theme.spacing(1), - }, - menuItem: { - display: 'flex', - justifyContent: 'space-between', - }, - placeholderResult: { - display: 'flex', - justifyContent: 'center', - pointerEvents: 'none', - }, - paper: { - border: `1px solid ${theme.palette.divider}`, - left: 0, - marginTop: theme.spacing(0.5), - position: 'absolute', - right: 0, - zIndex: theme.zIndex.tooltip, - }, - selectedItem: { - fontWeight: 'bold', - }, -})); - -export interface SearchableSelectorOption { - id: string; - data: DataType; - name: string; - description?: string; -} - -export interface SearchableSelectorProps { - id?: string; - label: string; - options: SearchableSelectorOption[]; - selectedItem?: SearchableSelectorOption; - fetchSearchResults?: FetchFn[], string>; - onSelectionChanged(newSelection: SearchableSelectorOption): void; -} - -interface SearchableSelectorState { - isExpanded: boolean; - items: SearchableSelectorOption[]; - searchResults: FetchableData[]>; - selectedItem?: SearchableSelectorOption; - showList: boolean; - inputValue: string; - onBlur(): void; - onChange(event: ChangeEvent): void; - onFocus(): void; - selectItem(item: SearchableSelectorOption): void; - setIsExpanded(expanded: boolean): void; -} - -function generateDefaultFetch( - options: SearchableSelectorOption[], -): FetchFn[], string> { - return (query: string) => - Promise.resolve(options.filter(option => option.name.includes(query))); -} - -function useSearchableSelectorState({ - fetchSearchResults, - options, - selectedItem, - onSelectionChanged, -}: SearchableSelectorProps): SearchableSelectorState { - const fetchResults = fetchSearchResults || generateDefaultFetch(options); - const [hasReceivedInput, setHasReceivedInput] = useState(false); - const [rawSearchValue, setSearchValue] = useState(''); - const debouncedSearchValue = useDebouncedValue( - rawSearchValue, - searchDebounceTimeMs, - ); - - const [isExpanded, setIsExpanded] = useState(false); - const [focused, setFocused] = useState(false); - const minimumQueryMet = - hasReceivedInput && debouncedSearchValue.length > minimumQuerySize; - - const searchResults = useFetchableData< - SearchableSelectorOption[], - string - >( - { - defaultValue: [], - autoFetch: minimumQueryMet, - debugName: 'SearchableSelector Search', - doFetch: fetchResults, - }, - debouncedSearchValue, - ); - const items = focused ? searchResults.value : options; - - let inputValue = ''; - if (focused && hasReceivedInput) { - inputValue = rawSearchValue; - } else if (selectedItem) { - inputValue = selectedItem.name; - } - - const onBlur = () => { - setFocused(false); - }; - - const onFocus = () => { - setIsExpanded(false); - setHasReceivedInput(false); - setSearchValue(''); - setFocused(true); - }; - - const onChange = ({ target: { value } }: ChangeEvent) => { - setHasReceivedInput(true); - setSearchValue(value); - }; - - const selectItem = (item: SearchableSelectorOption) => { - onSelectionChanged(item); - setFocused(false); - setIsExpanded(false); - }; - - const showSearchResults = - searchResults.value.length && focused && minimumQueryMet; - const showList = showSearchResults || isExpanded; - - return { - inputValue, - isExpanded, - items, - onBlur, - onChange, - onFocus, - searchResults, - selectItem, - selectedItem, - setIsExpanded, - showList, - }; -} - -const preventBubble = (event: MouseEvent) => { - event.preventDefault(); -}; - -const NoResultsContent: FC = () => ( - - No results found. - -); - -const LoadingContent: FC = () => ( - -
- -
-
-); - -const SearchableSelectorItems = ({ - items, - selectItem, - selectedItem, - searchResults, -}: SearchableSelectorState) => { - const styles = useStyles(); - const commonStyles = useCommonStyles(); - if (isLoadingState(searchResults.state)) { - return ; - } - if (items.length === 0) { - return ; - } - return ( - <> - {items.map(item => { - const onClick = () => selectItem(item); - const selected = selectedItem && selectedItem.id === item.id; - return ( - - - {item.name} - - {item.description} - - ); - })} - - ); -}; - -/** Combines a dropdown selector of default options with a searchable text input - * that will fetch results using a provided function. - */ -export const SearchableSelector = ( - props: SearchableSelectorProps, -) => { - const styles = useStyles(); - const state = useSearchableSelectorState(props); - const { inputValue, isExpanded, onBlur, onChange, setIsExpanded, showList } = - state; - const inputRef = useRef(); - - const blurInput = () => { - if (inputRef.current) { - inputRef.current.blur(); - } - }; - - const onFocus = () => { - state.onFocus(); - // Select existing text on focus, using the next event loop to allow - // event handler to finish correctly. - setTimeout(() => { - if (inputRef.current) { - inputRef.current.select(); - } - }, 0); - }; - - const selectItem = (item: SearchableSelectorOption) => { - state.selectItem(item); - blurInput(); - }; - - const handleClickShowOptions = () => { - blurInput(); - setIsExpanded(!isExpanded); - }; - - return ( -
- - - {isExpanded ? : } - - - ), - }} - label={props.label} - onChange={onChange} - value={inputValue} - variant="outlined" - /> - {showList ? ( - - - - ) : null} -
- ); -}; diff --git a/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/StyledCard.tsx b/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/StyledCard.tsx deleted file mode 100644 index 88cf6eeb4..000000000 --- a/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/StyledCard.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { - Card, - CardContent, - FormHelperText, - Typography, - styled, -} from '@material-ui/core'; -import React, { FC } from 'react'; - -export const StyledCardContainer = styled(Card)(({ theme }) => ({ - position: 'relative', - overflow: 'visible', - border: `1px solid ${theme.palette.grey[300]}`, - boxShadow: 'none', - - '&.error': { - border: '1px solid red', - '& .inlineTitle': { - color: 'red', - }, - }, - - '& .inlineTitle': { - position: 'absolute', - top: '-8px', - left: '10px', - color: 'gray', - background: 'white', - fontSize: '10.5px', - padding: '0 4px', - }, -})); - -export interface StyledCardProps { - error?: string; - label: string; -} -export const StyledCard: FC = ({ error, label, children }) => { - return label ? ( - - - - {label} - - - {children} - - {error} - - ) : ( -
- {children} - {error} -
- ); -}; diff --git a/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/index.ts b/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/index.ts deleted file mode 100644 index 38da5af63..000000000 --- a/packages/console/src/components/Launch/LaunchForm/LaunchFormComponents/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export * from './BooleanInput'; -export * from './BlobInput'; -export * from './SimpleInput'; -export * from './CollectionInput'; -export * from './DatetimeInput'; -export * from './EnumInput'; -export * from './LaunchFormAdvancedInputs'; -export * from './NoneInput'; -export * from './StructInput'; -export * from './UnionInput'; -export * from './UnsupportedInput'; -export * from './getComponentForInput'; diff --git a/packages/console/src/components/Launch/LaunchForm/LaunchFormHeader.tsx b/packages/console/src/components/Launch/LaunchForm/LaunchFormHeader.tsx deleted file mode 100644 index fd40b8773..000000000 --- a/packages/console/src/components/Launch/LaunchForm/LaunchFormHeader.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { DialogTitle, Typography } from '@material-ui/core'; -import * as React from 'react'; -import { useStyles } from './styles'; - -interface LaunchFormHeaderProps { - title?: string; - formTitle: string; -} - -/** Shared header component for the Launch form */ -export const LaunchFormHeader: React.FC = ({ - title = '', - formTitle, -}) => { - const styles = useStyles(); - return ( - -
{formTitle}
- {title} -
- ); -}; diff --git a/packages/console/src/components/Launch/LaunchForm/NoInputsNeeded.tsx b/packages/console/src/components/Launch/LaunchForm/NoInputsNeeded.tsx deleted file mode 100644 index c80302fb3..000000000 --- a/packages/console/src/components/Launch/LaunchForm/NoInputsNeeded.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import * as React from 'react'; -import { workflowNoInputsString } from './constants'; -import t from './strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - root: { - marginBottom: theme.spacing(1), - marginTop: theme.spacing(1), - }, -})); - -export interface NoInputsProps { - variant: 'workflow' | 'task'; -} -/** An informational message to be shown if a Workflow or Task does not need any - * input values. - */ -export const NoInputsNeeded: React.FC = ({ variant }) => { - const commonStyles = useCommonStyles(); - return ( - - {variant === 'workflow' - ? workflowNoInputsString - : t('taskNoInputsString')} - - ); -}; diff --git a/packages/console/src/components/Launch/LaunchForm/UnsupportedRequiredInputsError.tsx b/packages/console/src/components/Launch/LaunchForm/UnsupportedRequiredInputsError.tsx deleted file mode 100644 index a135be6b3..000000000 --- a/packages/console/src/components/Launch/LaunchForm/UnsupportedRequiredInputsError.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import ErrorOutline from '@material-ui/icons/ErrorOutline'; -import { NonIdealState } from 'components/common/NonIdealState'; -import { useCommonStyles } from 'components/common/styles'; -import t from './strings'; -import { ParsedInput } from './types'; - -const useStyles = makeStyles((theme: Theme) => ({ - contentContainer: { - whiteSpace: 'pre-line', - textAlign: 'left', - }, - errorContainer: { - marginBottom: theme.spacing(2), - }, -})); - -function formatLabel(label: string) { - return label.endsWith(t('requiredInputSuffix')) - ? label.substring(0, label.length - 1) - : label; -} - -export interface UnsupportedRequiredInputsErrorProps { - inputs: ParsedInput[]; - variant: 'workflow' | 'task'; -} -/** An informational error to be shown if a Workflow cannot be launch due to - * required inputs for which we will not be able to provide a value. - */ -export const UnsupportedRequiredInputsError: React.FC< - UnsupportedRequiredInputsErrorProps -> = ({ inputs, variant }) => { - const styles = useStyles(); - const commonStyles = useCommonStyles(); - const [titleString, errorString] = - variant === 'workflow' - ? [ - t('cannotLaunchWorkflowString'), - t('workflowUnsupportedRequiredInputsString'), - ] - : [t('cannotLaunchTaskString'), t('taskUnsupportedRequiredInputsString')]; - return ( - -
-

{errorString}

-
    - {inputs.map(input => ( -
  • - {formatLabel(input.label)} -
  • - ))} -
-
-
- ); -}; diff --git a/packages/console/src/components/Launch/LaunchForm/__mocks__/mockInputs.ts b/packages/console/src/components/Launch/LaunchForm/__mocks__/mockInputs.ts deleted file mode 100644 index b076322d2..000000000 --- a/packages/console/src/components/Launch/LaunchForm/__mocks__/mockInputs.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { dateToTimestamp, millisecondsToDuration } from 'common/utils'; -import { Core } from '@flyteorg/flyteidl-types'; -import { cloneDeep, mapValues } from 'lodash'; -import Long from 'long'; -import { - BlobDimensionality, - SimpleType, - TypedInterface, - Variable, -} from 'models/Common/types'; -import { literalNone } from '../inputHelpers/constants'; -import { primitiveLiteral } from './utils'; - -function simpleType(primitiveType: SimpleType, description?: string): Variable { - return { - description, - type: { - simple: primitiveType, - }, - }; -} - -const validDateString = '2019-01-10T00:00:00.000Z'; // Dec 1, 2019 - -export type SimpleVariableKey = - | 'simpleString' - | 'stringNoLabel' - | 'simpleInteger' - | 'simpleFloat' - | 'simpleBoolean' - | 'simpleBlob' - | 'simpleDuration' - | 'simpleDatetime' - | 'simpleBinary' - | 'simpleError' - | 'simpleStruct'; - -export const mockSimpleVariables: Record = { - simpleString: simpleType(SimpleType.STRING, 'a simple string value'), - stringNoLabel: simpleType(SimpleType.STRING), - simpleInteger: simpleType(SimpleType.INTEGER, 'a simple integer value'), - simpleFloat: simpleType(SimpleType.FLOAT, 'a simple floating point value'), - simpleBoolean: simpleType(SimpleType.BOOLEAN, 'a simple boolean value'), - simpleDuration: simpleType(SimpleType.DURATION, 'a simple duration value'), - simpleDatetime: simpleType(SimpleType.DATETIME, 'a simple datetime value'), - simpleBinary: simpleType(SimpleType.BINARY, 'a simple binary value'), - simpleError: simpleType(SimpleType.ERROR, 'a simple error value'), - simpleStruct: simpleType(SimpleType.STRUCT, 'a simple struct value'), - simpleBlob: { - description: 'a simple single-dimensional blob', - type: { blob: { dimensionality: BlobDimensionality.SINGLE } }, - }, - // schema: {}, - // collection: {}, - // mapValue: {} -}; - -export const simpleVariableDefaults: Record = - { - simpleString: primitiveLiteral({ stringValue: 'abcdefg' }), - stringNoLabel: primitiveLiteral({ stringValue: 'abcdefg' }), - simpleBinary: literalNone(), - simpleBoolean: primitiveLiteral({ boolean: false }), - simpleDatetime: primitiveLiteral({ - datetime: dateToTimestamp(new Date(validDateString)), - }), - simpleDuration: primitiveLiteral({ - duration: millisecondsToDuration(10000), - }), - simpleError: literalNone(), - simpleFloat: primitiveLiteral({ floatValue: 1.5 }), - simpleInteger: primitiveLiteral({ integer: Long.fromNumber(12345) }), - simpleStruct: literalNone(), - simpleBlob: { - scalar: { - blob: { - uri: 's3://someBlobUri/goesHere', - metadata: { - type: { - format: 'csv', - dimensionality: BlobDimensionality.SINGLE, - }, - }, - }, - }, - }, - }; - -export const mockCollectionVariables: Record = mapValues( - mockSimpleVariables, - v => ({ - description: `A collection of: ${v.description}`, - type: { collectionType: v.type }, - }), -); - -export const mockNestedCollectionVariables: Record = - mapValues(mockCollectionVariables, v => ({ - description: `${v.description} (nested)`, - type: { collectionType: v.type }, - })); - -export function createMockInputsInterface( - variables: Record, -): TypedInterface { - return { - inputs: { - variables: cloneDeep(variables), - }, - }; -} diff --git a/packages/console/src/components/Launch/LaunchForm/index.ts b/packages/console/src/components/Launch/LaunchForm/index.ts deleted file mode 100644 index 04bca77e0..000000000 --- a/packages/console/src/components/Launch/LaunchForm/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './utils'; diff --git a/packages/console/src/components/Launch/LaunchForm/styles.ts b/packages/console/src/components/Launch/LaunchForm/styles.ts deleted file mode 100644 index f3318018e..000000000 --- a/packages/console/src/components/Launch/LaunchForm/styles.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Theme } from '@material-ui/core'; -import { makeStyles } from '@material-ui/styles'; -import { - interactiveTextColor, - smallFontSize, -} from 'components/Theme/constants'; - -export const useStyles = makeStyles((theme: Theme) => ({ - footer: { - padding: theme.spacing(2), - }, - formControl: { - padding: `${theme.spacing(1.5)}px 0`, - }, - header: { - padding: theme.spacing(2), - width: '100%', - }, - inputsSection: { - padding: theme.spacing(2), - maxHeight: theme.spacing(90), - }, - inputLabel: { - color: theme.palette.text.hint, - fontSize: smallFontSize, - }, - root: { - display: 'flex', - flexDirection: 'column', - width: '100%', - }, - sectionHeader: { - marginBottom: theme.spacing(1), - marginTop: theme.spacing(1), - }, - advancedOptions: { - color: interactiveTextColor, - justifyContent: 'flex-end', - }, - viewNodeInputs: { - color: interactiveTextColor, - }, - noBorder: { - '&:before': { - height: 0, - }, - }, - summaryWrapper: { - padding: 0, - }, - detailsWrapper: { - paddingLeft: 0, - paddingRight: 0, - flexDirection: 'column', - '& section': { - flex: 1, - }, - }, - collapsibleSection: { - margin: 0, - }, -})); diff --git a/packages/console/src/components/Launch/LaunchForm/test/utils.ts b/packages/console/src/components/Launch/LaunchForm/test/utils.ts deleted file mode 100644 index 349e48953..000000000 --- a/packages/console/src/components/Launch/LaunchForm/test/utils.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { mapValues } from 'lodash'; -import { Variable } from 'models/Common/types'; -import { createMockLaunchPlan } from 'models/__mocks__/launchPlanData'; -import { - createMockTask, - createMockTaskVersions, -} from 'models/__mocks__/taskData'; -import { - createMockWorkflow, - createMockWorkflowVersions, -} from 'models/__mocks__/workflowData'; - -export function createMockObjects(variables: Record) { - const mockWorkflow = createMockWorkflow('MyWorkflow'); - const mockTask = createMockTask('MyTask'); - - const mockWorkflowVersions = createMockWorkflowVersions( - mockWorkflow.id.name, - 10, - ); - - const mockTaskVersions = createMockTaskVersions(mockTask.id.name, 10); - - const mockLaunchPlans = [mockWorkflow.id.name, 'OtherLaunchPlan'].map( - name => { - const parameterMap = { - parameters: mapValues(variables, v => ({ var: v })), - }; - const launchPlan = createMockLaunchPlan(name, mockWorkflow.id.version); - launchPlan.closure!.expectedInputs = parameterMap; - return launchPlan; - }, - ); - return { - mockWorkflow, - mockLaunchPlans, - mockTask, - mockTaskVersions, - mockWorkflowVersions, - }; -} diff --git a/packages/console/src/components/Launch/index.ts b/packages/console/src/components/Launch/index.ts deleted file mode 100644 index 4169a1fc9..000000000 --- a/packages/console/src/components/Launch/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './LaunchForm'; diff --git a/packages/console/src/components/LaunchPlan/SearchableLaunchPlanNameList.tsx b/packages/console/src/components/LaunchPlan/SearchableLaunchPlanNameList.tsx deleted file mode 100644 index 0e0c7e774..000000000 --- a/packages/console/src/components/LaunchPlan/SearchableLaunchPlanNameList.tsx +++ /dev/null @@ -1,174 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import classNames from 'classnames'; -import { useNamedEntityListStyles } from 'components/common/SearchableNamedEntityList'; -import { useCommonStyles } from 'components/common/styles'; -import { - separatorColor, - primaryTextColor, - launchPlanLabelColor, -} from 'components/Theme/constants'; -import { Link } from 'react-router-dom'; -import { Routes } from 'routes/routes'; -import { debounce } from 'lodash'; -import { FormGroup } from '@material-ui/core'; -import { ResourceType } from 'models/Common/types'; -import { MuiLaunchPlanIcon } from '@flyteorg/ui-atoms'; -import { LaunchPlanListStructureItem } from './types'; -import { SearchableInput } from '../common/SearchableList'; -import { useSearchableListState } from '../common/useSearchableListState'; -import t, { patternKey } from '../Entities/strings'; -import { entityStrings } from '../Entities/constants'; - -interface SearchableLaunchPlanNameItemProps { - item: LaunchPlanListStructureItem; -} - -interface SearchableLaunchPlanNameListProps { - launchPlans: LaunchPlanListStructureItem[]; -} - -export const showOnHoverClass = 'showOnHover'; - -const useStyles = makeStyles((theme: Theme) => ({ - filterGroup: { - display: 'flex', - flexWrap: 'nowrap', - flexDirection: 'row', - margin: theme.spacing(2, 5, 0, 2), - }, - itemContainer: { - padding: theme.spacing(3, 3), - border: 'none', - borderTop: `1px solid ${separatorColor}`, - display: 'flex', - flexDirection: 'column', - alignItems: 'flex-start', - position: 'relative', - // All children using the showOnHover class will be hidden until - // the mouse enters the container - [`& .${showOnHoverClass}`]: { - opacity: 0, - }, - [`&:hover .${showOnHoverClass}`]: { - opacity: 1, - }, - }, - itemName: { - display: 'flex', - fontWeight: 600, - color: primaryTextColor, - alignItems: 'center', - }, - itemIcon: { - marginRight: theme.spacing(2), - color: '#636379', - }, - itemRow: { - display: 'flex', - marginBottom: theme.spacing(1), - '&:last-child': { - marginBottom: 0, - }, - alignItems: 'center', - width: '100%', - }, - itemLabel: { - width: 140, - fontSize: 14, - color: launchPlanLabelColor, - }, - searchInputContainer: { - padding: 0, - }, - svgIcon: { - marginRight: theme.spacing(2), - }, -})); - -/** - * Renders individual searchable launchPlan item - * @param item - * @returns - */ -const SearchableLaunchPlanNameItem: React.FC = - React.memo(({ item }) => { - const commonStyles = useCommonStyles(); - const listStyles = useNamedEntityListStyles(); - const styles = useStyles(); - const { id } = item; - - return ( - -
-
- -
{id.name}
-
-
- - ); - }); - -/** - * Renders a searchable list of LaunchPlan names, with associated descriptions - * @param launchPlans - * @constructor - */ -export const SearchableLaunchPlanNameList: React.FC< - SearchableLaunchPlanNameListProps -> = ({ launchPlans }) => { - const styles = useStyles(); - const [search, setSearch] = useState(''); - const { results, setSearchString } = useSearchableListState({ - items: launchPlans, - propertyGetter: ({ id }) => id.name, - }); - - useEffect(() => { - const debouncedSearch = debounce(() => setSearchString(search), 1000); - debouncedSearch(); - }, [search]); - - const onSearchChange = (event: React.ChangeEvent) => { - const searchString = event.target.value; - setSearch(searchString); - }; - - const onClear = () => setSearch(''); - - return ( - <> - - - -
- {results.map(({ value }) => ( - - ))} -
- - ); -}; diff --git a/packages/console/src/components/LaunchPlan/launchPlanQueries.ts b/packages/console/src/components/LaunchPlan/launchPlanQueries.ts deleted file mode 100644 index 4b44aae20..000000000 --- a/packages/console/src/components/LaunchPlan/launchPlanQueries.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { QueryInput, QueryType } from 'components/data/types'; -import { getLaunchPlan } from 'models/Launch/api'; -import { LaunchPlan, LaunchPlanId } from 'models/Launch/types'; -import { QueryClient } from 'react-query'; - -export function makeLaunchPlanQuery( - queryClient: QueryClient, - id: LaunchPlanId, -): QueryInput { - return { - queryKey: [QueryType.LaunchPlan, id], - queryFn: async () => { - const launchPlan = await getLaunchPlan(id); - - return launchPlan; - }, - // `LaunchPlan` objects (individual versions) are immutable and safe to - // cache indefinitely once retrieved in full - staleTime: Infinity, - }; -} - -export async function fetchLaunchPlan( - queryClient: QueryClient, - id: LaunchPlanId, -) { - return queryClient.fetchQuery(makeLaunchPlanQuery(queryClient, id)); -} diff --git a/packages/console/src/components/LaunchPlan/types.ts b/packages/console/src/components/LaunchPlan/types.ts deleted file mode 100644 index a18b54f4b..000000000 --- a/packages/console/src/components/LaunchPlan/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NamedEntityIdentifier } from 'models/Common/types'; -import { NamedEntityState } from 'models/enums'; - -export type LaunchPlanListStructureItem = { - id: NamedEntityIdentifier; - description: string; - state: NamedEntityState; -}; diff --git a/packages/console/src/components/LaunchPlan/useLaunchPlanInfoList.ts b/packages/console/src/components/LaunchPlan/useLaunchPlanInfoList.ts deleted file mode 100644 index 74850f612..000000000 --- a/packages/console/src/components/LaunchPlan/useLaunchPlanInfoList.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { DomainIdentifierScope, ResourceType } from 'models/Common/types'; -import { RequestConfig } from 'models/AdminEntity/types'; -import { usePagination } from 'components/hooks/usePagination'; -import { useAPIContext } from 'components/data/apiContext'; -import { LaunchPlanListStructureItem } from './types'; - -export const useLaunchPlanInfoList = ( - scope: DomainIdentifierScope, - config?: RequestConfig, -) => { - const { listNamedEntities } = useAPIContext(); - - return usePagination( - { ...config, fetchArg: scope }, - async (scope, requestConfig) => { - const { entities, ...rest } = await listNamedEntities( - { ...scope, resourceType: ResourceType.LAUNCH_PLAN }, - requestConfig, - ); - - return { - entities: entities.map(({ id, metadata: { description, state } }) => ({ - id, - description, - state, - })), - ...rest, - }; - }, - ); -}; diff --git a/packages/console/src/components/Literals/styles.ts b/packages/console/src/components/Literals/styles.ts deleted file mode 100644 index f8a13ddc6..000000000 --- a/packages/console/src/components/Literals/styles.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core/styles'; - -export const useLiteralStyles = makeStyles((theme: Theme) => ({ - nestedContainer: { - marginLeft: theme.spacing(1), - }, - labelValueContainer: { - display: 'flex', - flexDirection: 'row', - }, - valueLabel: { - color: theme.palette.grey[500], - marginRight: theme.spacing(1), - }, -})); diff --git a/packages/console/src/components/Literals/test/helpers/genScalarStructuredDsCase.mock.ts b/packages/console/src/components/Literals/test/helpers/genScalarStructuredDsCase.mock.ts deleted file mode 100644 index 928bb4cff..000000000 --- a/packages/console/src/components/Literals/test/helpers/genScalarStructuredDsCase.mock.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { Core } from '@flyteorg/flyteidl-types'; -import { TestCaseList } from '../types'; -import { processSimpleType, columnTypeToString } from '../../helpers'; - -import { simple } from './mock_simpleTypes'; - -const generateColumnEntry = (columnName: string, literalType) => { - return { - name: columnName, - literalType, - }; -}; - -const generateStructuredDataset = ( - columnName: string, - uri: string, - literalType, -) => { - return { - uri, - metadata: { - structuredDatasetType: { - format: 'parquet', - columns: [generateColumnEntry(columnName, literalType)], - }, - }, - }; -}; - -const sasWithMapValueTypeColumns: TestCaseList = - Object.keys(simple) - .map((simpleTypeKey, index) => { - const simpleType = simple[simpleTypeKey]; - - const literalType = { - mapValueType: { - ...simpleType, - }, - type: 'mapValueType', - }; - - const name = `column_name_${index}`; - const columns = []; - columns[name] = `map value of ${processSimpleType( - simpleType[simpleType.type], - )}`; - - return { - [`STRUCT_SIMPLE_${simpleTypeKey}`]: { - value: generateStructuredDataset(name, index.toString(), literalType), - expected: { - result_var: { columns, format: 'parquet', uri: index.toString() }, - }, - }, - }; - }) - .reduce((acc, v) => ({ ...acc, ...v }), {}); - -const sasWithCollectionTypeColumns: TestCaseList = - Object.keys(simple) - .map((simpleTypeKey, index) => { - const simpleType = simple[simpleTypeKey]; - - const literalType = { - collectionType: { - ...simpleType, - }, - type: 'collectionType', - }; - - const name = `column_name_${index}`; - const columns = []; - columns[name] = `collection of ${processSimpleType( - simpleType[simpleType.type], - )}`; - - return { - [`STRUCT_SIMPLE_${simpleTypeKey}`]: { - value: generateStructuredDataset(name, index.toString(), literalType), - expected: { - result_var: { columns, format: 'parquet', uri: index.toString() }, - }, - }, - }; - }) - .slice(0, 1) - .reduce((acc, v) => ({ ...acc, ...v }), {}); - -const sdsWithSimpleTypeColumns: TestCaseList = - Object.keys(simple) - .map((simpleTypeKey, index) => { - const literalType = simple[simpleTypeKey]; - - const name = `column_name_${index}`; - const columns = []; - columns[name] = processSimpleType(literalType[literalType.type]); - - return { - [`STRUCT_SIMPLE_${simpleTypeKey}`]: { - value: generateStructuredDataset(name, index.toString(), literalType), - expected: { - result_var: { columns, format: 'parquet', uri: index.toString() }, - }, - }, - }; - }) - .reduce((acc, v) => ({ ...acc, ...v }), {}); - -const sasWithSchemaColumns: TestCaseList = Object.keys( - Core.SchemaType.SchemaColumn.SchemaColumnType, -) - .map((simpleTypeKey, index) => { - const literalType = { - schema: { - columns: [ - { - type: Core.SchemaType.SchemaColumn.SchemaColumnType[simpleTypeKey], - }, - ], - }, - type: 'schema', - }; - - const name = `schema_column_name_${index}`; - const columns = []; - columns[name] = `schema (${columnTypeToString( - Core.SchemaType.SchemaColumn.SchemaColumnType[simpleTypeKey], - )})`; - - return { - [`STRUCT_SCHEMA_WITH_COLUMNS_${simpleTypeKey}`]: { - value: generateStructuredDataset(name, index.toString(), literalType), - expected: { - result_var: { columns, format: 'parquet', uri: index.toString() }, - }, - }, - }; - }) - .reduce((acc, v) => ({ ...acc, ...v }), {}); - -export default { - ...sdsWithSimpleTypeColumns, - ...sasWithSchemaColumns, - ...sasWithCollectionTypeColumns, - ...sasWithMapValueTypeColumns, -}; diff --git a/packages/console/src/components/Navigation/DefaultAppBarContent.tsx b/packages/console/src/components/Navigation/DefaultAppBarContent.tsx deleted file mode 100644 index d7b98ca58..000000000 --- a/packages/console/src/components/Navigation/DefaultAppBarContent.tsx +++ /dev/null @@ -1,204 +0,0 @@ -import * as React from 'react'; -import { makeStyles, useTheme } from '@material-ui/core/styles'; -import classnames from 'classnames'; -import { AppInfo, VersionInfo } from '@flyteorg/components'; -import { FlyteLogo } from '@flyteorg/ui-atoms'; -import { useCommonStyles } from 'components/common/styles'; -import { Link } from 'react-router-dom'; -import { Routes } from 'routes/routes'; -import { FeatureFlag, useFeatureFlag } from 'basics/FeatureFlags'; -import { useAdminVersion } from 'components/hooks/useVersion'; -import { env } from '@flyteorg/common'; -import { Box, Grid, IconButton } from '@material-ui/core'; -import MenuIcon from '@material-ui/icons/Menu'; -import debounce from 'lodash/debounce'; -import { NavigationDropdown } from './NavigationDropdown'; -import { UserInformation } from './UserInformation'; -import { OnlyMine } from './OnlyMine'; -import { FlyteNavItem } from './utils'; -import t, { patternKey } from './strings'; -import { TopLevelLayoutContext } from './TopLevelLayoutState'; - -interface DefaultAppBarProps { - items: FlyteNavItem[]; - console?: string; -} - -/** Renders the default content for the app bar, which is the logo and help links */ -export const DefaultAppBarContent = (props: DefaultAppBarProps) => { - const [platformVersion, setPlatformVersion] = React.useState(''); - const [consoleVersion, setConsoleVersion] = React.useState(''); - const { - isMobileNav, - openSideNav, - closeSideNav, - isSideNavOpen, - isLayoutHorizontal, - showMobileNav, - hideMobileNav, - } = React.useContext(TopLevelLayoutContext); - - const commonStyles = useCommonStyles(); - - const isFlagEnabled = useFeatureFlag(FeatureFlag.OnlyMine); - const { adminVersion } = useAdminVersion(); - const isGAEnabled = env.ENABLE_GA === 'true' && env.GA_TRACKING_ID !== ''; - - const handleSideNavToggle = React.useCallback(() => { - return isSideNavOpen ? closeSideNav() : openSideNav(); - }, [isSideNavOpen, openSideNav, closeSideNav]); - - const theme = useTheme(); - - // Enable / Disable mobile nav behaviour based on screen size - React.useLayoutEffect(() => { - const handleResize = () => { - if (window.innerWidth < theme.breakpoints.values.md) { - if (!isMobileNav) { - showMobileNav(); - closeSideNav(); - } - } else if (isMobileNav) { - hideMobileNav(); - closeSideNav(); - } - }; - handleResize(); - const debouncedResize = debounce(handleResize, 50); - window.addEventListener('resize', debouncedResize); - return () => window.removeEventListener('resize', debouncedResize); - }, [closeSideNav, theme.breakpoints.values.md]); - - React.useEffect(() => { - try { - const { version } = require('../../../../../website/package.json'); - const { version: packageVersion } = require('../../../package.json'); - - setPlatformVersion(version); - setConsoleVersion(packageVersion); - } catch { - /* no-op */ - } - }, []); - const versions: VersionInfo[] = [ - { - name: t('versionConsoleUi'), - version: platformVersion, - url: `https://github.com/flyteorg/flyteconsole/releases/tag/v${platformVersion}`, - }, - { - name: t('versionConsolePackage'), - version: consoleVersion, - url: `https://github.com/flyteorg/flyteconsole/tree/master/packages/console`, - }, - { - name: t('versionAdmin'), - version: adminVersion, - url: `https://github.com/flyteorg/flyteadmin/releases/tag/v${adminVersion}`, - }, - { - name: t('versionGoogleAnalytics'), - version: t(patternKey('gaActive', isGAEnabled.toString())), - url: 'https://github.com/flyteorg/flyteconsole#google-analytics', - }, - ]; - - const styles = makeStyles(() => ({ - wordmark: { - position: 'relative', - paddingTop: theme.spacing(2.75), - '& > svg': { - height: '22px', - transform: 'translateX(-34px)', - marginTop: '4px', - top: '0', - position: 'absolute', - }, - '& > svg > path:first-child': { - display: 'none', - }, - }, - flex: { - display: 'flex', - }, - }))(); - - return ( - - - - {isMobileNav && ( - - - menu - - - )} - - - - {isLayoutHorizontal && ( - - - - )} - - {props.items?.length > 0 && ( - - )} - - - - - - {isFlagEnabled && ( - - - - )} - - - - - - - - - - - - ); -}; - -export default DefaultAppBarContent; diff --git a/packages/console/src/components/Navigation/NavBar.tsx b/packages/console/src/components/Navigation/NavBar.tsx deleted file mode 100644 index 8377cbb5a..000000000 --- a/packages/console/src/components/Navigation/NavBar.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import * as React from 'react'; -import { Suspense, lazy } from 'react'; -import AppBar from '@material-ui/core/AppBar'; -import Toolbar from '@material-ui/core/Toolbar'; -import { navBarContentId } from 'common/constants'; -import { FlyteNavigation } from '@flyteorg/common'; -import { useExternalConfigurationContext } from 'basics/ExternalConfigurationProvider'; -import { makeStyles } from '@material-ui/core'; -import { CSSProperties } from '@material-ui/core/styles/withStyles'; -import { getFlyteNavigationData } from './utils'; -import { useTopLevelLayoutContext } from './TopLevelLayoutState'; - -export interface NavBarProps { - useCustomContent?: boolean; - navigationData?: FlyteNavigation; -} - -const DefaultAppBarContent = lazy(() => import('./DefaultAppBarContent')); - -/** Contains all content in the top navbar of the application. */ -export const NavBar = (props: NavBarProps) => { - const navData = props.navigationData ?? getFlyteNavigationData(); - const layoutState = useTopLevelLayoutContext(); - - const styles = makeStyles(theme => ({ - stackedSpacer: theme.mixins.toolbar as CSSProperties, - horizontalSpacer: { - width: '80px', - }, - navBar: { - color: navData?.color, - background: navData?.background, - top: 0, - }, - inlineNavBar: { - width: '80px', - height: '100%', - position: 'fixed', - inset: '0', - }, - inlineToolBar: { - padding: theme.spacing(2, 0, 4, 0), - height: '100%', - }, - }))(); - - const { isLayoutHorizontal } = layoutState; - - const navBarContent = props.useCustomContent ? ( -
- ) : ( - - - - ); - - const { registry } = useExternalConfigurationContext(); - - const ExternalNav = registry?.nav; - - return ExternalNav ? ( - - ) : ( - <> - {isLayoutHorizontal ? ( -
- ) : ( -
- )} - - - {navBarContent} - - - - ); -}; - -export default NavBar; diff --git a/packages/console/src/components/Navigation/NavBarContent.tsx b/packages/console/src/components/Navigation/NavBarContent.tsx deleted file mode 100644 index a48f13042..000000000 --- a/packages/console/src/components/Navigation/NavBarContent.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { navBarContentId } from 'common/constants'; -import { log } from 'common/log'; -import * as React from 'react'; -import ReactDOM from 'react-dom'; - -/** Complements NavBar, allowing pages to inject custom content. */ -export const NavBarContent: React.FC> = ({ - children, -}) => { - const navBar = document.getElementById(navBarContentId); - if (navBar == null) { - log.warn(` - Attempting to mount content into NavBar, but failed to find the content component. - Did you mount an instance of NavBar with useCustomContent=true?`); - return null; - } - return ReactDOM.createPortal(children, navBar); -}; diff --git a/packages/console/src/components/Navigation/NavLinkWithSearch.tsx b/packages/console/src/components/Navigation/NavLinkWithSearch.tsx deleted file mode 100644 index 1a1b8bb53..000000000 --- a/packages/console/src/components/Navigation/NavLinkWithSearch.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; -import { NavLink, useLocation } from 'react-router-dom'; - -interface NavLinkWithSearchProps extends React.ComponentProps { - preserve?: string[]; -} - -/** - * A NavLink that preserves the search params from the current location. - * - * @param preserve - An array of search param keys to preserve. If not specified, all search params will be preserved. - */ -export default function NavLinkWithSearch({ - preserve, - ...props -}: NavLinkWithSearchProps) { - const location = useLocation(); - - const searchParams = new URLSearchParams(location.search); - - if (preserve && preserve.length) { - for (const key of searchParams.keys()) { - if (key in preserve) { - continue; - } - - searchParams.delete(key); - } - } - - const to = props.to + '?' + searchParams.toString(); - return ; -} diff --git a/packages/console/src/components/Navigation/NavigationDropdown.tsx b/packages/console/src/components/Navigation/NavigationDropdown.tsx deleted file mode 100644 index cbfb0d807..000000000 --- a/packages/console/src/components/Navigation/NavigationDropdown.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { MenuItem, Select } from '@material-ui/core'; -import { useHistory } from 'react-router-dom'; -import { makeRoute } from '@flyteorg/common'; -import { headerFontFamily } from 'components/Theme/constants'; -import { FlyteNavItem } from './utils'; - -const useStyles = makeStyles((theme: Theme) => ({ - selectStyling: { - minWidth: '120px', - margin: theme.spacing(0, 2), - color: 'inherit', - '&:hover': { - color: 'inherit', - }, - '&:before, &:after, &:not(.Mui-disabled):hover::before': { - border: 'none', - }, - }, - colorInherit: { - color: 'inherit', - fontFamily: headerFontFamily, - fontWeight: 600, - lineHeight: 1.75, - }, -})); - -interface NavigationDropdownProps { - items: FlyteNavItem[]; // all other navigation items - console?: string; // name for default navigation, if not provided "Console" is used. -} - -/** Renders the default content for the app bar, which is the logo and help links */ -export const NavigationDropdown = (props: NavigationDropdownProps) => { - // Flyte Console list item - always there ans is first in the list - const ConsoleItem: FlyteNavItem = React.useMemo(() => { - return { - title: props.console ?? 'Console', - url: makeRoute('/'), - }; - }, [props.console]); - - const [selectedPage, setSelectedPage] = React.useState( - ConsoleItem.title, - ); - const [open, setOpen] = React.useState(false); - - const history = useHistory(); - const styles = useStyles(); - - const handleItemSelection = (item: FlyteNavItem) => { - setSelectedPage(item.title); - - if (item.url.startsWith('+')) { - // local navigation with BASE_URL addition - history.push(makeRoute(item.url.slice(1))); - } else { - // treated as external navigation - window.location.assign(item.url); - } - }; - - return ( - - ); -}; diff --git a/packages/console/src/components/Navigation/OnlyMine/FilterPopoverIcon.tsx b/packages/console/src/components/Navigation/OnlyMine/FilterPopoverIcon.tsx deleted file mode 100644 index d781c280b..000000000 --- a/packages/console/src/components/Navigation/OnlyMine/FilterPopoverIcon.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { Popover } from '@material-ui/core'; -import { alpha, makeStyles, Theme } from '@material-ui/core/styles'; -import { interactiveTextColor } from 'components/Theme/constants'; -import * as React from 'react'; - -const useStyles = makeStyles((theme: Theme) => { - const horizontalButtonPadding = theme.spacing(1.5); - return { - buttonIcon: { - marginLeft: theme.spacing(1), - marginRight: -horizontalButtonPadding / 2, - }, - resetIcon: { - cursor: 'pointer', - '&:hover': { - color: alpha(interactiveTextColor, 0.4), - }, - }, - popoverContent: { - border: `1px solid ${theme.palette.divider}`, - borderRadius: 4, - marginTop: theme.spacing(0.25), - padding: theme.spacing(2, 1.5), - }, - }; -}); - -export interface FilterPopoverButtonProps { - className?: string; - onClick?: React.MouseEventHandler; - open: boolean; - refObject: React.RefObject; - renderContent: () => JSX.Element; - children: JSX.Element[] | JSX.Element; -} - -/** Renders a common filter button with shared behavior for active/hover states, - * a reset icon, and rendering the provided content in a `Popover`. The state - * for this button can be mostly generated using the `useFilterButtonState` hook, - * but will generally be included as part of a bigger filter state such as - * `SingleSelectFilterState`. - */ -export const FilterPopoverIcon: React.FC = ({ - className, - onClick, - open, - refObject, - renderContent, - children, -}) => { - const styles = useStyles(); - - return ( -
- {children} - - {renderContent()} - -
- ); -}; diff --git a/packages/console/src/components/Navigation/OnlyMine/index.tsx b/packages/console/src/components/Navigation/OnlyMine/index.tsx deleted file mode 100644 index 9d88a5ac8..000000000 --- a/packages/console/src/components/Navigation/OnlyMine/index.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import { Switch, Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import * as React from 'react'; -import MenuIcon from '@material-ui/icons/Menu'; -import { MultiSelectForm } from 'components/common/MultiSelectForm'; -import { LocalCacheItem, useLocalCache } from 'basics/LocalCache'; -import { - filterByDefault, - defaultSelectedValues, - OnlyMyFilter, -} from 'basics/LocalCache/onlyMineDefaultConfig'; -import { smallIconSize } from 'components/Theme/constants'; -import { FilterPopoverIcon } from './FilterPopoverIcon'; -import t from './strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - display: 'flex', - flexDirection: 'row', - cursor: 'pointer', - alignItems: 'center', - }, - margin: { - marginLeft: theme.spacing(1), - marginRight: theme.spacing(1), - }, - menuIcon: { - fontSize: smallIconSize, - }, -})); - -const checkIsSelectedAll = (mapObject: Record) => { - return Object.keys(mapObject).every(key => { - if (key !== OnlyMyFilter.SelectAll) { - return mapObject[key]; - } - return true; - }); -}; - -const checkIsUnSelectedAll = (mapObject: Record) => { - return Object.keys(mapObject).every(key => { - return !mapObject[key]; - }); -}; - -export const OnlyMine: React.FC = () => { - const styles = useStyles(); - const [open, setOpen] = React.useState(false); - const [selectedValues, setSelectedValue] = useLocalCache( - LocalCacheItem.OnlyMineSetting, - ); - const [toggleValue, setToggleValue] = useLocalCache( - LocalCacheItem.OnlyMineToggle, - ); - - const togglePopup = () => setOpen(prevOpen => !prevOpen); - const toggleSwitch = () => setToggleValue(!toggleValue); - - const formOnChange = (newSelectedValues: Record) => { - setToggleValue(true); - // if user clicks the select all, marked all check boxes - if ( - newSelectedValues[OnlyMyFilter.SelectAll] && - !selectedValues[OnlyMyFilter.SelectAll] - ) { - setSelectedValue({ ...defaultSelectedValues }); - } - // after user clicking, if all the value is selected, makred all check boxes - else if (checkIsSelectedAll(newSelectedValues)) { - setSelectedValue({ ...defaultSelectedValues }); - } - // else we should unmarked select all - else { - setSelectedValue({ - ...newSelectedValues, - [OnlyMyFilter.SelectAll]: false, - }); - } - }; - - const divRef = React.useRef(null); - - return ( - <> - ( - {}} - values={filterByDefault} - selectedStates={selectedValues} - /> - )} - > -
- - {t('onlyMine_text')} -
-
- - - - ); -}; diff --git a/packages/console/src/components/Navigation/OnlyMine/strings.ts b/packages/console/src/components/Navigation/OnlyMine/strings.ts deleted file mode 100644 index 6b7cda9d3..000000000 --- a/packages/console/src/components/Navigation/OnlyMine/strings.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createLocalizedString } from '@flyteorg/locale'; - -const str = { - onlyMine_popup_label: 'execution id', - onlyMine_popup_header: 'Filter By', - onlyMine_text: 'Personal Mode', -}; - -export default createLocalizedString(str); diff --git a/packages/console/src/components/Navigation/ProjectNavigation.tsx b/packages/console/src/components/Navigation/ProjectNavigation.tsx deleted file mode 100644 index 5269c8f59..000000000 --- a/packages/console/src/components/Navigation/ProjectNavigation.tsx +++ /dev/null @@ -1,203 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme, useTheme } from '@material-ui/core/styles'; -import { SvgIconProps } from '@material-ui/core/SvgIcon'; -import ChevronRight from '@material-ui/icons/ChevronRight'; -import DeviceHub from '@material-ui/icons/DeviceHub'; -import LinearScale from '@material-ui/icons/LinearScale'; -import Dashboard from '@material-ui/icons/Dashboard'; -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import { withRouteParams } from 'components/common/withRouteParams'; -import { useProject, useProjects } from 'components/hooks/useProjects'; -import { Project } from 'models/Project/types'; -import { matchPath, NavLinkProps, RouteComponentProps } from 'react-router-dom'; -import { history } from 'routes/history'; -import { Routes } from 'routes/routes'; -import { MuiLaunchPlanIcon } from '@flyteorg/ui-atoms'; -import { - LOCAL_PROJECT_DOMAIN, - setLocalStore, -} from 'components/common/LocalStoreDefaults'; -import { primaryHighlightColor } from 'components/Theme/constants'; -import { ProjectSelector } from './ProjectSelector'; -import NavLinkWithSearch from './NavLinkWithSearch'; -import { TopLevelLayoutContext } from './TopLevelLayoutState'; - -interface ProjectNavigationRouteParams { - domainId?: string; - projectId: string; - section?: string; -} - -const useStyles = makeStyles((theme: Theme) => ({ - navLinksContainer: { - marginTop: theme.spacing(1), - }, - navLink: { - alignItems: 'center', - borderLeft: '4px solid transparent', - color: theme.palette.text.secondary, - display: 'flex', - height: theme.spacing(6), - padding: `0 ${theme.spacing(2)}px`, - '&:hover': { - borderColor: primaryHighlightColor, - }, - }, - navLinkActive: { - color: theme.palette.text.primary, - fontWeight: 600, - }, - navLinkChevron: { - color: theme.palette.grey[500], - flex: '0 0 auto', - }, - navLinkIcon: { - marginRight: theme.spacing(2), - }, - navLinkText: { - flex: '1 1 auto', - }, -})); - -interface ProjectRoute extends Pick { - icon: React.ComponentType; - path: string; - text: string; -} - -const ProjectNavigationImpl: React.FC = ({ - domainId, - projectId, - section, -}) => { - const styles = useStyles(); - const commonStyles = useCommonStyles(); - if (!projectId) return no project id; - - const [projects] = useProjects(); - const [project] = useProject(projectId); - - const onProjectSelected = (project: Project) => { - const path = Routes.ProjectDetails.makeUrl(project.id, section); - const projectDomain = { - project: project.id, - domain: domainId || 'development', - }; - /* Store user intent in localStorage */ - setLocalStore(LOCAL_PROJECT_DOMAIN, projectDomain); - return history.push(path); - }; - - const routes: ProjectRoute[] = React.useMemo(() => { - if (!project?.id && !domainId) return []; - return [ - { - icon: Dashboard, - isActive: (match, location) => { - const finalMatch = match - ? match - : matchPath(location.pathname, { - path: Routes.ProjectDashboard.path, - exact: false, - }); - return !!finalMatch; - }, - path: Routes.ProjectDetails.sections.dashboard.makeUrl( - project.id, - domainId, - ), - text: 'Project Dashboard', - }, - { - icon: DeviceHub, - isActive: (match, location) => { - const finalMatch = match - ? match - : matchPath(location.pathname, { - path: Routes.WorkflowDetails.path, - exact: false, - }); - return !!finalMatch; - }, - path: Routes.ProjectDetails.sections.workflows.makeUrl( - projectId, - domainId, - ), - text: 'Workflows', - }, - { - icon: LinearScale, - isActive: (match, location) => { - const finalMatch = match - ? match - : matchPath(location.pathname, { - path: Routes.TaskDetails.path, - exact: false, - }); - return !!finalMatch; - }, - path: Routes.ProjectDetails.sections.tasks.makeUrl(projectId, domainId), - text: 'Tasks', - }, - { - icon: MuiLaunchPlanIcon as any, - isActive: (match, location) => { - const finalMatch = match - ? match - : matchPath(location.pathname, { - path: Routes.LaunchPlanDetails.path, - exact: false, - }); - return !!finalMatch; - }, - path: Routes.ProjectDetails.sections.launchPlans.makeUrl( - project.id, - domainId, - ), - text: 'Launch Plans', - }, - ]; - }, [project?.id, domainId]); - - const { openSideNav } = React.useContext(TopLevelLayoutContext); - const theme = useTheme(); - React.useEffect(() => { - if (window.innerWidth > theme.breakpoints.values.md) { - openSideNav(); - } - }, []); - - if (!project && !projects) return <>; - return ( - <> - {project?.id && ( - - )} -
- {Object.values(routes).map(({ isActive, path, icon: Icon, text }) => ( - - - {text} - - - ))} -
- - ); -}; - -/** Renders the left side navigation between and within projects */ -export const ProjectNavigation: React.FunctionComponent< - RouteComponentProps -> = withRouteParams(ProjectNavigationImpl); diff --git a/packages/console/src/components/Navigation/ProjectSelector.tsx b/packages/console/src/components/Navigation/ProjectSelector.tsx deleted file mode 100644 index 0903151a8..000000000 --- a/packages/console/src/components/Navigation/ProjectSelector.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import * as React from 'react'; -import ButtonBase from '@material-ui/core/ButtonBase'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import ExpandMore from '@material-ui/icons/ExpandMore'; -import classnames from 'classnames'; -import { KeyCodes } from 'common/constants'; -import { useCommonStyles } from 'components/common/styles'; -import { listhoverColor } from 'components/Theme/constants'; -import { Project } from 'models/Project/types'; -import { SearchableProjectList } from './SearchableProjectList'; - -const expanderGridHeight = 12; - -const useStyles = makeStyles((theme: Theme) => ({ - expander: { - alignItems: 'center', - borderBottom: `${theme.spacing(1)}px solid ${listhoverColor}`, - display: 'flex', - flex: '0 0 auto', - flexDirection: 'row', - height: theme.spacing(expanderGridHeight), - padding: theme.spacing(2), - width: '100%', - '&.expanded': { - backgroundColor: listhoverColor, - }, - }, - expandIcon: { - color: theme.palette.grey[500], - flex: '0 0 auto', - }, - header: { - flex: '1 0 0', - textAlign: 'left', - }, - listContainer: { - backgroundColor: theme.palette.background.default, - bottom: 0, - position: 'absolute', - overflowY: 'scroll', - top: theme.spacing(expanderGridHeight), - width: '100%', - }, - viewProjects: { - display: 'flex', - padding: '.25rem', - justifyContent: 'flex-end', - color: theme.palette.text.primary, - fontSize: theme.typography.body1.fontSize, - textAlign: 'right', - textDecoration: 'none', - }, -})); - -export interface ProjectSelectorProps { - selectedProject: Project; - projects: Project[]; - onProjectSelected: (project: Project) => void; -} - -/** A complex selector that shows the current project when collapsed, and - * renders a searchable list of projects when expanded. - */ -export const ProjectSelector: React.FC = ({ - projects, - selectedProject, - onProjectSelected, -}) => { - const styles = useStyles(); - const [expanded, setExpanded] = React.useState(false); - const commonStyles = useCommonStyles(); - - const onToggleExpanded = () => setExpanded(!expanded); - const onSelect = (project: Project) => { - setExpanded(false); - onProjectSelected(project); - }; - const onKeyDown = ({ keyCode }: React.KeyboardEvent) => { - if (keyCode === KeyCodes.ESCAPE) { - setExpanded(false); - } - }; - - return ( -
- -
-
PROJECT
-
- {selectedProject.name} -
-
- -
- {expanded && ( -
- -
- )} -
- ); -}; diff --git a/packages/console/src/components/Navigation/Readme.md b/packages/console/src/components/Navigation/Readme.md deleted file mode 100644 index a70ec604e..000000000 --- a/packages/console/src/components/Navigation/Readme.md +++ /dev/null @@ -1,48 +0,0 @@ -## Customize NavBar component - -From this point forward you can modify your FlyteConsole navigatio bar by: - -- using your company colors -- providing entrypoint navigation to sites, or places inside flyteconsole. - -To use it you will need to define `FLYTE_NAVIGATION` environment variable during the build. - -If you are building locally add next or similar export to your `.zshrc` (or equivalent) file: - -```bash -export FLYTE_NAVIGATION='{"color":"white","background":"black","items":[{"title":"Hosted","url":"https://hosted.cloud-staging.union.ai/dashboard"}, {"title":"Dashboard","url":"/projects/flytesnacks/executions?domain=development&duration=all"},{"title":"Execution", "url":"/projects/flytesnacks/domains/development/executions/awf2lx4g58htr8svwb7x?duration=all"}]}' -``` - -If you are building a docker image - modify [Makefile](./Makefile) `build_prod` step to include FLYTE_NAVIGATION setup. - -### The structure of FLYTE_NAVIGATION - -Essentially FLYTE_NAVIGATION is a JSON object - -``` -{ - color:"white", // optional - default NavBar text color, if not provided uses Flyte colors - background:"black", // optional - default NavBar background color, if not provided uses Flyte colors - console:"FlyteConsole" // optional - name of the default navigation, if not provided uses "Console" - items:[ // required - if no dropdown needed provide an empty array - {title:"Remote", url:"https://remote.site/"}, - {title:"Dashboard", url:"+/projects/flytesnacks/executions?domain=development&duration=all"}, - {title:"Information", url:"/information"} - ] -} -``` - -If at least one item in `items` array is present the dropdown will appear in NavBar main view. -It will contain at least two items: - -- default "Console" item which navigates to ${BASE_URL} -- all items you have provided: - - If item's url starts with `+` sign, the navigstion would be treated as an internal one. + sign would be stripped and BASE_URL would be added to navigaiton - -Feel free to play around with the views in Storybook: - -Screen Shot 2022-06-15 at 2 01 29 PM - -#### Note - -Please let us know in [Slack #flyte-console](https://flyte-org.slack.com/archives/CTJJLM8BY) channel if you found bugs or need more support than. diff --git a/packages/console/src/components/Navigation/SearchableProjectList.tsx b/packages/console/src/components/Navigation/SearchableProjectList.tsx deleted file mode 100644 index 7cdc064b5..000000000 --- a/packages/console/src/components/Navigation/SearchableProjectList.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import * as React from 'react'; -import { Box, Fade, Grid, Tooltip, Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import classnames from 'classnames'; -import { NoResults } from 'components/common/NoResults'; -import { SearchableList, SearchResult } from 'components/common/SearchableList'; -import { useCommonStyles } from 'components/common/styles'; -import { defaultProjectDescription } from 'components/SelectProject/constants'; -import { primaryHighlightColor } from 'components/Theme/constants'; -import { Project } from 'models/Project/types'; -import { Routes } from 'routes'; -import { history } from 'routes/history'; -import t from './strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - marginBottom: theme.spacing(2), - width: '100%', - }, - itemName: { - flex: '1 0 0', - fontWeight: 'bold', - }, - searchResult: { - alignItems: 'center', - borderLeft: '4px solid transparent', - cursor: 'pointer', - display: 'flex', - flexDirection: 'row', - height: theme.spacing(5), - padding: `0 ${theme.spacing(1)}px`, - width: '100%', - '&:hover': { - borderColor: primaryHighlightColor, - }, - '& mark': { - backgroundColor: 'unset', - color: primaryHighlightColor, - fontWeight: 'bold', - }, - }, -})); - -type ProjectSelectedCallback = (project: Project) => void; - -interface SearchResultsProps { - onProjectSelected: ProjectSelectedCallback; - results: SearchResult[]; -} -const SearchResults: React.FC = ({ - onProjectSelected, - results, -}) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - return ( - <> - -
- {t('viewAllProjects')} -
- - } - > - { - history.push(Routes.SelectProject.path); - }} - > - - - {t('viewAllProjects')}… - - - -
- {!results.length ? ( - - ) : ( -
    -
  • - {results.map(({ content, value }) => ( - -
    {value.id}
    -
    - {value.description || defaultProjectDescription} -
    - - } - > -
    onProjectSelected(value)} - > -
    - - - {content} - - -
    -
    -
    - ))} -
  • -
- )} - - ); -}; - -export interface SearchableProjectListProps { - onProjectSelected: ProjectSelectedCallback; - projects: Project[]; -} -/** Given a list of Projects, renders a searchable list of items which - * navigate to the details page for the project on click - */ -export const SearchableProjectList: React.FC = ({ - onProjectSelected, - projects, -}) => { - const styles = useStyles(); - - const renderItems = (results: SearchResult[]) => ( - - ); - - return ( -
- -
- ); -}; diff --git a/packages/console/src/components/Navigation/SideNavigation.tsx b/packages/console/src/components/Navigation/SideNavigation.tsx deleted file mode 100644 index ecfdcdc34..000000000 --- a/packages/console/src/components/Navigation/SideNavigation.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { sideNavGridWidth } from 'common/layout'; -import { separatorColor } from 'components/Theme/constants'; -import { Route } from 'react-router-dom'; -import { projectBasePath } from 'routes/constants'; -import { ProjectNavigation } from './ProjectNavigation'; - -const useStyles = makeStyles((theme: Theme) => ({ - wrapper: { - position: 'relative', - height: '100%', - width: theme.spacing(sideNavGridWidth), - }, - absolute: { - position: 'relative', - top: 0, - left: 0, - bottom: 0, - width: '100%', - height: '100%', - }, - fixed: { - position: 'fixed', - top: 0, - height: 'calc(100dvh - 64px)', - width: theme.spacing(sideNavGridWidth), - transition: 'top 0s', - }, - border: { - borderRight: `1px solid ${separatorColor}`, - }, -})); - -/** Renders the left-side application navigation content */ -export const SideNavigation: React.FC = () => { - const styles = useStyles(); - return ( -
-
-
- -
-
-
- ); -}; diff --git a/packages/console/src/components/Navigation/SubNavBarContent.tsx b/packages/console/src/components/Navigation/SubNavBarContent.tsx deleted file mode 100644 index 17e9f6190..000000000 --- a/packages/console/src/components/Navigation/SubNavBarContent.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import * as React from 'react'; -import ReactDOM from 'react-dom'; -import { subnavBarContentId } from 'common/constants'; -import { log } from 'common/log'; - -/** Complements NavBar, allowing pages to inject custom content. */ -export const SubNavBarContent: React.FC> = ({ - children, -}) => { - const navBar = document.getElementById(subnavBarContentId); - if (navBar == null) { - log.warn(` - Attempting to mount content into NavBar, but failed to find the content component. - Did you mount an instance of NavBar with useCustomContent=true?`); - return null; - } - return ReactDOM.createPortal(children, navBar); -}; diff --git a/packages/console/src/components/Navigation/TopLevelLayout.tsx b/packages/console/src/components/Navigation/TopLevelLayout.tsx deleted file mode 100644 index 88bffb994..000000000 --- a/packages/console/src/components/Navigation/TopLevelLayout.tsx +++ /dev/null @@ -1,285 +0,0 @@ -import React, { useEffect, useLayoutEffect, useMemo, useRef } from 'react'; -import { - Grid, - styled, - makeStyles, - Box, - useTheme, - Toolbar, -} from '@material-ui/core'; -import { ContentContainer } from 'components/common/ContentContainer'; -import { useExternalConfigurationContext } from 'basics/ExternalConfigurationProvider'; -import { sideNavGridWidth } from 'common/layout'; -import debounce from 'lodash/debounce'; -import { FeatureFlag, useFeatureFlagContext } from 'basics/FeatureFlags'; -import { subnavBackgroundColor } from 'components/Theme/constants'; -import { subnavBarContentId } from 'common/constants'; -import { TopLevelLayoutContext } from './TopLevelLayoutState'; - -const StyledSubNavBarContent = styled(Toolbar)(() => ({ - minHeight: 'auto', - padding: 0, - margin: 0, - - '& > *': { - alignItems: 'center', - display: 'flex', - maxWidth: '100%', - padding: '24px 20px 24px 30px', - background: subnavBackgroundColor, - }, - '@media (min-width: 600px)': { - minHeight: 'auto', - }, -})); - -const GrowGrid = styled(Grid)(() => ({ - display: 'flex', - flexGrow: 1, -})); - -export interface TopLevelLayoutInterFace { - headerComponent: JSX.Element; - sideNavigationComponent: JSX.Element; - routerView: JSX.Element; - className?: string; - isHorizontalLayout: boolean; -} - -export const TopLevelLayoutGrid = ({ - headerComponent, - sideNavigationComponent, - routerView, - className = '', - isHorizontalLayout = false, -}: TopLevelLayoutInterFace) => { - const userHorizontalPref = isHorizontalLayout; - const theme = useTheme(); - const HeaderComponent = headerComponent ? () => headerComponent : () => <>; - const SideNavigationComponent = sideNavigationComponent - ? () => sideNavigationComponent - : () => <>; - const RouterView = routerView ? () => routerView : () => <>; - - const styles = makeStyles(theme => ({ - noBounce: { - '-webkit-overflow-scrolling': - 'touch' /* enables “momentum” (smooth) scrolling */, - }, - sticky: { - position: 'sticky', - top: 0, - }, - relative: { - position: 'relative', - }, - absolute: { - position: 'absolute', - }, - w100: { - width: '100%', - }, - h100: { - minHeight: '100dvh', - }, - headerZIndex: { - zIndex: 2, - }, - leftNavZIndex: { - zIndex: 1, - }, - above: { - zIndex: 1, - }, - nav: { - top: 0, - position: 'relative', - height: '100%', - minWidth: theme.spacing(sideNavGridWidth), - background: theme.palette.background.paper, - willChange: 'transform', - }, - mobileNav: { - zIndex: 2, - position: 'absolute', - boxShadow: theme.shadows[4], - }, - sideNavAnimation: { - animationName: `$sideNavAnimation`, - animationTimingFunction: `${theme.transitions.easing.easeInOut}`, - animationDuration: `300ms`, - animationFillMode: 'forwards', - }, - '@keyframes sideNavAnimation': { - '0%': { - opacity: 0, - display: 'none', - }, - '1%': { - opacity: 0, - transform: 'translateX(-20%)', - display: 'block', - }, - '99%': { - opacity: 1, - transform: 'translateX(0)', - }, - '100%': { - opacity: 1, - display: 'block', - }, - }, - closeSideNav: { - animationDirection: 'reverse', - display: 'none', - }, - openSideNav: { - animationDirection: 'normal', - }, - }))(); - - const { - isMobileNav, - isSideNavOpen, - closeSideNav, - isLayoutHorizontal, - rowLayout, - columnLayout, - } = React.useContext(TopLevelLayoutContext); - - // flip layout on narrow screen per flag and resizes - useLayoutEffect(() => { - const handleResize = () => { - if (window.innerWidth < theme.breakpoints.values.md) { - rowLayout(); - } else { - if (!userHorizontalPref) { - rowLayout(); - } else { - columnLayout(); - } - } - }; - - handleResize(); - const debouncedResize = debounce(handleResize, 50); - window.addEventListener('resize', debouncedResize); - return () => window.removeEventListener('resize', debouncedResize); - }, []); - - // run on init - useEffect(() => { - if (isMobileNav || !isLayoutHorizontal || !userHorizontalPref) { - rowLayout(); - closeSideNav(); - } else { - columnLayout(); - } - }, []); - - // ref to update offset on scroll - const scrollRef = useRef(null); - // pin left nav to top of screen - useLayoutEffect(() => { - const handleScroll = () => { - const scrollElement = scrollRef.current; - const documentHeight = - document.body.scrollHeight - document.body.clientHeight; - - if (scrollElement && window.scrollY + 1 < documentHeight) { - const scroll = window.scrollY; - scrollElement.style.transform = `translateY(${scroll}px)`; - } - }; - - document.addEventListener('scroll', handleScroll); - return () => { - document.removeEventListener('scroll', handleScroll); - }; - }, []); - - return ( - - - - - - {/* Grow X Axis */} - - - - - - - - - {/* Legacy, need to move to */} - - - - - - - - - - - - ); -}; - -export const TopLevelLayout = (props: TopLevelLayoutInterFace) => { - const { registry } = useExternalConfigurationContext(); - const ExternalTopLevelLayout = registry?.topLevelLayout; - - const { getFeatureFlag } = useFeatureFlagContext(); - const flag = getFeatureFlag(FeatureFlag.HorizontalLayout); - - const isHorizontalLayout = useMemo( - () => flag || props.isHorizontalLayout, - [flag, props.isHorizontalLayout], - ); - - if (ExternalTopLevelLayout) - return ( - - ); - return ( - - ); -}; - -export default TopLevelLayout; diff --git a/packages/console/src/components/Navigation/UserInformation.tsx b/packages/console/src/components/Navigation/UserInformation.tsx deleted file mode 100644 index f82cb9abe..000000000 --- a/packages/console/src/components/Navigation/UserInformation.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import * as React from 'react'; -import { useFlyteApi } from '@flyteorg/flyte-api'; -import { - Avatar, - Box, - IconButton, - Link, - makeStyles, - Popover, - Theme, - Typography, -} from '@material-ui/core'; -import { WaitForData } from 'components/common/WaitForData'; -import { useUserProfile } from 'components/hooks/useUserProfile'; -import t from './strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - color: theme.palette.common.white, - }, - avatar: { - width: '2rem', - height: '2rem', - fontSize: '1rem', - backgroundColor: theme.palette.secondary.main, - border: `1px solid ${theme.palette.common.white}`, - }, -})); - -const LoginLink = (props: { loginUrl: string }) => { - return ( - - - {t('login')} - - - ); -}; - -/** Displays user info if logged in, or a login link otherwise. */ -export const UserInformation: React.FC<{}> = () => { - const styles = useStyles(); - const profile = useUserProfile(); - const apiContext = useFlyteApi(); - - const [anchorEl, setAnchorEl] = React.useState(null); - - const handlePopoverOpen = event => { - setAnchorEl(event.currentTarget); - }; - - const handlePopoverClose = () => { - setAnchorEl(null); - }; - - const userName = React.useMemo(() => { - if (!profile.value) { - return null; - } - - return profile.value.preferredUsername - ? profile.value.preferredUsername - : profile.value.name; - }, [profile.value]); - - const givenName = React.useMemo(() => { - if (!profile.value) { - return null; - } - - return profile.value.name - ? profile.value.name - : `${profile.value.givenName} ${profile.value.familyName}`.trim(); - }, [profile.value]); - - const userNameInitial = React.useMemo(() => { - if (!givenName) { - return ''; - } - const names = givenName.split(' '); - const firstInitial = names[0].charAt(0); - const lastInitial = - names.length > 1 ? names[names.length - 1].charAt(0) : ''; - return `${firstInitial}${lastInitial}`.toLocaleUpperCase(); - }, [givenName]); - - const open = Boolean(anchorEl); - - return ( - - {!profile.value && } - {profile.value && ( - <> - - - - {userName} - - - - {userName} - - - - - )} - - ); -}; - -export const UserInformationV2: React.FC<{}> = () => { - const style = useStyles(); - const profile = useUserProfile(); - const apiContext = useFlyteApi(); - - return ( - -
- {!profile.value ? ( - - ) : ( - profile.value.name - )} -
-
- ); -}; diff --git a/packages/console/src/components/Navigation/index.ts b/packages/console/src/components/Navigation/index.ts deleted file mode 100644 index f1cf5bd57..000000000 --- a/packages/console/src/components/Navigation/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import TopLevelLayout, { - TopLevelLayoutGrid, - TopLevelLayoutInterFace, -} from './TopLevelLayout'; -import TopLevelLayoutProvider, { - TopLevelLayoutContext, - useTopLevelLayoutContext, -} from './TopLevelLayoutState'; - -export * from './UserInformation'; -export * from './NavBarContent'; -export * from './SubNavBarContent'; -export { - TopLevelLayout, - TopLevelLayoutGrid, - TopLevelLayoutContext, - useTopLevelLayoutContext, - TopLevelLayoutProvider, -}; -export type { TopLevelLayoutInterFace }; diff --git a/packages/console/src/components/Navigation/strings.ts b/packages/console/src/components/Navigation/strings.ts deleted file mode 100644 index 79aa506f7..000000000 --- a/packages/console/src/components/Navigation/strings.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { createLocalizedString } from '@flyteorg/locale'; - -const str = { - login: 'Login', - versionConsoleUi: 'UI Version', - versionConsolePackage: 'Package Version', - versionAdmin: 'Admin Version', - versionGoogleAnalytics: 'Google Analytics', - viewAllProjects: 'View All Projects', - gaActive_: 'Active', - gaActive_true: 'Active', - gaActive_false: 'Inactive', -}; - -export { patternKey } from '@flyteorg/locale'; -export default createLocalizedString(str); diff --git a/packages/console/src/components/Navigation/test/ProjectSelector.test.tsx b/packages/console/src/components/Navigation/test/ProjectSelector.test.tsx deleted file mode 100644 index 1c4a7f0e1..000000000 --- a/packages/console/src/components/Navigation/test/ProjectSelector.test.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { fireEvent, render } from '@testing-library/react'; -import { KeyCodes } from 'common/constants'; -import { createMockProjects } from 'models/__mocks__/projectData'; -import * as React from 'react'; -import { ProjectSelector, ProjectSelectorProps } from '../ProjectSelector'; - -describe('ProjectSelector', () => { - let props: ProjectSelectorProps; - const renderProjectSelector = () => render(); - - beforeEach(() => { - const projects = createMockProjects(); - props = { - projects, - onProjectSelected: jest.fn(), - selectedProject: projects[0], - }; - }); - describe('while collapsed', () => { - it('should not render list items', () => { - const { queryByText } = renderProjectSelector(); - expect(queryByText(props.projects[1].name)).toBeNull(); - }); - }); - - describe('while expanded', () => { - let rendered: ReturnType; - beforeEach(async () => { - rendered = renderProjectSelector(); - const expander = rendered.getByText(props.projects[0].name); - await fireEvent.click(expander); - }); - - it('should render list items', () => { - expect(rendered.getByText(props.projects[1].name)).toBeTruthy(); - }); - - it('should collapse when hitting escape', () => { - fireEvent.keyDown(rendered.getByRole('search'), { - keyCode: KeyCodes.ESCAPE, - }); - expect(rendered.queryByText(props.projects[1].name)).toBeNull(); - }); - - it('should collapse when an item is selected', async () => { - await fireEvent.click(rendered.getByText(props.projects[1].name)); - expect(rendered.queryByText(props.projects[1].name)).toBeNull(); - }); - }); -}); diff --git a/packages/console/src/components/Navigation/test/UserInformation.test.tsx b/packages/console/src/components/Navigation/test/UserInformation.test.tsx deleted file mode 100644 index 822c00860..000000000 --- a/packages/console/src/components/Navigation/test/UserInformation.test.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { render, waitFor } from '@testing-library/react'; -import { FetchableData } from 'components/hooks/types'; -import { useUserProfile } from 'components/hooks/useUserProfile'; -import { loadedFetchable } from 'components/hooks/__mocks__/fetchableData'; -import { UserProfile } from 'models/Common/types'; -import * as React from 'react'; - -import { UserInformation } from '../UserInformation'; - -jest.mock('components/hooks/useUserProfile'); - -describe('UserInformation', () => { - const sampleUserProfile: UserProfile = { - preferredUsername: 'testUser@example.com', - } as UserProfile; - - const mockUseUserProfile = useUserProfile as jest.Mock< - FetchableData - >; - - it('Shows login link if no user profile exists', async () => { - mockUseUserProfile.mockReturnValue(loadedFetchable(null, jest.fn())); - const { getByText } = render(); - - await waitFor(() => getByText('Login')); - expect(mockUseUserProfile).toHaveBeenCalled(); - - const element = getByText('Login'); - expect(element).toBeInTheDocument(); - expect(element.tagName).toBe('A'); - }); - - it('Shows user preferredName if profile exists', async () => { - mockUseUserProfile.mockReturnValue( - loadedFetchable(sampleUserProfile, jest.fn()), - ); - const { getByText } = render(); - - await waitFor(() => getByText(sampleUserProfile.preferredUsername)); - expect(mockUseUserProfile).toHaveBeenCalled(); - expect(getByText(sampleUserProfile.preferredUsername)).toBeInTheDocument(); - }); -}); diff --git a/packages/console/src/components/Navigation/utils.ts b/packages/console/src/components/Navigation/utils.ts deleted file mode 100644 index a4be260fd..000000000 --- a/packages/console/src/components/Navigation/utils.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { env } from '@flyteorg/common'; - -export interface FlyteNavItem { - title: string; - url: string; -} - -export interface FlyteNavigation { - color?: string; - background?: string; - console?: string; - items: FlyteNavItem[]; -} - -export const getFlyteNavigationData = (): FlyteNavigation | undefined => { - return env.FLYTE_NAVIGATION ? JSON.parse(env.FLYTE_NAVIGATION) : undefined; -}; diff --git a/packages/console/src/components/Navigation/withSideNavigation.tsx b/packages/console/src/components/Navigation/withSideNavigation.tsx deleted file mode 100644 index c8667df4c..000000000 --- a/packages/console/src/components/Navigation/withSideNavigation.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { - ContentContainer, - ContentContainerProps, -} from 'components/common/ContentContainer'; -import * as React from 'react'; -import { SideNavigation } from './SideNavigation'; - -export function withSideNavigation

( - WrappedComponent: React.ComponentType

, - contentContainerProps: ContentContainerProps = {}, -) { - return (props: P) => ( - <> - - - - - - ); -} diff --git a/packages/console/src/components/NotFound/NotFound.tsx b/packages/console/src/components/NotFound/NotFound.tsx deleted file mode 100644 index e5f1ad0ed..000000000 --- a/packages/console/src/components/NotFound/NotFound.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import * as React from 'react'; - -export const NotFound: React.StatelessComponent = () => { - return ( -

-

404

-

Not found

-
- ); -}; diff --git a/packages/console/src/components/NotFound/__stories__/NotFound.stories.tsx b/packages/console/src/components/NotFound/__stories__/NotFound.stories.tsx deleted file mode 100644 index 0b7ad23b8..000000000 --- a/packages/console/src/components/NotFound/__stories__/NotFound.stories.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import * as React from 'react'; - -import { storiesOf } from '@storybook/react'; -import { NotFound } from '../NotFound'; - -const stories = storiesOf('Views', module); -stories.add('Not Found', () => ); diff --git a/packages/console/src/components/Notifications/SystemStatusBanner.tsx b/packages/console/src/components/Notifications/SystemStatusBanner.tsx deleted file mode 100644 index c7e766b04..000000000 --- a/packages/console/src/components/Notifications/SystemStatusBanner.tsx +++ /dev/null @@ -1,151 +0,0 @@ -import { ButtonBase, Typography } from '@material-ui/core'; -import Paper from '@material-ui/core/Paper'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import Close from '@material-ui/icons/Close'; -import Info from '@material-ui/icons/Info'; -import Warning from '@material-ui/icons/Warning'; -import { Empty } from 'components/common/Empty'; -import { LinkifiedText } from 'components/common/LinkifiedText'; -import { WaitForData } from 'components/common/WaitForData'; -import { - infoIconColor, - mutedButtonColor, - mutedButtonHoverColor, - warningIconColor, -} from 'components/Theme/constants'; -import { StatusString, SystemStatus } from 'models/Common/types'; -import * as React from 'react'; -import { useSystemStatus } from './useSystemStatus'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - bottom: 0, - display: 'flex', - justifyContent: 'center', - left: 0, - // The parent container extends the full width of the page. - // We don't want it intercepting pointer events for visible items below it. - pointerEvents: 'none', - position: 'fixed', - padding: theme.spacing(2), - right: 0, - }, - closeButton: { - alignItems: 'center', - color: mutedButtonColor, - '&:hover': { - color: mutedButtonHoverColor, - }, - display: 'flex', - height: theme.spacing(3), - }, - statusPaper: { - display: 'flex', - padding: theme.spacing(2), - pointerEvents: 'initial', - }, - statusContentContainer: { - alignItems: 'flex-start', - display: 'flex', - maxWidth: theme.spacing(131), - }, - statusClose: { - alignItems: 'flex-start', - display: 'flex', - flex: '0 0 auto', - }, - statusIcon: { - alignItems: 'center', - display: 'flex', - flex: '0 0 auto', - lineHeight: `${theme.spacing(3)}px`, - }, - statusMessage: { - flex: '1 1 auto', - fontWeight: 'normal', - lineHeight: `${theme.spacing(3)}px`, - marginLeft: theme.spacing(2), - marginRight: theme.spacing(2), - }, -})); - -const InfoIcon = () => ( - -); - -const WarningIcon = () => ( - -); - -const statusIcons: Record = { - normal: InfoIcon, - degraded: WarningIcon, - down: WarningIcon, -}; - -const StatusIcon: React.FC<{ status: StatusString }> = ({ status }) => { - const IconComponent = statusIcons[status] || statusIcons.normal; - return ; -}; - -export const RenderSystemStatusBanner: React.FC<{ - systemStatus: SystemStatus; - onClose: () => void; -}> = ({ systemStatus: { message, status }, onClose }) => { - const styles = useStyles(); - return ( -
- -
- -
-
- - - -
-
- - - -
-
-
- ); -}; - -/** Fetches and renders the system status returned by issuing a GET to - * `env.STATUS_URL`. If the status includes a message, a dismissable toast - * will be rendered. Otherwise, nothing will be rendered. - */ -export const SystemStatusBanner: React.FC<{}> = () => { - const systemStatus = useSystemStatus(); - const [dismissed, setDismissed] = React.useState(false); - const onClose = () => setDismissed(true); - if (dismissed) { - return null; - } - return ( - - {systemStatus.value.message ? ( - - ) : null} - - ); -}; diff --git a/packages/console/src/components/Project/ProjectDashboard.tsx b/packages/console/src/components/Project/ProjectDashboard.tsx deleted file mode 100644 index d23a634a8..000000000 --- a/packages/console/src/components/Project/ProjectDashboard.tsx +++ /dev/null @@ -1,261 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core/styles'; -import React from 'react'; -import { Typography } from '@material-ui/core'; -import { - useTaskNameList, - useWorkflowNameList, -} from 'components/hooks/useNamedEntity'; -import { useWorkflowExecutions } from 'components/hooks/useWorkflowExecutions'; -import { WaitForQuery } from 'components/common/WaitForQuery'; -import { useInfiniteQuery, useQuery, useQueryClient } from 'react-query'; -import { Admin } from '@flyteorg/flyteidl-types'; -import { DomainSettingsSection } from 'components/common/DomainSettingsSection'; -import { getCacheKey } from 'components/Cache/utils'; -import { limits } from 'models/AdminEntity/constants'; -import { ErrorBoundary } from 'components/common/ErrorBoundary'; -import { LargeLoadingSpinner } from 'components/common/LoadingSpinner'; -import { DataError } from 'components/Errors/DataError'; -import { ExecutionFilters } from 'components/Executions/ExecutionFilters'; -import { useWorkflowExecutionFiltersState } from 'components/Executions/filters/useExecutionFiltersState'; -import { WorkflowExecutionsTable } from 'components/Executions/Tables/WorkflowExecutionsTable'; -import { makeWorkflowExecutionListQuery } from 'components/Executions/workflowExecutionQueries'; -import { SortDirection } from 'models/AdminEntity/types'; -import { executionSortFields } from 'models/Execution/constants'; -import { Execution } from 'models/Execution/types'; -import { BarChart } from 'components/common/BarChart'; -import { - getExecutionTimeData, - getStartExecutionTime, -} from 'components/Entities/EntityExecutionsBarChart'; -import { useExecutionShowArchivedState } from 'components/Executions/filters/useExecutionArchiveState'; -import { useOnlyMyExecutionsFilterState } from 'components/Executions/filters/useOnlyMyExecutionsFilterState'; -import { WaitForData } from 'components/common/WaitForData'; -import { history } from 'routes/history'; -import { Routes } from 'routes/routes'; -import { compact, merge } from 'lodash'; -import { - getProjectAttributes, - getProjectDomainAttributes, -} from 'models/Project/api'; -import t from './strings'; -import { failedToLoadExecutionsString } from './constants'; - -const useStyles = makeStyles((theme: Theme) => ({ - projectStats: { - paddingTop: theme.spacing(7), - paddingBottom: theme.spacing(5), - display: 'flex', - justifyContent: 'space-evenly', - alignItems: 'center', - }, - container: { - display: 'flex', - flex: '1 1 auto', - flexDirection: 'column', - }, - header: { - paddingBottom: theme.spacing(1), - paddingLeft: theme.spacing(1), - borderBottom: `1px solid ${theme.palette.divider}`, - }, - withPaddingX: { - padding: theme.spacing(0, 2, 0, 2), - }, -})); - -export interface ProjectDashboardProps { - projectId: string; - domainId: string; -} - -const defaultSort = { - key: executionSortFields.createdAt, - direction: SortDirection.DESCENDING, -}; - -export const ProjectDashboard: React.FC = ({ - domainId: domain, - projectId: project, -}) => { - const styles = useStyles(); - const archivedFilter = useExecutionShowArchivedState(); - const filtersState = useWorkflowExecutionFiltersState(); - const onlyMyExecutionsFilterState = useOnlyMyExecutionsFilterState({}); - - const allFilters = compact([ - ...filtersState.appliedFilters, - archivedFilter.getFilter(), - onlyMyExecutionsFilterState.getFilter(), - ]); - const config = { - sort: defaultSort, - filter: allFilters, - }; - - // Remount the table whenever we change project/domain/filters to ensure - // things are virtualized correctly. - const tableKey = React.useMemo( - () => - getCacheKey({ - domain, - project, - filters: allFilters, - }), - [domain, project, allFilters], - ); - - const executionsQuery = useInfiniteQuery({ - ...makeWorkflowExecutionListQuery({ domain, project }, config), - }); - - // useInfiniteQuery returns pages of items, but the table would like a single - // flat list. - const executions = React.useMemo( - () => - executionsQuery.data?.pages - ? executionsQuery.data.pages.reduce( - (acc, { data }) => acc.concat(data), - [], - ) - : [], - [executionsQuery.data?.pages], - ); - - const handleBarChartItemClick = React.useCallback(item => { - history.push(Routes.ExecutionDetails.makeUrl(item.metadata)); - }, []); - - // to show only in bar chart view - const last100Executions = useWorkflowExecutions( - { domain, project }, - { - sort: defaultSort, - filter: allFilters, - limit: 100, - }, - ); - - const fetch = React.useCallback( - () => executionsQuery.fetchNextPage(), - [executionsQuery], - ); - - const { value: workflows } = useWorkflowNameList( - { domain, project }, - { limit: limits.NONE }, - ); - const numberOfWorkflows = workflows.length; - const { value: tasks } = useTaskNameList( - { domain, project }, - { limit: limits.NONE }, - ); - const numberOfTasks = tasks.length; - - const queryClient = useQueryClient(); - - const projectDomainAttributesQuery = useQuery< - Admin.ProjectDomainAttributesGetResponse, - Error - >({ - queryKey: ['projectDomainAttributes', project, domain], - queryFn: async () => { - const projectDomainAtributes = await getProjectDomainAttributes({ - domain, - project, - }); - queryClient.setQueryData( - ['projectDomainAttributes', project, domain], - projectDomainAtributes, - ); - return projectDomainAtributes; - }, - }); - - const projectAttributesQuery = useQuery< - Admin.ProjectAttributesGetResponse, - Error - >({ - queryKey: ['projectAttributes', project], - queryFn: async () => { - const projectAtributes = await getProjectAttributes({ - project, - }); - queryClient.setQueryData( - ['projectAttributes', project], - projectAtributes, - ); - return projectAtributes; - }, - enabled: !projectDomainAttributesQuery.isFetching, - }); - - const content = executionsQuery.isLoadingError ? ( - - ) : executionsQuery.isLoading ? ( - - ) : ( - - ); - - const configData = - merge( - projectAttributesQuery.data?.attributes?.matchingAttributes - ?.workflowExecutionConfig, - projectDomainAttributesQuery.data?.attributes?.matchingAttributes - ?.workflowExecutionConfig, - ) ?? undefined; - - const renderDomainSettingsSection = () => ( - - ); - - return ( -
-
- - {t('workflowsTotal', numberOfWorkflows)} - - {t('tasksTotal', numberOfTasks)} -
- - {renderDomainSettingsSection} - -
-
- - - -
- - {t('allExecutionsTitle')} - - - {content} -
-
- ); -}; diff --git a/packages/console/src/components/Project/ProjectDetails.tsx b/packages/console/src/components/Project/ProjectDetails.tsx deleted file mode 100644 index c81ee7c5b..000000000 --- a/packages/console/src/components/Project/ProjectDetails.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import React from 'react'; -import { withRouteParams } from 'components/common/withRouteParams'; -import { useProject } from 'components/hooks/useProjects'; -import { useQueryState } from 'components/hooks/useQueryState'; -import { Project } from 'models/Project/types'; -import { Redirect, Route, Switch } from 'react-router'; -import { Routes } from 'routes/routes'; -import { RouteComponentProps } from 'react-router-dom'; -import { LoadingSpinner } from 'components/common'; -import { ProjectDashboard } from './ProjectDashboard'; -import { ProjectTasks } from './ProjectTasks'; -import { ProjectWorkflows } from './ProjectWorkflows'; -import { ProjectLaunchPlans } from './ProjectLaunchPlans'; - -export interface ProjectDetailsRouteParams { - projectId: string; -} -export type ProjectDetailsProps = ProjectDetailsRouteParams; - -const entityTypeToComponent = { - executions: ProjectDashboard, - tasks: ProjectTasks, - workflows: ProjectWorkflows, - launchPlans: ProjectLaunchPlans, -}; - -const ProjectEntitiesByDomain: React.FC<{ - project: Project; - entityType: 'executions' | 'tasks' | 'workflows' | 'launchPlans'; -}> = ({ entityType, project }) => { - const { params } = useQueryState<{ domain: string }>(); - if (project && !project?.domains) { - throw new Error('No domains exist for this project'); - } - const domainId = React.useMemo(() => { - if (params?.domain) { - return params.domain; - } - return project?.domains ? project?.domains[0].id : ''; - }, [project, project?.domains, params?.domain]); - - const EntityComponent = entityTypeToComponent[entityType]; - - return ( - <> - {project?.id ? ( - - ) : ( - <> - - - )} - - ); -}; - -const ProjectDashboardByDomain: React.FC<{ project: Project }> = ({ - project, -}) => ; - -const ProjectWorkflowsByDomain: React.FC<{ project: Project }> = ({ - project, -}) => ; - -const ProjectTasksByDomain: React.FC<{ project: Project }> = ({ project }) => ( - -); - -const ProjectLaunchPlansByDomain: React.FC<{ project: Project }> = ({ - project, -}) => ; - -/** The view component for the Project landing page */ -export const ProjectDetailsContainer: React.FC = ({ - projectId, -}) => { - const [project] = useProject(projectId); - - if (!project?.id) { - return ; - } - - return ( - - - - - - - - - - - - - - - - ); -}; - -export const ProjectDetails: React.FunctionComponent< - RouteComponentProps -> = withRouteParams(ProjectDetailsContainer); diff --git a/packages/console/src/components/Project/ProjectLaunchPlans.tsx b/packages/console/src/components/Project/ProjectLaunchPlans.tsx deleted file mode 100644 index 7fe696802..000000000 --- a/packages/console/src/components/Project/ProjectLaunchPlans.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { WaitForData } from 'components/common/WaitForData'; -import { SearchableLaunchPlanNameList } from 'components/LaunchPlan/SearchableLaunchPlanNameList'; -import { limits } from 'models/AdminEntity/constants'; -import { SortDirection } from 'models/AdminEntity/types'; -import { launchSortFields } from 'models/Launch/constants'; -import * as React from 'react'; -import { useLaunchPlanInfoList } from '../LaunchPlan/useLaunchPlanInfoList'; - -export interface ProjectLaunchPlansProps { - projectId: string; - domainId: string; -} - -const DEFAULT_SORT = { - direction: SortDirection.ASCENDING, - key: launchSortFields.name, -}; - -/** A listing of the LaunchPlans registered for a project */ -export const ProjectLaunchPlans: React.FC = ({ - domainId: domain, - projectId: project, -}) => { - const launchPlans = useLaunchPlanInfoList( - { domain, project }, - { - limit: limits.NONE, - sort: DEFAULT_SORT, - filter: [], - }, - ); - - return ( - - - - ); -}; diff --git a/packages/console/src/components/Project/ProjectStatusBar.tsx b/packages/console/src/components/Project/ProjectStatusBar.tsx deleted file mode 100644 index f12148fee..000000000 --- a/packages/console/src/components/Project/ProjectStatusBar.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import * as React from 'react'; -import { makeStyles } from '@material-ui/core/styles'; -import classNames from 'classnames'; -import { Link } from 'react-router-dom'; -import { WorkflowExecutionPhase } from 'models/Execution/enums'; -import { barChartColors } from 'components/common/constants'; -import { useCommonStyles } from 'components/common/styles'; - -const useStyles = makeStyles(() => ({ - barContainer: { - display: 'block', - }, - barItem: { - display: 'inline-block', - marginRight: 2, - borderRadius: 2, - width: 10, - height: 12, - backgroundColor: barChartColors.default, - }, - successBarItem: { - backgroundColor: barChartColors.success, - }, - failedBarItem: { - backgroundColor: barChartColors.failure, - }, -})); - -interface ProjectStatusBarProps { - items: WorkflowExecutionPhase[]; - paths: string[]; -} - -/** - * Renders status of executions - * @param items - * @constructor - */ -const ProjectStatusBar: React.FC = ({ - items, - paths, -}) => { - const styles = useStyles(); - const commonStyles = useCommonStyles(); - - return ( -
- {items.map((item, idx) => { - return ( - -
= WorkflowExecutionPhase.FAILED, - })} - /> - - ); - })} -
- ); -}; - -export default ProjectStatusBar; diff --git a/packages/console/src/components/Project/ProjectTasks.tsx b/packages/console/src/components/Project/ProjectTasks.tsx deleted file mode 100644 index b9cc889d6..000000000 --- a/packages/console/src/components/Project/ProjectTasks.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { WaitForData } from 'components/common/WaitForData'; -import { useTaskNameList } from 'components/hooks/useNamedEntity'; -import { SearchableTaskNameList } from 'components/Task/SearchableTaskNameList'; -import { useTaskShowArchivedState } from 'components/Task/useTaskShowArchivedState'; -import { limits } from 'models/AdminEntity/constants'; -import { SortDirection } from 'models/AdminEntity/types'; -import { taskSortFields } from 'models/Task/constants'; -import * as React from 'react'; - -export interface ProjectTasksProps { - projectId: string; - domainId: string; -} - -const DEFAULT_SORT = { - direction: SortDirection.ASCENDING, - key: taskSortFields.name, -}; - -/** A listing of the Tasks registered for a project */ -export const ProjectTasks: React.FC = ({ - domainId: domain, - projectId: project, -}) => { - const archivedFilter = useTaskShowArchivedState(); - - const taskNames = useTaskNameList( - { domain, project }, - { - limit: limits.NONE, - sort: DEFAULT_SORT, - filter: [archivedFilter.getFilter()], - }, - ); - - return ( - - - - ); -}; diff --git a/packages/console/src/components/Project/ProjectWorkflows.tsx b/packages/console/src/components/Project/ProjectWorkflows.tsx deleted file mode 100644 index aaa431079..000000000 --- a/packages/console/src/components/Project/ProjectWorkflows.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { WaitForData } from 'components/common/WaitForData'; -import { useWorkflowShowArchivedState } from 'components/Workflow/filters/useWorkflowShowArchivedState'; -import { SearchableWorkflowNameList } from 'components/Workflow/SearchableWorkflowNameList'; -import { limits } from 'models/AdminEntity/constants'; -import { SortDirection } from 'models/AdminEntity/types'; -import { workflowSortFields } from 'models/Workflow/constants'; -import * as React from 'react'; -import { useWorkflowInfoList } from '../Workflow/useWorkflowInfoList'; - -export interface ProjectWorkflowsProps { - projectId: string; - domainId: string; -} - -const DEFAULT_SORT = { - direction: SortDirection.ASCENDING, - key: workflowSortFields.name, -}; - -/** A listing of the Workflows registered for a project */ -export const ProjectWorkflows: React.FC = ({ - domainId: domain, - projectId: project, -}) => { - const archivedFilter = useWorkflowShowArchivedState(); - const workflows = useWorkflowInfoList( - { domain, project }, - { - limit: limits.NONE, - sort: DEFAULT_SORT, - filter: [archivedFilter.getFilter()], - }, - ); - - return ( - - - - ); -}; diff --git a/packages/console/src/components/Project/constants.ts b/packages/console/src/components/Project/constants.ts deleted file mode 100644 index 89a2a21de..000000000 --- a/packages/console/src/components/Project/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const failedToLoadExecutionsString = 'Failed to load executions.'; diff --git a/packages/console/src/components/Project/strings.ts b/packages/console/src/components/Project/strings.ts deleted file mode 100644 index a40c19310..000000000 --- a/packages/console/src/components/Project/strings.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { createLocalizedString } from '@flyteorg/locale'; - -const str = { - allExecutionsTitle: 'All Executions in the Project', - last100ExecutionsTitle: 'Last 100 Executions in the Project', - tasksTotal: (n: number) => `${n} Tasks`, - workflowsTotal: (n: number) => `${n} Workflows`, -}; - -export { patternKey } from '@flyteorg/locale'; -export default createLocalizedString(str); diff --git a/packages/console/src/components/Project/test/ProjectDashboard.test.tsx b/packages/console/src/components/Project/test/ProjectDashboard.test.tsx deleted file mode 100644 index 5f4b75589..000000000 --- a/packages/console/src/components/Project/test/ProjectDashboard.test.tsx +++ /dev/null @@ -1,260 +0,0 @@ -import { render, waitFor, fireEvent } from '@testing-library/react'; -import { basicPythonWorkflow } from 'mocks/data/fixtures/basicPythonWorkflow'; -import { oneFailedTaskWorkflow } from 'mocks/data/fixtures/oneFailedTaskWorkflow'; -import { insertFixture } from 'mocks/data/insertFixture'; -import { unexpectedError } from 'mocks/errors'; -import { mockServer } from 'mocks/server'; -import { sortQueryKeys } from 'models/AdminEntity/constants'; -import { SortDirection } from 'models/AdminEntity/types'; -import { DomainIdentifierScope, UserProfile } from 'models/Common/types'; -import { executionSortFields } from 'models/Execution/constants'; -import { Execution } from 'models/Execution/types'; -import * as React from 'react'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { MemoryRouter } from 'react-router'; -import { - createTestQueryClient, - disableQueryLogger, - enableQueryLogger, -} from 'test/utils'; -import { useUserProfile } from 'components/hooks/useUserProfile'; -import { FetchableData } from 'components/hooks/types'; -import { loadedFetchable } from 'components/hooks/__mocks__/fetchableData'; -import { - getProjectAttributes, - getProjectDomainAttributes, -} from 'models/Project/api'; -import { Admin } from '@flyteorg/flyteidl-types'; -import * as LocalCache from 'basics/LocalCache'; -import { LocalCacheProvider } from 'basics/LocalCache/ContextProvider'; -import { ProjectDashboard } from '../ProjectDashboard'; -import { failedToLoadExecutionsString } from '../constants'; - -jest.mock('components/hooks/useUserProfile'); -jest.mock('components/Executions/Tables/WorkflowExecutionsTable'); -jest.mock('notistack', () => ({ - useSnackbar: () => ({ enqueueSnackbar: jest.fn() }), -})); - -jest.mock('models/Project/api', () => ({ - getProjectAttributes: jest.fn().mockResolvedValue(() => { - const projectAttributesMock: Admin.ProjectAttributesGetResponse = { - attributes: { - matchingAttributes: { - workflowExecutionConfig: { - maxParallelism: 1, - securityContext: { runAs: { k8sServiceAccount: 'default' } }, - rawOutputDataConfig: { - outputLocationPrefix: - 'cliOutputLocationPrefixFromProjectAttributes', - }, - annotations: { - values: { - cliAnnotationKey: 'cliAnnotationValueFromProjectAttributes', - }, - }, - labels: { - values: { cliLabelKey: 'cliLabelValueFromProjectAttributes' }, - }, - }, - }, - }, - }; - return projectAttributesMock; - }), - getProjectDomainAttributes: jest.fn().mockResolvedValue(() => { - const projectDomainAttributesMock: Admin.ProjectDomainAttributesDeleteResponse = - { - attributes: { - matchingAttributes: { - workflowExecutionConfig: { - maxParallelism: 5, - securityContext: { runAs: { k8sServiceAccount: 'default' } }, - annotations: { - values: { cliAnnotationKey: 'cliAnnotationValue' }, - }, - labels: { values: { cliLabelKey: 'cliLabelValue' } }, - }, - }, - }, - }; - return projectDomainAttributesMock; - }), -})); - -describe('ProjectDashboard', () => { - const mockUseUserProfile = useUserProfile as jest.Mock< - FetchableData - >; - - let basicPythonFixture: ReturnType; - let failedTaskFixture: ReturnType; - let executions1: Execution[]; - let executions2: Execution[]; - let scope: DomainIdentifierScope; - let queryClient: QueryClient; - - const sampleUserProfile: UserProfile = { - subject: 'subject', - } as UserProfile; - - const defaultQueryParams1 = { - [sortQueryKeys.direction]: SortDirection[SortDirection.DESCENDING], - [sortQueryKeys.key]: executionSortFields.createdAt, - }; - - const defaultQueryParams2 = { - filters: 'eq(user,subject)', - [sortQueryKeys.direction]: SortDirection[SortDirection.DESCENDING], - [sortQueryKeys.key]: executionSortFields.createdAt, - }; - - jest.spyOn(LocalCache, 'useLocalCache'); - - beforeEach(() => { - mockUseUserProfile.mockReturnValue(loadedFetchable(null, jest.fn())); - queryClient = createTestQueryClient(); - basicPythonFixture = basicPythonWorkflow.generate(); - failedTaskFixture = oneFailedTaskWorkflow.generate(); - insertFixture(mockServer, basicPythonFixture); - insertFixture(mockServer, failedTaskFixture); - - executions1 = [ - basicPythonFixture.workflowExecutions.top.data, - failedTaskFixture.workflowExecutions.top.data, - ]; - executions2 = []; - const { domain, project } = executions1[0].id; - scope = { domain, project }; - mockServer.insertWorkflowExecutionList( - scope, - executions1, - defaultQueryParams1, - ); - mockServer.insertWorkflowExecutionList( - scope, - executions2, - defaultQueryParams2, - ); - }); - - const renderView = () => - render( - - - - - - - , - ); - - it('should display domain attributes section when config was provided', async () => { - const { getByText } = renderView(); - expect(getProjectDomainAttributes).toHaveBeenCalled(); - await waitFor(() => { - expect(getProjectAttributes).toHaveBeenCalled(); - }); - - await waitFor(() => { - expect(getByText('Domain Settings')).toBeInTheDocument(); - }); - - expect( - getByText('cliOutputLocationPrefixFromProjectAttributes'), - ).toBeInTheDocument(); - expect(getByText('cliAnnotationKey')).toBeInTheDocument(); - }); - - it('should show loading spinner', async () => { - mockUseUserProfile.mockReturnValue( - loadedFetchable(sampleUserProfile, jest.fn()), - ); - const { queryByTestId } = renderView(); - await waitFor(() => {}); - expect(queryByTestId(/loading-spinner/i)).toBeDefined(); - }); - - it('should display WorkflowExecutionsTable and BarChart ', async () => { - mockUseUserProfile.mockReturnValue( - loadedFetchable(sampleUserProfile, jest.fn()), - ); - const { queryByTestId } = renderView(); - await waitFor(() => {}); - expect(queryByTestId('workflow-table')).toBeDefined(); - }); - - it('should not display checkbox if user does not login', async () => { - const { queryByTestId } = renderView(); - await waitFor(() => {}); - expect(mockUseUserProfile).toHaveBeenCalled(); - expect(queryByTestId(/checkbox/i)).toBeNull(); - }); - - it('should display checkboxes if user login', async () => { - mockUseUserProfile.mockReturnValue( - loadedFetchable(sampleUserProfile, jest.fn()), - ); - const { getAllByRole } = renderView(); - - await waitFor(() => {}); - expect(mockUseUserProfile).toHaveBeenCalled(); - - // There are 2 checkboxes on a page: 1 - onlyMyExecutions, 2 - show archived, both unchecked by default - const checkboxes = getAllByRole(/checkbox/i) as HTMLInputElement[]; - expect(checkboxes).toHaveLength(2); - expect(checkboxes[0]).toBeTruthy(); - expect(checkboxes[1]).toBeTruthy(); - }); - - /** user doesn't have its own workflow */ - it('should not display workflow if the user does not have one when filtered onlyMyExecutions', async () => { - mockUseUserProfile.mockReturnValue( - loadedFetchable(sampleUserProfile, jest.fn()), - ); - const { getAllByText, queryAllByText, getAllByRole } = renderView(); - await waitFor(() => {}); - expect(mockUseUserProfile).toHaveBeenCalled(); - - // There are 2 checkboxes on a page: 1 - onlyMyExecutions, 2 - show archived, both unchecked by default - const checkboxes = getAllByRole(/checkbox/i) as HTMLInputElement[]; - expect(checkboxes[0]).toBeTruthy(); - expect(checkboxes[0]?.checked).toEqual(false); - await waitFor(() => - expect(getAllByText(executions1[0].closure.workflowId.name)), - ); - await fireEvent.click(checkboxes[0]); - - // when user selects checkbox, table should have no executions to display - await waitFor(() => - expect( - queryAllByText(executions1[0].closure.workflowId.name), - ).toHaveLength(0), - ); - }); - - describe('when initial load fails', () => { - const errorMessage = 'Something went wrong.'; - // Disable react-query logger output to avoid a console.error - // when the request fails. - beforeEach(() => { - disableQueryLogger(); - mockServer.insertWorkflowExecutionList( - scope, - unexpectedError(errorMessage), - defaultQueryParams1, - ); - }); - afterEach(() => { - enableQueryLogger(); - }); - - it('shows error message', async () => { - const { getByText } = renderView(); - await waitFor(() => expect(getByText(failedToLoadExecutionsString))); - }); - }); -}); diff --git a/packages/console/src/components/Project/test/ProjectTask.test.tsx b/packages/console/src/components/Project/test/ProjectTask.test.tsx deleted file mode 100644 index e97eea30c..000000000 --- a/packages/console/src/components/Project/test/ProjectTask.test.tsx +++ /dev/null @@ -1,167 +0,0 @@ -import { fireEvent, render, waitFor } from '@testing-library/react'; -import { APIContext } from 'components/data/apiContext'; -import { useUserProfile } from 'components/hooks/useUserProfile'; -import { mockAPIContextValue } from 'components/data/__mocks__/apiContext'; -import { FetchableData } from 'components/hooks/types'; -import { loadedFetchable } from 'components/hooks/__mocks__/fetchableData'; -import { FilterOperationName } from 'models/AdminEntity/types'; -import { listNamedEntities } from 'models/Common/api'; -import { - NamedEntity, - NamedEntityIdentifier, - NamedEntityMetadata, - ResourceType, - UserProfile, -} from 'models/Common/types'; -import { NamedEntityState } from 'models/enums'; -import { updateTaskState } from 'models/Task/api'; -import * as React from 'react'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { MemoryRouter } from 'react-router'; -import { createNamedEntity } from 'test/modelUtils'; -import { createTestQueryClient } from 'test/utils'; -import { ProjectTasks } from '../ProjectTasks'; - -export function createTask( - id: NamedEntityIdentifier, - metadata?: Partial, -) { - return createNamedEntity(ResourceType.TASK, id, metadata); -} - -const sampleUserProfile: UserProfile = { - subject: 'subject', -} as UserProfile; - -jest.mock('components/hooks/useUserProfile'); -jest.mock('notistack', () => ({ - useSnackbar: () => ({ enqueueSnackbar: jest.fn() }), -})); - -jest.mock('models/Task/api', () => ({ - updateTaskState: jest.fn().mockResolvedValue({}), -})); - -describe('ProjectTasks', () => { - const project = 'TestProject'; - const domain = 'TestDomain'; - let tasks: NamedEntity[]; - let queryClient: QueryClient; - let mockListNamedEntities: jest.Mock>; - const mockUseUserProfile = useUserProfile as jest.Mock< - FetchableData - >; - - beforeEach(() => { - mockUseUserProfile.mockReturnValue(loadedFetchable(null, jest.fn())); - queryClient = createTestQueryClient(); - tasks = ['MyTask', 'MyOtherTask'].map(name => - createTask({ domain, name, project }), - ); - mockListNamedEntities = jest.fn().mockResolvedValue({ entities: tasks }); - - window.IntersectionObserver = jest.fn().mockReturnValue({ - observe: () => null, - unobserve: () => null, - disconnect: () => null, - }); - }); - - const renderComponent = () => - render( - - - - - - - , - ); - - it('does not show archived tasks', async () => { - const { getByText } = renderComponent(); - await waitFor(() => {}); - - expect(mockListNamedEntities).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - filter: [ - { - key: 'state', - operation: FilterOperationName.EQ, - value: NamedEntityState.NAMED_ENTITY_ACTIVE, - }, - ], - }), - ); - await waitFor(() => expect(getByText('MyTask'))); - }); - - it('should display checkbox if user login', async () => { - mockUseUserProfile.mockReturnValue( - loadedFetchable(sampleUserProfile, jest.fn()), - ); - const { getAllByRole } = renderComponent(); - await waitFor(() => {}); - const checkboxes = getAllByRole(/checkbox/i) as HTMLInputElement[]; - expect(checkboxes).toHaveLength(1); - expect(checkboxes[0]).toBeTruthy(); - expect(checkboxes[0]?.checked).toEqual(false); - }); - - it('should display archive button', async () => { - mockUseUserProfile.mockReturnValue( - loadedFetchable(sampleUserProfile, jest.fn()), - ); - const { getByText, getAllByTitle, findAllByText } = renderComponent(); - await waitFor(() => {}); - - const task = getByText('MyTask'); - expect(task).toBeTruthy(); - - const parent = task?.parentElement?.parentElement?.parentElement!; - fireEvent.mouseOver(parent); - - const archiveButton = getAllByTitle('Archive'); - expect(archiveButton[0]).toBeTruthy(); - - await fireEvent.click(archiveButton[0]); - - const cancelButton = await findAllByText('Cancel'); - await waitFor(() => expect(cancelButton.length).toEqual(1)); - const confirmArchiveButton = - cancelButton?.[0]?.parentElement?.parentElement?.children[0]!; - - expect(confirmArchiveButton).toBeTruthy(); - - await fireEvent.click(confirmArchiveButton!); - - await waitFor(() => { - expect(updateTaskState).toHaveBeenCalledTimes(1); - }); - }); - - it('clicking show archived should hide active tasks', async () => { - mockUseUserProfile.mockReturnValue( - loadedFetchable(sampleUserProfile, jest.fn()), - ); - const { getByText, queryByText, getAllByRole } = renderComponent(); - await waitFor(() => {}); - - // check the checkbox is present - const checkboxes = getAllByRole(/checkbox/i) as HTMLInputElement[]; - expect(checkboxes[0]).toBeTruthy(); - expect(checkboxes[0]?.checked).toEqual(false); - - // check that my task is in document - await waitFor(() => expect(getByText('MyTask'))); - await fireEvent.click(checkboxes[0]); - - // when user selects checkbox, table should have no tasks to display - await waitFor(() => expect(queryByText('MyTask')).not.toBeInTheDocument()); - }); -}); diff --git a/packages/console/src/components/Project/test/ProjectWorkflows.test.tsx b/packages/console/src/components/Project/test/ProjectWorkflows.test.tsx deleted file mode 100644 index f9d0e3c18..000000000 --- a/packages/console/src/components/Project/test/ProjectWorkflows.test.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { fireEvent, render, waitFor } from '@testing-library/react'; -import { APIContext } from 'components/data/apiContext'; -import { mockAPIContextValue } from 'components/data/__mocks__/apiContext'; -import { FetchableData } from 'components/hooks/types'; -import { useUserProfile } from 'components/hooks/useUserProfile'; -import { loadedFetchable } from 'components/hooks/__mocks__/fetchableData'; -import { FilterOperationName } from 'models/AdminEntity/types'; -import { listNamedEntities } from 'models/Common/api'; -import { NamedEntity, UserProfile } from 'models/Common/types'; -import { NamedEntityState } from 'models/enums'; -import * as React from 'react'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { MemoryRouter } from 'react-router'; -import { createWorkflowName } from 'test/modelUtils'; -import { createTestQueryClient } from 'test/utils'; -import { ProjectWorkflows } from '../ProjectWorkflows'; - -const sampleUserProfile: UserProfile = { - subject: 'subject', -} as UserProfile; - -jest.mock('components/hooks/useUserProfile'); -jest.mock('notistack', () => ({ - useSnackbar: () => ({ enqueueSnackbar: jest.fn() }), -})); - -describe('ProjectWorkflows', () => { - const project = 'TestProject'; - const domain = 'TestDomain'; - let workflowNames: NamedEntity[]; - let queryClient: QueryClient; - let mockListNamedEntities: jest.Mock>; - - const mockUseUserProfile = useUserProfile as jest.Mock< - FetchableData - >; - - beforeEach(() => { - mockUseUserProfile.mockReturnValue(loadedFetchable(null, jest.fn())); - queryClient = createTestQueryClient(); - workflowNames = ['MyWorkflow', 'MyOtherWorkflow'].map(name => - createWorkflowName({ domain, name, project }), - ); - mockListNamedEntities = jest - .fn() - .mockResolvedValue({ entities: workflowNames }); - }); - - const renderComponent = () => - render( - - - - - - - , - ); - - it('does not show archived workflows', async () => { - renderComponent(); - await waitFor(() => {}); - - expect(mockListNamedEntities).toHaveBeenCalledWith( - expect.anything(), - expect.objectContaining({ - filter: [ - { - key: 'state', - operation: FilterOperationName.EQ, - value: NamedEntityState.NAMED_ENTITY_ACTIVE, - }, - ], - }), - ); - }); - - it('should display checkbox if user login', async () => { - mockUseUserProfile.mockReturnValue( - loadedFetchable(sampleUserProfile, jest.fn()), - ); - const { getAllByRole } = renderComponent(); - await waitFor(() => {}); - const checkboxes = getAllByRole(/checkbox/i) as HTMLInputElement[]; - expect(checkboxes).toHaveLength(1); - expect(checkboxes[0]).toBeTruthy(); - expect(checkboxes[0]?.checked).toEqual(false); - }); - - /** user doesn't have its own workflow */ - it('clicking show archived should hide active workflows', async () => { - mockUseUserProfile.mockReturnValue( - loadedFetchable(sampleUserProfile, jest.fn()), - ); - const { getByText, queryByText, getAllByRole } = renderComponent(); - await waitFor(() => {}); - const checkboxes = getAllByRole(/checkbox/i) as HTMLInputElement[]; - expect(checkboxes[0]).toBeTruthy(); - expect(checkboxes[0]?.checked).toEqual(false); - await waitFor(() => expect(getByText('MyWorkflow'))); - await fireEvent.click(checkboxes[0]); - // when user selects checkbox, table should have no workflows to display - await waitFor(() => - expect(queryByText('MyWorkflow')).not.toBeInTheDocument(), - ); - }); -}); diff --git a/packages/console/src/components/SelectProject/ProjectList.tsx b/packages/console/src/components/SelectProject/ProjectList.tsx deleted file mode 100644 index 27f03ac35..000000000 --- a/packages/console/src/components/SelectProject/ProjectList.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import { - Button, - Card, - CardActions, - CardContent, - Typography, -} from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { ButtonLink } from 'components/common/ButtonLink'; -import { - LocalStorageProjectDomain, - LOCAL_PROJECT_DOMAIN, - setLocalStore, -} from 'components/common/LocalStoreDefaults'; -import { useCommonStyles } from 'components/common/styles'; -import { Project } from 'models/Project/types'; -import * as React from 'react'; -import { Routes } from 'routes/routes'; -import { defaultProjectDescription } from './constants'; - -const useStyles = makeStyles((theme: Theme) => ({ - projectCard: { - textAlign: 'left', - marginBottom: theme.spacing(2), - minWidth: theme.spacing(36), - maxWidth: theme.spacing(48), - '&:first-of-type': { - marginTop: theme.spacing(1), - }, - }, - projectTitle: { - paddingBottom: 0, - }, -})); - -interface ProjectListProps { - projects: Project[]; -} - -const ProjectCard: React.FC<{ project: Project }> = ({ project }) => { - const styles = useStyles(); - const commonStyles = useCommonStyles(); - const description = project.description - ? project.description - : defaultProjectDescription; - return ( - - - - {project.name} - - - {description} - - - - {project.domains.map(({ id: domainId, name }) => ( - - ))} - - - ); -}; - -/** Displays the available Projects and domains as a list of cards */ -export const ProjectList: React.FC = props => { - const commonStyles = useCommonStyles(); - return ( -
    - {props.projects.map(project => ( -
  • - -
  • - ))} -
- ); -}; diff --git a/packages/console/src/components/SelectProject/SelectProject.tsx b/packages/console/src/components/SelectProject/SelectProject.tsx deleted file mode 100644 index fe322cd41..000000000 --- a/packages/console/src/components/SelectProject/SelectProject.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import Typography from '@material-ui/core/Typography'; -import { SearchableList, SearchResult } from 'components/common/SearchableList'; -import { useProjects } from 'components/hooks/useProjects'; -import { Project } from 'models/Project/types'; -import { TopLevelLayoutContext } from 'components/Navigation/TopLevelLayoutState'; -import { ProjectList } from './ProjectList'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - textAlign: 'center', - }, - buttonContainer: { - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - justifyContent: 'center', - margin: `${theme.spacing(2)} 0`, - }, - searchContainer: { - minWidth: theme.spacing(45), - }, -})); - -const renderProjectList = (projects: SearchResult[]) => ( - p.value)} /> -); - -/** The view component for the landing page of the application. */ -export const SelectProject: React.FC = () => { - const styles = useStyles(); - const [projects] = useProjects(); - - const { isSideNavOpen, closeSideNav } = React.useContext( - TopLevelLayoutContext, - ); - React.useEffect(() => { - // Side nav is always closed on this page - closeSideNav(); - }, [closeSideNav, isSideNavOpen]); - - return ( -
-

Welcome to Flyte

- -

Select a project to get started...

-
-
-
- -
-
-
- ); -}; diff --git a/packages/console/src/components/Tables/DataList.tsx b/packages/console/src/components/Tables/DataList.tsx deleted file mode 100644 index 9b6c00935..000000000 --- a/packages/console/src/components/Tables/DataList.tsx +++ /dev/null @@ -1,242 +0,0 @@ -import { ListProps, Typography } from '@material-ui/core'; -import { makeStyles, Theme, useTheme } from '@material-ui/core/styles'; -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import { useExecutionTableStyles } from 'components/Executions/Tables/styles'; -import * as React from 'react'; -import { - forwardRef, - useImperativeHandle, - useLayoutEffect, - useMemo, - useRef, - useState, -} from 'react'; -import { - AutoSizer, - CellMeasurer, - CellMeasurerCache, - Index, - List, - ListRowRenderer, -} from 'react-virtualized'; -import { - headerGridHeight, - tableGridPadding, - minListContainerHeight, -} from './constants'; -import { LoadMoreRowContent } from './LoadMoreRowContent'; - -const useStyles = makeStyles((theme: Theme) => ({ - headerItem: { - alignItems: 'center', - display: 'flex', - height: '100%', - }, - listContainer: { - display: 'flex', - flexDirection: 'column', - // set minHeight to avoid AutoResizer setting height to 0 - minHeight: theme.spacing(minListContainerHeight), - }, -})); - -export interface DataListRowClickEventParams { - index: number; - data: T; -} - -export interface DataListProps extends ListProps { - className?: string; - height?: number; - noRowsContent?: string | React.ComponentType; - width?: number; - ref?: React.Ref; - rowContentRenderer: ListRowRenderer; - onRetry?(): void; - onRowClick?(params: DataListRowClickEventParams): void; -} - -// When using DataListImpl directly, the auto-sizing behavior is removed. -// So width/height are explicitly required. -export interface DataListImplProps extends DataListProps { - height: number; - width: number; -} - -const createCellMeasurerCache = () => - new CellMeasurerCache({ - fixedWidth: true, - }); - -export interface DataListRef { - recomputeRowHeights(index: number): void; -} - -const DataListImplComponent: React.RefForwardingComponent< - DataListRef, - DataListImplProps -> = (props, ref) => { - const { - height, - value: items, - lastError, - isFetching, - moreItemsAvailable, - onScrollbarPresenceChange, - noRowsContent: NoRowsContent = 'No items found.', - rowContentRenderer, - width, - } = props; - - const styles = useStyles(); - const tableStyles = useExecutionTableStyles(); - const theme = useTheme(); - const lengthRef = useRef(0); - const listRef = useRef(null); - /** We want the cache to persist across renders, which useState will do. - * But we also don't want to be needlessly creating new caches that are - * thrown away immediately. So we're using a creation function which useState - * will call to create the initial value. - */ - const [cellCache, setCellCache] = useState(createCellMeasurerCache); - - const recomputeRow = useMemo( - () => (rowIndex: number) => { - cellCache.clear(rowIndex, 0); - if (listRef.current !== null) { - listRef.current.recomputeRowHeights(rowIndex); - } - }, - [cellCache, listRef], - ); - useImperativeHandle( - ref, - () => ({ - recomputeRowHeights: recomputeRow, - }), - [recomputeRow], - ); - - useLayoutEffect(() => { - if (lengthRef.current >= 0 && items.length > lengthRef.current) { - recomputeRow(lengthRef.current); - } - lengthRef.current = props.value.length; - - // remesuare each row and cache the value when the rows update - setCellCache(createCellMeasurerCache); - }, [items.length]); - - const headerHeight = theme.spacing(headerGridHeight); - const listPadding = theme.spacing(tableGridPadding); - const showLoadMore = items.length && moreItemsAvailable; - - // We want the "load more" content to render at the end of the list. - // We want the list to fill all available space and only have one scrollbar. - // for all content. - // So we make the list the only content which - // can scroll, let react-virtualized treat the "load more" like the - // last row of the list, and then render special content for the last index. - const rowCount = showLoadMore ? items.length + 1 : items.length; - - const noRowsRenderer = () => ( -
- {typeof NoRowsContent === 'string' ? ( - {NoRowsContent} - ) : ( - - )} -
- ); - - const rowRenderer: ListRowRenderer = rowProps => { - const { key, index, parent, style } = rowProps; - let content: React.ReactNode; - if (index === items.length) { - content = ( - - ); - } else { - content = rowContentRenderer(rowProps); - } - - return ( - - {content} - - ); - }; - - const rowGetter = ({ index }: Index) => { - // The last item trick will mean we try to read past the end of the - // list. We don't end up rendering this rowData, but we still need it - // to be valid. - const clamped = Math.min(index, items.length - 1); - return items[clamped]; - }; - - const loadMoreRows = () => props.fetch(); - - return ( - <> - - - ); -}; -const DataListImpl = forwardRef(DataListImplComponent); - -/** The default version of DataList doesn't require a width/height and will expand to - * fill its parent container (this can have odd behavior when using flex or the parent - * doesn't have an explicit width/height set). When passing an explicit width/height, - * the auto-sizing behavior is disabled and a slightly simpler component tree will be rendered. - */ -const DataListComponent: React.RefForwardingComponent< - DataListRef, - DataListProps -> = (props, ref) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - - if (props.width && props.height) { - return ; - } - return ( -
-
- - {({ height, width }) => ( - - )} - -
-
- ); -}; -const DataList = forwardRef(DataListComponent); - -export { DataList, DataListImpl }; diff --git a/packages/console/src/components/Tables/LoadMoreRowContent.tsx b/packages/console/src/components/Tables/LoadMoreRowContent.tsx deleted file mode 100644 index f5cb113cc..000000000 --- a/packages/console/src/components/Tables/LoadMoreRowContent.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Button } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { ButtonCircularProgress } from 'components/common/ButtonCircularProgress'; -import { useCommonStyles } from 'components/common/styles'; -import * as React from 'react'; -import { loadMoreRowGridHeight } from './constants'; - -const useStyles = makeStyles((theme: Theme) => ({ - loadMoreRowContainer: { - alignItems: ' center', - display: ' flex', - flexDirection: 'column', - height: theme.spacing(loadMoreRowGridHeight), - justifyContent: ' center', - padding: `${theme.spacing(2)}px`, - width: '100%', - }, - button: { - color: theme.palette.text.secondary, - }, -})); - -interface LoadMoreRowContentProps { - lastError: string | Error | null; - isFetching: boolean; - style?: any; - loadMoreRows: () => void; -} - -/** Handles rendering the content below a table, which can be a "Load More" - * button, or an error - */ -export const LoadMoreRowContent: React.FC = props => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - const { loadMoreRows, lastError, isFetching, style } = props; - - const button = ( - - ); - const errorContent = lastError ? ( -
- Failed to load additional items -
- ) : null; - - return ( -
- {errorContent} - {button} -
- ); -}; diff --git a/packages/console/src/components/Tables/PaginatedDataList.tsx b/packages/console/src/components/Tables/PaginatedDataList.tsx deleted file mode 100644 index 2bf44dc10..000000000 --- a/packages/console/src/components/Tables/PaginatedDataList.tsx +++ /dev/null @@ -1,229 +0,0 @@ -import * as React from 'react'; -import classnames from 'classnames'; -import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; -import Table from '@material-ui/core/Table'; -import TableBody from '@material-ui/core/TableBody'; -import TableCell from '@material-ui/core/TableCell'; -import TableContainer from '@material-ui/core/TableContainer'; -import TableHead from '@material-ui/core/TableHead'; -import TableRow from '@material-ui/core/TableRow'; -import TableSortLabel from '@material-ui/core/TableSortLabel'; -import Paper from '@material-ui/core/Paper'; -import { PropsWithChildren } from 'react'; -import { Typography } from '@material-ui/core'; -import { ColumnDefinition } from '../Executions/Tables/types'; -import { headerFontFamily, tableHeaderColor } from '../Theme/constants'; -import { headerGridHeight } from './constants'; -import { workflowVersionsTableColumnWidths } from '../Executions/Tables/constants'; - -type Order = 'asc' | 'desc'; - -interface PaginatedDataListHeaderProps { - classes: ReturnType; - columns: ColumnDefinition[]; - onRequestSort: (event: React.MouseEvent, property: string) => void; - order: Order; - orderBy: string; - rowCount: number; - showRadioButton?: boolean; -} - -interface PaginatedDataListProps { - columns: ColumnDefinition[]; - showRadioButton?: boolean; - totalRows: number; - data: T[]; - rowRenderer: (row: T) => void; - noDataString: string; - fillEmptyRows?: boolean; -} - -const useStyles = makeStyles((theme: Theme) => - createStyles({ - root: { - width: '100%', - }, - paper: { - width: '100%', - marginBottom: theme.spacing(2), - }, - table: { - minWidth: 200, - }, - radioButton: { - width: workflowVersionsTableColumnWidths.radio, - }, - header: { - borderBottom: `4px solid ${theme.palette.divider}`, - borderTop: `1px solid ${theme.palette.divider}`, - color: tableHeaderColor, - fontFamily: headerFontFamily, - height: theme.spacing(headerGridHeight), - }, - cell: { - padding: theme.spacing(1), - textTransform: 'uppercase', - }, - visuallyHidden: { - border: 0, - clip: 'rect(0 0 0 0)', - height: 1, - margin: -1, - overflow: 'hidden', - padding: 0, - position: 'absolute', - top: 20, - width: 1, - }, - }), -); - -/** - * Renders pagination table's header - * @param props - * @constructor - */ -const PaginatedDataListHeader = ( - props: PropsWithChildren, -) => { - const { classes, order, orderBy, onRequestSort, columns, showRadioButton } = - props; - const createSortHandler = - (property: string) => (event: React.MouseEvent) => { - onRequestSort(event, property); - }; - const cellClass = classnames(classes.cell, classes.header); - - return ( - - - {showRadioButton && ( - -   - - )} - {columns.map(column => ( - - - {column.label} - {orderBy === column.key ? ( - - {order === 'desc' ? 'sorted descending' : 'sorted ascending'} - - ) : null} - - - ))} - - - ); -}; - -/** - * Renders pagination table based on the column information and the total number of rows. - * @param columns - * @param data - * @param rowRenderer - * @param totalRows - * @param showRadioButton - * @param noDataString - * @constructor - */ -const PaginatedDataList = ({ - columns, - data, - rowRenderer, - totalRows, - showRadioButton, - fillEmptyRows = true, -}: PropsWithChildren>) => { - const classes = useStyles(); - const [order, setOrder] = React.useState('asc'); - const [orderBy, setOrderBy] = React.useState('calories'); - const [page] = React.useState(0); - const [rowsPerPage] = React.useState(5); - - const handleRequestSort = ( - event: React.MouseEvent, - property: string, - ) => { - const isAsc = orderBy === property && order === 'asc'; - setOrder(isAsc ? 'desc' : 'asc'); - setOrderBy(property); - }; - - // const handleChangePage = (event: unknown, newPage: number) => { - // setPage(newPage); - // }; - // - // const handleChangeRowsPerPage = (event: React.ChangeEvent) => { - // setRowsPerPage(parseInt(event.target.value, 10)); - // setPage(0); - // }; - - const emptyRows = - rowsPerPage - Math.min(rowsPerPage, totalRows - page * rowsPerPage); - - return ( -
- - - - - - {data.map((row, _index) => { - return rowRenderer(row); - })} - {fillEmptyRows && !showRadioButton && emptyRows > 0 && ( - - - - )} - -
-
- {/* */} -
-
- ); -}; - -export default PaginatedDataList; diff --git a/packages/console/src/components/Tables/constants.ts b/packages/console/src/components/Tables/constants.ts deleted file mode 100644 index d9df7d56c..000000000 --- a/packages/console/src/components/Tables/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const loadMoreRowGridHeight = 6; -export const headerGridHeight = 6; -export const tableGridPadding = 1; -export const minListContainerHeight = 24; diff --git a/packages/console/src/components/Task/SearchableTaskNameList.tsx b/packages/console/src/components/Task/SearchableTaskNameList.tsx deleted file mode 100644 index 9f5ee7aea..000000000 --- a/packages/console/src/components/Task/SearchableTaskNameList.tsx +++ /dev/null @@ -1,306 +0,0 @@ -import { - Typography, - IconButton, - Button, - CircularProgress, -} from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import ErrorOutline from '@material-ui/icons/ErrorOutline'; -import classnames from 'classnames'; -import { SearchResult } from 'components/common/SearchableList'; -import { - SearchableNamedEntityListProps, - useNamedEntityListStyles, -} from 'components/common/SearchableNamedEntityList'; -import { useCommonStyles } from 'components/common/styles'; -import { WaitForData } from 'components/common/WaitForData'; -import { NamedEntity } from 'models/Common/types'; -import * as React from 'react'; -import { useState } from 'react'; -import { IntersectionOptions, useInView } from 'react-intersection-observer'; -import reactLoadingSkeleton from 'react-loading-skeleton'; -import { Link } from 'react-router-dom'; -import { Routes } from 'routes/routes'; -import UnarchiveOutline from '@material-ui/icons/UnarchiveOutlined'; -import ArchiveOutlined from '@material-ui/icons/ArchiveOutlined'; -import { useSnackbar } from 'notistack'; -import { updateTaskState } from 'models/Task/api'; -import { useMutation } from 'react-query'; -import { FilterableNamedEntityList } from 'components/common/FilterableNamedEntityList'; -import { NamedEntityState } from 'models/enums'; -import { useLatestTaskVersion } from './useLatestTask'; -import t from '../Executions/Tables/WorkflowExecutionTable/strings'; -import { SimpleTaskInterface } from './SimpleTaskInterface'; -import { isTaskArchived } from './utils'; - -const Skeleton = reactLoadingSkeleton; - -export const showOnHoverClass = 'showOnHover'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - // All children using the showOnHover class will be hidden until - // the mouse enters the container - [`& .${showOnHoverClass}`]: { - opacity: 0, - }, - [`&:hover .${showOnHoverClass}`]: { - opacity: 1, - }, - }, - actionContainer: { - display: 'flex', - right: 0, - top: 0, - position: 'absolute', - height: '100%', - }, - archiveCheckbox: { - whiteSpace: 'nowrap', - }, - centeredChild: { - alignItems: 'center', - marginRight: 24, - }, - confirmationButton: { - borderRadius: 0, - minWidth: '100px', - minHeight: '53px', - }, - description: { - color: theme.palette.text.secondary, - marginTop: theme.spacing(0.5), - marginBottom: theme.spacing(0.5), - }, - errorContainer: { - // Fix icon left alignment - marginLeft: '-2px', - }, - interfaceContainer: { - width: '100%', - }, - taskName: { - fontWeight: 'bold', - }, -})); - -interface TaskNameRowProps { - label: React.ReactNode; - entityName: NamedEntity; -} - -interface SearchableTaskNameListProps { - names: NamedEntity[]; - onArchiveFilterChange: (showArchievedItems: boolean) => void; - showArchived: boolean; -} - -const intersectionOptions: IntersectionOptions = { - rootMargin: '100px 0px', - triggerOnce: true, -}; - -const TaskInterfaceError: React.FC = () => { - const { flexCenter, hintText, iconRight } = useCommonStyles(); - const { errorContainer } = useStyles(); - return ( -
- -
- Failed to load task interface details. -
-
- ); -}; - -const TaskInterface: React.FC<{ - taskName: NamedEntity; - setShowItem: (visible: boolean) => void; -}> = ({ taskName }) => { - const styles = useStyles(); - const task = useLatestTaskVersion(taskName.id); - return ( -
- - {() => } - -
- ); -}; - -const getArchiveIcon = (isArchived: boolean) => - isArchived ? : ; - -interface SimpleTaskActionsProps { - item: NamedEntity; - setShowItem: (visible: boolean) => void; -} - -const SimpleTaskActions: React.FC = ({ - item, - setShowItem, -}) => { - const styles = useStyles(); - const { enqueueSnackbar } = useSnackbar(); - const { id } = item; - const isArchived = isTaskArchived(item); - const [isUpdating, setIsUpdating] = useState(false); - const [showConfirmation, setShowConfirmation] = useState(false); - - const mutation = useMutation( - (newState: NamedEntityState) => updateTaskState(id, newState), - { - onMutate: () => setIsUpdating(true), - onSuccess: () => { - enqueueSnackbar(t('archiveSuccess', !isArchived), { - variant: 'success', - }); - setShowItem(false); - }, - onError: () => { - enqueueSnackbar(`${mutation.error ?? t('archiveError', !isArchived)}`, { - variant: 'error', - }); - }, - onSettled: () => { - setShowConfirmation(false); - setIsUpdating(false); - }, - }, - ); - - const onArchiveClick = (event: React.MouseEvent) => { - event.stopPropagation(); - event.preventDefault(); - setShowConfirmation(true); - }; - - const onConfirmArchiveClick = (event: React.MouseEvent) => { - event.stopPropagation(); - event.preventDefault(); - mutation.mutate( - isTaskArchived(item) - ? NamedEntityState.NAMED_ENTITY_ACTIVE - : NamedEntityState.NAMED_ENTITY_ARCHIVED, - ); - }; - - const onCancelClick = (event: React.MouseEvent) => { - event.stopPropagation(); - event.preventDefault(); - setShowConfirmation(false); - }; - - const singleItemStyle = - isUpdating || !showConfirmation ? styles.centeredChild : ''; - - return ( -
- {isUpdating ? ( - - - - ) : showConfirmation ? ( - <> - - - - ) : ( - - {getArchiveIcon(isArchived)} - - )} -
- ); -}; - -const TaskNameRow: React.FC = ({ label, entityName }) => { - const styles = useStyles(); - const listStyles = useNamedEntityListStyles(); - const [inViewRef, inView] = useInView(intersectionOptions); - const description = entityName?.metadata?.description; - const [showItem, setShowItem] = useState(true); - - if (!showItem) { - return null; - } - - return ( -
-
-
{label}
- {description && ( - - {description} - - )} - {!!inView && ( - - )} - -
-
- ); -}; - -/** Renders a searchable list of Task names, with associated metadata */ -export const SearchableTaskNameList: React.FC< - Omit & - SearchableTaskNameListProps -> = props => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - const renderItem = ({ key, value, content }: SearchResult) => ( - - - - ); - return ( - - ); -}; diff --git a/packages/console/src/components/Task/SimpleTaskInterface.tsx b/packages/console/src/components/Task/SimpleTaskInterface.tsx deleted file mode 100644 index aa2d3e6a7..000000000 --- a/packages/console/src/components/Task/SimpleTaskInterface.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { noneString } from 'common/constants'; -import { sortedObjectKeys } from 'common/utils'; -import { DetailsGroup } from 'components/common/DetailsGroup'; -import { useCommonStyles } from 'components/common/styles'; -import { - formatType, - getInputDefintionForLiteralType, -} from 'components/Launch/LaunchForm/utils'; -import { Variable } from 'models/Common/types'; -import { Task } from 'models/Task/types'; -import * as React from 'react'; - -const useStyles = makeStyles((theme: Theme) => ({ - label: { - marginRight: theme.spacing(1), - }, - typeAnnotationContainer: { - paddingLeft: theme.spacing(0.5), - }, - typeAnnotation: { - color: theme.palette.secondary.main, - }, -})); - -const emptyVariables = { - variables: {}, -}; - -const VariablesList: React.FC<{ variables: Record }> = ({ - variables, -}) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - const output = sortedObjectKeys(variables).reduce( - (out, name, idx) => { - const variable = variables[name]; - out.push( - - {idx > 0 ? ', ' : ''} - {name} - , - ); - const typeString = formatType( - getInputDefintionForLiteralType(variable.type), - ); - if (typeString.length > 0) { - out.push( - - ({typeString}) - , - ); - } - return out; - }, - [], - ); - return ( - - {output.length ? output : noneString} - - ); -}; - -/** Renders Task interface details as two basic string lists with type annotations. */ -export const SimpleTaskInterface: React.FC<{ task: Task }> = ({ task }) => { - const { inputs = emptyVariables, outputs = emptyVariables } = - task.closure.compiledTask.template.interface || {}; - const description = task.shortDescription || 'No description found.'; - return ( -
- , - }, - { - name: 'outputs', - content: , - }, - { - name: 'description', - content: {description}, - }, - ]} - /> -
- ); -}; diff --git a/packages/console/src/components/Task/index.ts b/packages/console/src/components/Task/index.ts deleted file mode 100644 index 81168bf65..000000000 --- a/packages/console/src/components/Task/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './taskQueries'; diff --git a/packages/console/src/components/Task/taskQueries.ts b/packages/console/src/components/Task/taskQueries.ts deleted file mode 100644 index 519766cb2..000000000 --- a/packages/console/src/components/Task/taskQueries.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { QueryInput, QueryType } from 'components/data/types'; -import { Identifier } from 'models/Common/types'; -import { getTask } from 'models/Task/api'; -import { TaskTemplate } from 'models/Task/types'; -import { QueryClient } from 'react-query'; - -export function makeTaskTemplateQuery( - id: Identifier, -): QueryInput { - return { - queryKey: [QueryType.TaskTemplate, id], - queryFn: async () => (await getTask(id)).closure.compiledTask.template, - // Task templates are immutable and safe to cache indefinitely - staleTime: Infinity, - }; -} - -export function fetchTaskTemplate(queryClient: QueryClient, id: Identifier) { - return queryClient.fetchQuery(makeTaskTemplateQuery(id)); -} diff --git a/packages/console/src/components/Task/test/SimpleTaskInterface.test.tsx b/packages/console/src/components/Task/test/SimpleTaskInterface.test.tsx deleted file mode 100644 index 1748430cc..000000000 --- a/packages/console/src/components/Task/test/SimpleTaskInterface.test.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { render } from '@testing-library/react'; -import { set } from 'lodash'; -import { SimpleType, TypedInterface, Variable } from 'models/Common/types'; -import { Task } from 'models/Task/types'; -import * as React from 'react'; -import { SimpleTaskInterface } from '../SimpleTaskInterface'; - -function setTaskInterface(task: Task, values: TypedInterface): Task { - return set(task, 'closure.compiledTask.template.interface', values); -} - -describe('SimpleTaskInterface', () => { - const values: Record = { - value2: { type: { simple: SimpleType.INTEGER } }, - value1: { type: { simple: SimpleType.INTEGER } }, - }; - - it('renders sorted inputs', () => { - const task = setTaskInterface({} as Task, { - inputs: { variables: { ...values } }, - }); - - const { getAllByText } = render( - , - ); - const labels = getAllByText(/value/); - expect(labels.length).toBe(2); - expect(labels[0]).toHaveTextContent(/value1/); - expect(labels[1]).toHaveTextContent(/value2/); - }); - - it('renders sorted outputs', () => { - const task = setTaskInterface({} as Task, { - outputs: { variables: { ...values } }, - }); - - const { getAllByText } = render( - , - ); - const labels = getAllByText(/value/); - expect(labels.length).toBe(2); - expect(labels[0]).toHaveTextContent(/value1/); - expect(labels[1]).toHaveTextContent(/value2/); - }); -}); diff --git a/packages/console/src/components/Task/useLatestTask.ts b/packages/console/src/components/Task/useLatestTask.ts deleted file mode 100644 index bf55de00f..000000000 --- a/packages/console/src/components/Task/useLatestTask.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { useFetchableData } from 'components/hooks/useFetchableData'; -import { NotFoundError } from 'errors/fetchErrors'; -import { SortDirection } from 'models/AdminEntity/types'; -import { NamedEntityIdentifier } from 'models/Common/types'; -import { listTasks } from 'models/Task/api'; -import { taskSortFields } from 'models/Task/constants'; -import { Task } from 'models/Task/types'; - -async function fetchLatestTaskVersion(id: NamedEntityIdentifier) { - const { entities } = await listTasks(id, { - limit: 1, - sort: { - key: taskSortFields.createdAt, - direction: SortDirection.DESCENDING, - }, - }); - if (entities.length === 0) { - throw new NotFoundError( - `Latest version for task ${id.project}/${id.domain}/${id.name}`, - ); - } - return entities[0]; -} - -/** A hook for fetching the latest version of a task, equivalent to listing - * tasks for a project/domain/name with limit=1 - */ -export function useLatestTaskVersion(taskId: NamedEntityIdentifier) { - return useFetchableData( - { - debugName: 'LatestTaskVersion', - doFetch: fetchLatestTaskVersion, - defaultValue: {} as Task, - useCache: true, - }, - taskId, - ); -} diff --git a/packages/console/src/components/Task/utils.ts b/packages/console/src/components/Task/utils.ts deleted file mode 100644 index 50ac2de1b..000000000 --- a/packages/console/src/components/Task/utils.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NamedEntity } from 'models/Common/types'; -import { NamedEntityState } from 'models/enums'; - -function isTaskStateArchive(task: NamedEntity): boolean { - const state = task?.metadata?.state ?? null; - return !!state && state === NamedEntityState.NAMED_ENTITY_ARCHIVED; -} - -export function isTaskArchived(task: NamedEntity): boolean { - return isTaskStateArchive(task); -} diff --git a/packages/console/src/components/Theme/constants.ts b/packages/console/src/components/Theme/constants.ts deleted file mode 100644 index 8837031d5..000000000 --- a/packages/console/src/components/Theme/constants.ts +++ /dev/null @@ -1,125 +0,0 @@ -/* eslint import/no-mutable-exports: 1 */ -import { AppConfig, FlyteNavigation } from '@flyteorg/common'; -import { TaskType } from 'models/Task/constants'; -import { COLOR_SPECTRUM } from './colorSpectrum'; - -export let bodyFontFamily = 'Lato, helvetica, arial, sans-serif'; -export const headerFontFamily = '"Open Sans", helvetica, arial, sans-serif'; - -export const whiteColor = COLOR_SPECTRUM.white.color; -// eslint-disable-next-line import/no-mutable-exports -export let primaryColor = COLOR_SPECTRUM.purple60.color; -// eslint-disable-next-line import/no-mutable-exports -export let primaryLightColor = COLOR_SPECTRUM.purple30.color; -// eslint-disable-next-line import/no-mutable-exports -export let primaryDarkColor = COLOR_SPECTRUM.purple70.color; -// eslint-disable-next-line import/no-mutable-exports -export let primaryHighlightColor = COLOR_SPECTRUM.purple60.color; -export const secondaryColor = COLOR_SPECTRUM.indigo100.color; -export const secondaryBackgroundColor = COLOR_SPECTRUM.gray5.color; -export const subnavBackgroundColor = COLOR_SPECTRUM.gray7.color; - -export const primaryTextColor = COLOR_SPECTRUM.gray100.color; -export const secondaryTextColor = COLOR_SPECTRUM.gray60.color; -// eslint-disable-next-line import/no-mutable-exports -export let interactiveTextColor = COLOR_SPECTRUM.purple60.color; -// eslint-disable-next-line import/no-mutable-exports -export let interactiveTextDisabledColor = COLOR_SPECTRUM.purple30.color; -// eslint-disable-next-line import/no-mutable-exports -export let interactiveTextBackgroundColor = COLOR_SPECTRUM.purple5.color; -// eslint-disable-next-line -export let positiveTextColor = COLOR_SPECTRUM.mint60.color; -// eslint-disable-next-line -export let negativeTextColor = COLOR_SPECTRUM.sunset60.color; -export const mutedPrimaryTextColor = '#4A4A4A'; - -export const tableHeaderColor = COLOR_SPECTRUM.gray40.color; -export const tablePlaceholderColor = COLOR_SPECTRUM.gray40.color; - -export const selectedActionColor = COLOR_SPECTRUM.gray10.color; - -export const separatorColor = COLOR_SPECTRUM.gray15.color; -export const skeletonColor = COLOR_SPECTRUM.gray15.color; -export const skeletonHighlightColor = COLOR_SPECTRUM.gray0.color; -export const listhoverColor = COLOR_SPECTRUM.gray5.color; -export const nestedListColor = COLOR_SPECTRUM.gray0.color; -export const buttonHoverColor = COLOR_SPECTRUM.gray0.color; -export const inputFocusBorderColor = COLOR_SPECTRUM.blue60.color; - -export const warningIconColor = COLOR_SPECTRUM.sunset60.color; -export const infoIconColor = COLOR_SPECTRUM.blue40.color; - -export const dangerousButtonBorderColor = COLOR_SPECTRUM.red20.color; -export const dangerousButtonColor = COLOR_SPECTRUM.red30.color; -export const dangerousButtonHoverColor = COLOR_SPECTRUM.red40.color; -export const mutedButtonColor = COLOR_SPECTRUM.gray30.color; -export const mutedButtonHoverColor = COLOR_SPECTRUM.gray60.color; - -export const errorBackgroundColor = '#FBFBFC'; - -export const workflowLabelColor = COLOR_SPECTRUM.gray25.color; -export const launchPlanLabelColor = COLOR_SPECTRUM.gray25.color; - -export let statusColors = { - FAILURE: COLOR_SPECTRUM.red20.color, - RUNNING: COLOR_SPECTRUM.blue20.color, - QUEUED: COLOR_SPECTRUM.amber20.color, - SUCCESS: COLOR_SPECTRUM.mint20.color, - SKIPPED: COLOR_SPECTRUM.sunset20.color, - UNKNOWN: COLOR_SPECTRUM.gray20.color, - WARNING: COLOR_SPECTRUM.yellow40.color, - PAUSED: COLOR_SPECTRUM.amber30.color, -}; - -export let graphStatusColors = { - FAILED: '#e90000', - FAILING: '#f2a4ad', - SUCCEEDED: '#37b789', - ABORTED: '#be25d7', - RUNNING: '#2892f4', - QUEUED: '#dfd71b', - PAUSED: '#f5a684', - UNDEFINED: '#4a2839', -}; - -export type TaskColorMap = Record; -export const taskColors: TaskColorMap = { - [TaskType.PYTHON]: '#7157D9', - [TaskType.SPARK]: '#00B3A4', - [TaskType.MPI]: '#00B3A4', - [TaskType.BATCH_HIVE]: '#E1E8ED', - [TaskType.DYNAMIC]: '#E1E8ED', - [TaskType.HIVE]: '#E1E8ED', - [TaskType.SIDECAR]: '#E1E8ED', - [TaskType.UNKNOWN]: '#E1E8ED', - [TaskType.WAITABLE]: '#E1E8ED', - [TaskType.ARRAY]: '#E1E8ED', - // plugins - [TaskType.ARRAY_AWS]: '#E1E8ED', - [TaskType.ARRAY_K8S]: '#E1E8ED', - [TaskType.BRANCH]: '#E1E8ED', -}; - -export const bodyFontSize = '0.875rem'; -export const smallFontSize = '0.75rem'; - -export const smallIconSize = '1.2rem'; - -export const updateConstants = (config: AppConfig | undefined) => { - if (config) { - bodyFontFamily = config.bodyFontFamily || bodyFontFamily; - primaryColor = config.primaryColor || primaryColor; - primaryLightColor = config.primaryLightColor || primaryLightColor; - primaryDarkColor = config.primaryDarkColor || primaryDarkColor; - primaryHighlightColor = - config.primaryHighlightColor || primaryHighlightColor; - interactiveTextColor = config.interactiveTextColor || interactiveTextColor; - interactiveTextDisabledColor = - config.interactiveTextDisabledColor || interactiveTextDisabledColor; - interactiveTextBackgroundColor = - config.interactiveTextBackgroundColor || interactiveTextBackgroundColor; - - statusColors = config.statusColors || statusColors; - graphStatusColors = config.graphStatusColors || graphStatusColors; - } -}; diff --git a/packages/console/src/components/Theme/muiTheme.ts b/packages/console/src/components/Theme/muiTheme.ts deleted file mode 100644 index ce51a4b5e..000000000 --- a/packages/console/src/components/Theme/muiTheme.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { createTheme } from '@material-ui/core/styles'; -import { AppConfig } from '@flyteorg/common'; -import { merge } from 'lodash'; -import { - bodyFontFamily, - headerFontFamily, - inputFocusBorderColor, - mutedButtonColor, - primaryColor, - primaryDarkColor, - primaryHighlightColor, - primaryLightColor, - primaryTextColor, - secondaryColor, - secondaryTextColor, - selectedActionColor, - whiteColor, -} from './constants'; -import { COLOR_SPECTRUM } from './colorSpectrum'; - -export const getMuiTheme = (config: AppConfig | undefined) => { - const theme = createTheme( - merge( - { - palette: { - primary: { - main: primaryColor, - light: primaryLightColor, - dark: primaryDarkColor, - }, - secondary: { - main: secondaryColor, - }, - background: { - default: whiteColor, - // default: '#F4F4FA', - }, - text: { - primary: primaryTextColor, - secondary: secondaryTextColor, - }, - action: { - selected: selectedActionColor, - hoverOpacity: 0.15, - }, - }, - props: { - MuiIconButton: { - centerRipple: false, - }, - MuiPopover: { - elevation: 7, - }, - MuiAppBar: { - elevation: 1, - color: 'secondary', - }, - MuiTabs: { - indicatorColor: 'primary', - }, - MuiPaper: { - elevation: 0, - }, - }, - shape: { - borderRadius: 8, - }, - typography: { - // https://material-ui.com/style/typography/ - fontFamily: headerFontFamily, - body1: { - fontSize: '14px', - fontFamily: bodyFontFamily, - }, - body2: { - fontSize: '14px', - fontFamily: bodyFontFamily, - }, - h3: { - fontSize: '16px', - fontWeight: 'bold', - lineHeight: '22px', - }, - h4: { - fontSize: '14px', - fontWeight: 'bold', - lineHeight: '20px', - }, - h6: { - fontSize: '.875rem', - fontWeight: 'bold', - lineHeight: 1.357, - }, - overline: { - fontFamily: headerFontFamily, - fontSize: '.75rem', - fontWeight: 'bold', - letterSpacing: 'normal', - lineHeight: '1rem', - textTransform: 'uppercase', - }, - subtitle1: { - fontFamily: headerFontFamily, - fontSize: '.75rem', - letterSpacing: 'normal', - lineHeight: '1rem', - }, - }, - }, - config?.themeOptions || {}, - ), - ); - - const muiTheme = createTheme( - merge( - { - overrides: { - MuiButton: { - root: { - fontWeight: 600, - }, - label: { - textTransform: 'initial', - }, - contained: { - boxShadow: 'none', - color: whiteColor, - ['&:active']: { - boxShadow: 'none', - }, - }, - outlined: { - backgroundColor: 'transparent', - }, - outlinedPrimary: { - border: `1px solid ${theme.palette.primary.main}`, - color: theme.palette.primary.main, - ['&:hover']: { - borderColor: theme.palette.primary.dark, - color: theme.palette.primary.dark, - }, - }, - text: { - color: theme.palette.text.secondary, - ['&:hover']: { - color: theme.palette.text.primary, - }, - }, - }, - MuiOutlinedInput: { - root: { - '& $notchedOutline': { - borderRadius: 4, - }, - '&$focused $notchedOutline': { - borderColor: - config?.inputFocusBorderColor || inputFocusBorderColor, - }, - }, - }, - MuiTab: { - labelIcon: { - minHeight: '64px', - paddingTop: 0, - }, - wrapper: { - flexDirection: 'row', - ['& svg']: { - marginLeft: 12, - position: 'relative', - left: 12, - }, - }, - root: { - fontWeight: 600, - fontSize: '.875rem', - margin: `0 ${theme.spacing(1.75)}px`, - minWidth: 0, - padding: `0 ${theme.spacing(1.75)}px`, - textTransform: 'none', - [theme.breakpoints.up('md')]: { - fontSize: '.875rem', - margin: `0 ${theme.spacing(1.75)}px`, - minWidth: 0, - padding: `0 ${theme.spacing(1.75)}px`, - }, - ['&:hover']: { - backgroundColor: theme.palette.action.hover, - }, - }, - }, - MuiTabs: { - indicator: { - height: 4, - backgroundColor: primaryHighlightColor, - }, - }, - MuiSwitch: { - switchBase: { - // Controls default (unchecked) color for the thumb - color: whiteColor, - }, - colorSecondary: { - '&$checked': { - // Controls checked color for the thumb - color: whiteColor, - }, - }, - track: { - // Controls default (unchecked) color for the track - opacity: 1, - backgroundColor: mutedButtonColor, - '$checked$checked + &': { - // Controls checked color for the track - opacity: 1, - backgroundColor: COLOR_SPECTRUM.mint20.color, - }, - }, - }, - }, - // this will merge the two themes - }, - theme, - ), - ); - - return muiTheme; -}; diff --git a/packages/console/src/components/Theme/useTheme.ts b/packages/console/src/components/Theme/useTheme.ts deleted file mode 100644 index e7d2df891..000000000 --- a/packages/console/src/components/Theme/useTheme.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - Theme as MaterialTheme, - useTheme as useMaterialTheme, -} from '@material-ui/core/styles'; -import { Variant } from '@material-ui/core/styles/createTypography'; -import { measureText } from 'components/common/utils'; - -export interface Theme extends MaterialTheme { - measureTextWidth(variant: Variant, text: string): number; -} - -/** Provides an enhanced version of the Material Theme */ -export function useTheme(): Theme { - const theme = useMaterialTheme(); - const measureTextWidth = (variant: Variant, text: string) => { - const { fontFamily, fontSize, fontWeight } = theme.typography[variant]; - const fontDefinition = `${fontWeight} ${fontSize} ${fontFamily}`; - return measureText(fontDefinition, text).width; - }; - - return { ...theme, measureTextWidth }; -} diff --git a/packages/console/src/components/Workflow/SearchableWorkflowNameList.tsx b/packages/console/src/components/Workflow/SearchableWorkflowNameList.tsx deleted file mode 100644 index 3215c887a..000000000 --- a/packages/console/src/components/Workflow/SearchableWorkflowNameList.tsx +++ /dev/null @@ -1,412 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core/styles'; -import DeviceHub from '@material-ui/icons/DeviceHub'; -import classNames from 'classnames'; -import { useNamedEntityListStyles } from 'components/common/SearchableNamedEntityList'; -import { useCommonStyles } from 'components/common/styles'; -import { - separatorColor, - primaryTextColor, - workflowLabelColor, -} from 'components/Theme/constants'; -import * as React from 'react'; -import { useEffect, useState } from 'react'; -import { Link } from 'react-router-dom'; -import { Routes } from 'routes/routes'; -import { Shimmer } from 'components/common/Shimmer'; -import { debounce } from 'lodash'; -import { - IconButton, - Typography, - FormControlLabel, - Checkbox, - FormGroup, - Button, - CircularProgress, -} from '@material-ui/core'; -import UnarchiveOutline from '@material-ui/icons/UnarchiveOutlined'; -import ArchiveOutlined from '@material-ui/icons/ArchiveOutlined'; -import { useMutation } from 'react-query'; -import { NamedEntityState } from 'models/enums'; -import { updateWorkflowState } from 'models/Workflow/api'; -import { useSnackbar } from 'notistack'; -import { padExecutionPaths, padExecutions } from 'common/utils'; -import { WorkflowListStructureItem } from './types'; -import ProjectStatusBar from '../Project/ProjectStatusBar'; -import { workflowNoInputsString } from '../Launch/LaunchForm/constants'; -import { SearchableInput } from '../common/SearchableList'; -import { useSearchableListState } from '../common/useSearchableListState'; -import { useWorkflowInfoItem } from './useWorkflowInfoItem'; -import t from '../Executions/Tables/WorkflowExecutionTable/strings'; -import { isWorkflowArchived } from './utils'; - -interface SearchableWorkflowNameItemProps { - item: WorkflowListStructureItem; -} - -interface SearchableWorkflowNameItemActionsProps { - item: WorkflowListStructureItem; - setHideItem: (hide: boolean) => void; -} - -interface SearchableWorkflowNameListProps { - workflows: WorkflowListStructureItem[]; - onArchiveFilterChange: (showArchievedItems: boolean) => void; - showArchived: boolean; -} - -export const showOnHoverClass = 'showOnHover'; - -const useStyles = makeStyles((theme: Theme) => ({ - actionContainer: { - display: 'flex', - right: 0, - top: 0, - position: 'absolute', - height: '100%', - }, - archiveCheckbox: { - whiteSpace: 'nowrap', - }, - centeredChild: { - alignItems: 'center', - marginRight: 24, - }, - confirmationButton: { - borderRadius: 0, - minWidth: '100px', - minHeight: '53px', - '&:last-child': { - borderRadius: '0px 16px 16px 0px', // to ensure that cancel button will have rounded corners on the right side - }, - }, - container: { - padding: theme.spacing(2), - paddingRight: theme.spacing(5), - }, - filterGroup: { - display: 'flex', - flexWrap: 'nowrap', - flexDirection: 'row', - margin: theme.spacing(4, 5, 2, 2), - }, - - itemContainer: { - marginBottom: 15, - borderRadius: 16, - padding: '23px 30px', - border: `1px solid ${separatorColor}`, - display: 'flex', - flexDirection: 'column', - alignItems: 'flex-start', - position: 'relative', - // All children using the showOnHover class will be hidden until - // the mouse enters the container - [`& .${showOnHoverClass}`]: { - opacity: 0, - }, - [`&:hover .${showOnHoverClass}`]: { - opacity: 1, - }, - }, - itemName: { - display: 'flex', - fontWeight: 600, - color: primaryTextColor, - marginBottom: 10, - }, - itemDescriptionRow: { - color: '#757575', - marginBottom: 30, - width: '100%', - }, - itemIcon: { - marginRight: 14, - color: '#636379', - }, - itemRow: { - display: 'flex', - marginBottom: 10, - '&:last-child': { - marginBottom: 0, - }, - alignItems: 'center', - width: '100%', - }, - itemLabel: { - width: 140, - fontSize: 14, - color: workflowLabelColor, - }, - searchInputContainer: { - paddingLeft: 0, - }, - w100: { - flex: 1, - }, -})); - -const getArchiveIcon = (isArchived: boolean) => - isArchived ? : ; - -const SearchableWorkflowNameItemActions: React.FC< - SearchableWorkflowNameItemActionsProps -> = ({ item, setHideItem }) => { - const styles = useStyles(); - const { enqueueSnackbar } = useSnackbar(); - const { id } = item; - const isArchived = isWorkflowArchived(item); - const [isUpdating, setIsUpdating] = useState(false); - const [showConfirmation, setShowConfirmation] = useState(false); - - const mutation = useMutation( - (newState: NamedEntityState) => updateWorkflowState(id, newState), - { - onMutate: () => setIsUpdating(true), - onSuccess: () => { - enqueueSnackbar(t('archiveSuccess', !isArchived), { - variant: 'success', - }); - setHideItem(true); - }, - onError: () => { - enqueueSnackbar(`${mutation.error ?? t('archiveError', !isArchived)}`, { - variant: 'error', - }); - }, - onSettled: () => { - setShowConfirmation(false); - setIsUpdating(false); - }, - }, - ); - - const onArchiveClick = (event: React.MouseEvent) => { - event.stopPropagation(); - event.preventDefault(); - setShowConfirmation(true); - }; - - const onConfirmArchiveClick = (event: React.MouseEvent) => { - event.stopPropagation(); - event.preventDefault(); - mutation.mutate( - isWorkflowArchived(item) - ? NamedEntityState.NAMED_ENTITY_ACTIVE - : NamedEntityState.NAMED_ENTITY_ARCHIVED, - ); - }; - - const onCancelClick = (event: React.MouseEvent) => { - event.stopPropagation(); - event.preventDefault(); - setShowConfirmation(false); - }; - - const singleItemStyle = - isUpdating || !showConfirmation ? styles.centeredChild : ''; - return ( -
- {isUpdating ? ( - - - - ) : showConfirmation ? ( - <> - - - - ) : ( - - {getArchiveIcon(isArchived)} - - )} -
- ); -}; - -/** - * Renders individual searchable workflow item - * @param item - * @returns - */ -const SearchableWorkflowNameItem: React.FC = - React.memo(({ item }) => { - const commonStyles = useCommonStyles(); - const listStyles = useNamedEntityListStyles(); - const styles = useStyles(); - const { id, description } = item; - const { data: workflow, isLoading } = useWorkflowInfoItem(id); - - const [hideItem, setHideItem] = useState(false); - - if (hideItem) { - return null; - } - - return ( - -
-
- -
{id.name}
-
- {description && ( - - {description} - - )} -
-
Last execution time
-
- {isLoading ? ( - - ) : workflow.latestExecutionTime ? ( - workflow.latestExecutionTime - ) : ( - No executions found - )} -
-
-
-
Last 10 executions
- {isLoading ? ( - - ) : ( - - )} -
-
-
Inputs
-
- {isLoading ? ( - - ) : ( - workflow.inputs ?? {workflowNoInputsString} - )} -
-
-
-
Outputs
-
- {isLoading ? ( - - ) : ( - workflow?.outputs ?? No output data found. - )} -
-
-
-
Description
-
- {isLoading ? ( - - ) : ( - workflow?.description ?? No description found. - )} -
-
- -
- - ); - }); - -/** - * Renders a searchable list of Workflow names, with associated descriptions - * @param workflows - * @constructor - */ -export const SearchableWorkflowNameList: React.FC< - SearchableWorkflowNameListProps -> = ({ workflows, onArchiveFilterChange, showArchived }) => { - const styles = useStyles(); - const [search, setSearch] = useState(''); - const { results, setSearchString } = useSearchableListState({ - items: workflows, - propertyGetter: ({ id }) => id.name, - }); - - useEffect(() => { - const debouncedSearch = debounce(() => setSearchString(search), 1000); - debouncedSearch(); - }, [search]); - - const onSearchChange = (event: React.ChangeEvent) => { - const searchString = event.target.value; - setSearch(searchString); - }; - - const onClear = () => setSearch(''); - - return ( - <> - - - onArchiveFilterChange(checked)} - /> - } - label="Show Only Archived Workflows" - /> - -
- {results.map(({ value }) => ( - - ))} -
- - ); -}; diff --git a/packages/console/src/components/Workflow/StaticGraphContainer.tsx b/packages/console/src/components/Workflow/StaticGraphContainer.tsx deleted file mode 100644 index b99717870..000000000 --- a/packages/console/src/components/Workflow/StaticGraphContainer.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import * as React from 'react'; -import { Workflow, WorkflowId } from 'models/Workflow/types'; -import { useQuery, useQueryClient } from 'react-query'; -import { WaitForQuery } from 'components/common/WaitForQuery'; -import { DataError } from 'components/Errors/DataError'; -import { transformerWorkflowToDag } from 'components/WorkflowGraph/transformerWorkflowToDag'; -import { ReactFlowWrapper } from 'components/flytegraph/ReactFlow/ReactFlowWrapper'; -import { ConvertFlyteDagToReactFlows } from 'components/flytegraph/ReactFlow/transformDAGToReactFlowV2'; -import { getRFBackground } from 'components/flytegraph/ReactFlow/utils'; -import { - ConvertDagProps, - RFWrapperProps, -} from 'components/flytegraph/ReactFlow/types'; -import { makeWorkflowQuery } from './workflowQueries'; - -export const renderStaticGraph = props => { - const workflow = props.closure.compiledWorkflow; - const { dag } = transformerWorkflowToDag(workflow); - const rfGraphJson = ConvertFlyteDagToReactFlows({ - root: dag, - maxRenderDepth: 0, - currentNestedView: [], - isStaticGraph: true, - } as ConvertDagProps); - - const backgroundStyle = getRFBackground().static; - const ReactFlowProps: RFWrapperProps = { - backgroundStyle, - rfGraphJson: rfGraphJson, - currentNestedView: [], - }; - return ; -}; - -export interface StaticGraphContainerProps { - workflowId: WorkflowId; -} - -export const StaticGraphContainer: React.FC = ({ - workflowId, -}) => { - const containerStyle: React.CSSProperties = { - display: 'flex', - width: '100%', - }; - const workflowQuery = useQuery( - makeWorkflowQuery(useQueryClient(), workflowId), - ); - - return ( -
- - {renderStaticGraph} - -
- ); -}; diff --git a/packages/console/src/components/Workflow/WorkflowVersionDetails.tsx b/packages/console/src/components/Workflow/WorkflowVersionDetails.tsx deleted file mode 100644 index e9af8fb6c..000000000 --- a/packages/console/src/components/Workflow/WorkflowVersionDetails.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import * as React from 'react'; -import { withRouteParams } from 'components/common/withRouteParams'; -import { ResourceIdentifier, ResourceType } from 'models/Common/types'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { useProject } from 'components/hooks/useProjects'; -import { StaticGraphContainer } from 'components/Workflow/StaticGraphContainer'; -import { WorkflowId } from 'models/Workflow/types'; -import { entitySections } from 'components/Entities/constants'; -import { EntityDetailsHeader } from 'components/Entities/EntityDetailsHeader'; -import { EntityVersions } from 'components/Entities/EntityVersions'; -import { RouteComponentProps } from 'react-router-dom'; -import { LoadingSpinner } from 'components/common'; - -const useStyles = makeStyles((_theme: Theme) => ({ - verionDetailsContatiner: { - display: 'flex', - flexDirection: 'column', - flexWrap: 'nowrap', - overflow: 'hidden', - height: `calc(100vh - ${_theme.spacing(1)}rem)`, - }, - staticGraphContainer: { - display: 'flex', - height: '60%', - width: '100%', - flex: '1', - }, - versionsContainer: { - display: 'flex', - flex: '0 1 auto', - height: '40%', - flexDirection: 'column', - overflowY: 'scroll', - }, -})); - -interface WorkflowVersionDetailsRouteParams { - projectId: string; - domainId: string; - workflowName: string; - workflowVersion: string; -} - -/** - * The view component for the Workflow Versions page - * @param projectId - * @param domainId - * @param workflowName - */ -const WorkflowVersionDetailsContainer: React.FC< - WorkflowVersionDetailsRouteParams -> = ({ projectId, domainId, workflowName, workflowVersion }) => { - const workflowId = React.useMemo( - () => ({ - resourceType: ResourceType.WORKFLOW, - project: projectId, - domain: domainId, - name: workflowName, - version: workflowVersion, - }), - [projectId, domainId, workflowName, workflowVersion], - ); - - const id = workflowId as ResourceIdentifier; - const sections = entitySections[ResourceType.WORKFLOW]; - const [project] = useProject(workflowId.project); - const styles = useStyles(); - - if (!project?.id) { - return ; - } - - return ( - <> - -
-
- -
-
- -
-
- - ); -}; - -export const WorkflowVersionDetails: React.FunctionComponent< - RouteComponentProps -> = withRouteParams( - WorkflowVersionDetailsContainer, -); diff --git a/packages/console/src/components/Workflow/index.ts b/packages/console/src/components/Workflow/index.ts deleted file mode 100644 index de0436a3a..000000000 --- a/packages/console/src/components/Workflow/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './workflowQueries'; diff --git a/packages/console/src/components/Workflow/types.ts b/packages/console/src/components/Workflow/types.ts deleted file mode 100644 index 9c58014f6..000000000 --- a/packages/console/src/components/Workflow/types.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { WorkflowId } from 'models/Workflow/types'; -import { WorkflowExecutionPhase } from 'models/Execution/enums'; -import { WorkflowExecutionIdentifier } from 'models/Execution/types'; -import { NamedEntityIdentifier } from 'models/Common/types'; -import { NamedEntityState } from 'models/enums'; - -export type WorkflowListItem = { - id: WorkflowId; - inputs?: string; - outputs?: string; - latestExecutionTime?: string; - executionStatus?: WorkflowExecutionPhase[]; - executionIds?: WorkflowExecutionIdentifier[]; - description?: string; - state: NamedEntityState; -}; - -export type WorkflowListStructureItem = { - id: NamedEntityIdentifier; - description: string; - state: NamedEntityState; -}; diff --git a/packages/console/src/components/Workflow/useWorkflowInfoItem.ts b/packages/console/src/components/Workflow/useWorkflowInfoItem.ts deleted file mode 100644 index 0f6e03df4..000000000 --- a/packages/console/src/components/Workflow/useWorkflowInfoItem.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { Core } from '@flyteorg/flyteidl-types'; -import { NamedEntityIdentifier, Identifier } from 'models/Common/types'; -import { FilterOperationName, SortDirection } from 'models/AdminEntity/types'; -import { executionSortFields } from 'models/Execution/constants'; -import { WorkflowExecutionIdentifier } from 'models/Execution/types'; -import { listExecutions } from 'models/Execution/api'; -import { listWorkflows } from 'models/Workflow/api'; -import { listLaunchPlans } from 'models/Launch/api'; -import { workflowSortFields } from 'models/Workflow/constants'; -import Long from 'long'; -import { formatDateUTC } from 'common/formatters'; -import { timestampToDate } from 'common/utils'; -import { useQuery } from 'react-query'; -import { - getInputsForWorkflow, - getOutputsForWorkflow, -} from '../Launch/LaunchForm/getInputs'; - -export const useWorkflowInfoItem = ({ - domain, - project, - name, -}: NamedEntityIdentifier): { - data: { - latestExecutionTime?: any; - executionStatus?: Core.WorkflowExecution.Phase[] | undefined; - executionIds?: WorkflowExecutionIdentifier[] | undefined; - id?: Identifier | undefined; - inputs?: string | undefined; - outputs?: string | undefined; - description?: string | undefined; - }; - isLoading: boolean; - error: unknown; -} => { - const { - data: executionInfo, - isLoading: executionLoading, - error: executionError, - } = useQuery( - ['workflow-executions', domain, project, name], - async () => { - const { entities: executions } = await listExecutions( - { domain, project }, - { - sort: { - key: executionSortFields.createdAt, - direction: SortDirection.DESCENDING, - }, - filter: [ - { - key: 'workflow.name', - operation: FilterOperationName.EQ, - value: name, - }, - ], - limit: 10, - }, - ); - const executionIds = executions.map(execution => execution.id); - let latestExecutionTime; - const hasExecutions = executions.length > 0; - if (hasExecutions) { - const latestExecution = executions[0].closure.createdAt; - const timeStamp = { - nanos: latestExecution.nanos, - seconds: Long.fromValue(latestExecution.seconds!), - }; - latestExecutionTime = formatDateUTC(timestampToDate(timeStamp)); - } - const executionStatus = executions.map( - execution => execution.closure.phase, - ); - return { - latestExecutionTime, - executionStatus, - executionIds, - }; - }, - { - staleTime: 1000 * 60 * 5, - }, - ); - - const { - data: workflowInfo, - isLoading: workflowLoading, - error: workflowError, - } = useQuery( - ['workflow-info', domain, project, name], - async () => { - const { - entities: [workflow], - } = await listWorkflows( - { domain, project, name }, - { - limit: 1, - sort: { - key: workflowSortFields.createdAt, - direction: SortDirection.DESCENDING, - }, - }, - ); - const { id } = workflow; - const { - entities: [launchPlan], - } = await listLaunchPlans({ domain, project, name }, { limit: 1 }); - const parsedInputs = getInputsForWorkflow( - workflow, - launchPlan, - undefined, - ); - const inputs = - parsedInputs.length > 0 - ? parsedInputs.map(input => input.label).join(', ') - : undefined; - const parsedOutputs = getOutputsForWorkflow(launchPlan); - const outputs = - parsedOutputs.length > 0 ? parsedOutputs.join(', ') : undefined; - const description = - workflow?.shortDescription && workflow?.shortDescription.length > 0 - ? workflow.shortDescription - : undefined; - return { id, inputs, outputs, description }; - }, - { - staleTime: 1000 * 60 * 5, - }, - ); - - return { - data: { - ...workflowInfo, - ...executionInfo, - }, - isLoading: executionLoading || workflowLoading, - error: executionError ?? workflowError, - }; -}; diff --git a/packages/console/src/components/Workflow/useWorkflowInfoList.ts b/packages/console/src/components/Workflow/useWorkflowInfoList.ts deleted file mode 100644 index 5a2a488f4..000000000 --- a/packages/console/src/components/Workflow/useWorkflowInfoList.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { DomainIdentifierScope, ResourceType } from 'models/Common/types'; -import { RequestConfig } from 'models/AdminEntity/types'; -import { usePagination } from 'components/hooks/usePagination'; -import { useAPIContext } from 'components/data/apiContext'; -import { WorkflowListStructureItem } from './types'; - -export const useWorkflowInfoList = ( - scope: DomainIdentifierScope, - config?: RequestConfig, -) => { - const { listNamedEntities } = useAPIContext(); - - return usePagination( - { ...config, fetchArg: scope }, - async (scope, requestConfig) => { - const { entities, ...rest } = await listNamedEntities( - { ...scope, resourceType: ResourceType.WORKFLOW }, - requestConfig, - ); - - return { - entities: entities.map(({ id, metadata: { description, state } }) => ({ - id, - description, - state, - })), - ...rest, - }; - }, - ); -}; diff --git a/packages/console/src/components/Workflow/utils.ts b/packages/console/src/components/Workflow/utils.ts deleted file mode 100644 index fbd3c1295..000000000 --- a/packages/console/src/components/Workflow/utils.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NamedEntityState } from 'models/enums'; -import { WorkflowListStructureItem } from './types'; - -function isWorkflowStateArchive(workflow: WorkflowListStructureItem): boolean { - const state = workflow?.state ?? null; - return !!state && state === NamedEntityState.NAMED_ENTITY_ARCHIVED; -} - -export function isWorkflowArchived( - workflow: WorkflowListStructureItem, -): boolean { - return isWorkflowStateArchive(workflow); -} diff --git a/packages/console/src/components/Workflow/workflowQueries.ts b/packages/console/src/components/Workflow/workflowQueries.ts deleted file mode 100644 index 8545b5f75..000000000 --- a/packages/console/src/components/Workflow/workflowQueries.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { log } from 'common/log'; -import { QueryInput, QueryType } from 'components/data/types'; -import { extractTaskTemplates } from 'components/hooks/utils'; -import { ExecutionData } from 'models'; -import { getNodeExecutionData } from 'models/Execution/api'; -import { getWorkflow } from 'models/Workflow/api'; -import { Workflow, WorkflowId } from 'models/Workflow/types'; -import { QueryClient } from 'react-query'; - -export function makeWorkflowQuery( - queryClient: QueryClient, - id: WorkflowId, -): QueryInput { - return { - queryKey: [QueryType.Workflow, id], - queryFn: async () => { - const workflow = await getWorkflow(id); - // On successful workflow fetch, extract and cache all task templates - // stored on the workflow so that we don't need to fetch them separately - // if future queries reference them. - extractTaskTemplates(workflow).forEach(task => - queryClient.setQueryData([QueryType.TaskTemplate, task.id], task), - ); - - return workflow; - }, - // `Workflow` objects (individual versions) are immutable and safe to - // cache indefinitely once retrieved in full - staleTime: Infinity, - }; -} - -export interface NodeExecutionDynamicWorkflowQueryResult { - [key: string]: ExecutionData; -} -export function makeNodeExecutionDynamicWorkflowQuery( - parentsToFetch, -): QueryInput { - const parentsIds = Object.keys(parentsToFetch); - return { - queryKey: [QueryType.DynamicWorkflowFromNodeExecution, parentsToFetch], - // don't make any requests as long as there are no dynamic node executions to fetch - enabled: !!parentsIds?.length, - queryFn: async () => { - return await Promise.all( - parentsIds - .filter(id => parentsToFetch[id]) - .map(id => { - const executionId = parentsToFetch[id]; - if (!executionId) { - // TODO FC#377: This check and filter few lines abode need to be deleted - // when Branch node support would be added - log.error(`Graph missing info for ${id}`); - } - return getNodeExecutionData(executionId.id).then(value => { - return { key: id, value: value }; - }); - }), - ).then(values => { - const output: { [key: string]: any } = {}; - for (let i = 0; i < values.length; i++) { - /* Filter to only include dynamicWorkflow */ - if (values[i].value.dynamicWorkflow) { - output[values[i].key] = values[i].value; - } - } - return output; - }); - }, - }; -} - -export async function fetchWorkflow(queryClient: QueryClient, id: WorkflowId) { - return queryClient.fetchQuery(makeWorkflowQuery(queryClient, id)); -} diff --git a/packages/console/src/components/WorkflowGraph/InputOutputNodeRenderer.tsx b/packages/console/src/components/WorkflowGraph/InputOutputNodeRenderer.tsx deleted file mode 100644 index 5c4192f6e..000000000 --- a/packages/console/src/components/WorkflowGraph/InputOutputNodeRenderer.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { measureText } from 'components/flytegraph/layoutUtils'; -import { Node } from 'components/flytegraph/Node'; -import { NodeRendererProps } from 'components/flytegraph/types'; -import { taskColors } from 'components/Theme/constants'; -import { DAGNode } from 'models/Graph/types'; -import { TaskType } from 'models/Task/constants'; -import * as React from 'react'; - -const textWidths: Dictionary = {}; -function getTextWidthForLabel(label: string, fontSize: number) { - const key = `${fontSize}:${label}`; - if (textWidths[key] != null) { - return textWidths[key]; - } - const computed = measureText(fontSize, label).width; - textWidths[key] = computed; - return computed; -} - -interface InputOutputNodeRendererProps extends NodeRendererProps { - label: string; -} - -/** Special case renderer for the start/end nodes in a graph */ -export const InputOutputNodeRenderer: React.FC< - InputOutputNodeRendererProps -> = props => { - const { node, config, label } = props; - const fillColor = taskColors[TaskType.UNKNOWN]; - const textWidth = getTextWidthForLabel(label, config.fontSize); - - return ( - - ); -}; diff --git a/packages/console/src/components/WorkflowGraph/TaskNodeRenderer.tsx b/packages/console/src/components/WorkflowGraph/TaskNodeRenderer.tsx deleted file mode 100644 index 461a47e21..000000000 --- a/packages/console/src/components/WorkflowGraph/TaskNodeRenderer.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import * as React from 'react'; -import { Node } from 'components/flytegraph/Node'; -import { NodeRendererProps } from 'components/flytegraph/types'; -import { taskColors } from 'components/Theme/constants'; -import { DAGNode } from 'models/Graph/types'; -import { isEndNode, isStartNode } from 'models/Node/utils'; -import { TaskType } from 'models/Task/constants'; -import { InputOutputNodeRenderer } from './InputOutputNodeRenderer'; - -const TaskNode: React.FC> = props => { - const { node, config } = props; - let fillColor = taskColors[TaskType.UNKNOWN]; - if (node.data && node.data.taskTemplate) { - const mappedColor = taskColors[node.data.taskTemplate.type as TaskType]; - if (mappedColor) { - fillColor = mappedColor; - } - } - return ; -}; - -/** Assigns colors to DAGNodes based on the type of task contained in `data` */ -export const TaskNodeRenderer: React.FC> = props => { - if (isStartNode(props.node)) { - return ; - } - if (isEndNode(props.node)) { - return ; - } - return ; -}; diff --git a/packages/console/src/components/WorkflowGraph/WorkflowGraph.tsx b/packages/console/src/components/WorkflowGraph/WorkflowGraph.tsx deleted file mode 100644 index 2c46e75ab..000000000 --- a/packages/console/src/components/WorkflowGraph/WorkflowGraph.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import { ReactFlowGraphComponent } from 'components/flytegraph/ReactFlow/ReactFlowGraphComponent'; -import { NonIdealState } from 'components/common/NonIdealState'; -import { CompiledNode } from 'models/Node/types'; -import { ReactFlowBreadCrumbProvider } from 'components/flytegraph/ReactFlow/ReactFlowBreadCrumbProvider'; -import { useNodeExecutionsById } from 'components/Executions/contextProvider/NodeExecutionDetails'; -import t from './strings'; - -export interface DynamicWorkflowMapping { - rootGraphNodeId: CompiledNode; - dynamicWorkflow: any; - dynamicExecutions: any[]; -} - -export const WorkflowGraph: React.FC<{}> = () => { - const { - dagData: { mergedDag, dagError }, - } = useNodeExecutionsById(); - - if (dagError) { - return ( - - ); - } - - // If the dag is empty, show the message, instead of trying to display it - if (!mergedDag) { - return ( - - ); - } - - return ( - - - - ); -}; diff --git a/packages/console/src/components/common/BarChart.tsx b/packages/console/src/components/common/BarChart.tsx deleted file mode 100644 index 0c680ada0..000000000 --- a/packages/console/src/components/common/BarChart.tsx +++ /dev/null @@ -1,178 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { smallFontSize } from 'components/Theme/constants'; -import { COLOR_SPECTRUM } from 'components/Theme/colorSpectrum'; -import { Tooltip, Typography, Zoom } from '@material-ui/core'; - -const useStyles = makeStyles((theme: Theme) => ({ - chartContainer: { - paddingLeft: theme.spacing(1), - paddingRight: theme.spacing(3), - paddingTop: theme.spacing(1), - minHeight: '135px', - }, - title: { - marginTop: theme.spacing(2), - paddingBottom: theme.spacing(1), - paddingLeft: theme.spacing(1), - borderBottom: `1px solid ${theme.palette.divider}`, - }, - wrapper: { - display: 'flex', - flexDirection: 'column', - marginBottom: theme.spacing(2.5), - }, - header: { - display: 'flex', - justifyContent: 'space-between', - marginBottom: theme.spacing(0.75), - fontSize: smallFontSize, - color: COLOR_SPECTRUM.gray40.color, - }, - body: { - display: 'flex', - alignItems: 'stretch', - borderLeft: '1.04174px dashed #C1C1C1', - borderRight: '1.04174px dashed #C1C1C1', - minHeight: theme.spacing(10.5), - }, - item: { - flex: 1, - display: 'flex', - flexDirection: 'column', - justifyContent: 'flex-end', - alignItems: 'center', - '&:last-child': { - marginRight: 0, - }, - }, - itemBar: { - borderRadius: 2, - marginRight: theme.spacing(0.25), - minHeight: theme.spacing(0.75), - cursor: 'pointer', - width: '80%', - marginLeft: '10%', - }, -})); - -interface BarChartData { - value: number; - color: string; - metadata?: any; - tooltip?: React.ReactChild; -} - -interface BarChartItemProps extends BarChartData { - onClick?: () => void; - isSelected: boolean; -} - -interface BarChartProps { - title: string; - data: BarChartData[]; - startDate?: string; - onClickItem?: (item: any) => void; - chartIds: string[]; -} - -/** - * Display individual chart item for the BarChart component - * @param value - * @param color - * @constructor - */ -export const BarChartItem: React.FC = ({ - value, - color, - isSelected, - tooltip, - onClick, -}) => { - const styles = useStyles(); - - const content = ( -
- ); - - return ( -
- {tooltip ? ( - {tooltip}} TransitionComponent={Zoom}> - {content} - - ) : ( - content - )} -
- ); -}; - -/** - * Display information as bar chart with value and color - * @param data - * @param startDate - * @constructor - */ -export const BarChart: React.FC = ({ - title, - chartIds, - data, - startDate, - onClickItem, -}) => { - const styles = useStyles(); - - const maxHeight = React.useMemo(() => { - return Math.max(...data.map(x => Math.log2(x.value))); - }, [data]); - - const handleClickItem = React.useCallback( - item => () => { - if (onClickItem) { - onClickItem(item); - } - }, - [onClickItem], - ); - - return ( -
- - {title} - -
-
-
- {startDate} - Most Recent -
-
- {data.map((item, index) => ( - - ))} -
-
-
-
- ); -}; diff --git a/packages/console/src/components/common/ButtonCircularProgress.tsx b/packages/console/src/components/common/ButtonCircularProgress.tsx deleted file mode 100644 index bb0f67d45..000000000 --- a/packages/console/src/components/common/ButtonCircularProgress.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { CircularProgress } from '@material-ui/core'; -import { makeStyles } from '@material-ui/core/styles'; -import * as React from 'react'; - -const useStyles = makeStyles({ - root: { - position: 'absolute', - top: '50%', - left: '50%', - marginTop: -12, - marginLeft: -12, - }, -}); - -export const ButtonCircularProgress: React.FC<{}> = () => { - const styles = useStyles(); - return ; -}; diff --git a/packages/console/src/components/common/ButtonLink.tsx b/packages/console/src/components/common/ButtonLink.tsx deleted file mode 100644 index d52c02385..000000000 --- a/packages/console/src/components/common/ButtonLink.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import * as React from 'react'; -import { - Link as RouterLink, - LinkProps as RouterLinkProps, -} from 'react-router-dom'; - -export const ButtonLink = React.forwardRef( - (props, ref) => , -); diff --git a/packages/console/src/components/common/ClosableDialogTitle.tsx b/packages/console/src/components/common/ClosableDialogTitle.tsx deleted file mode 100644 index 3f5e74a8c..000000000 --- a/packages/console/src/components/common/ClosableDialogTitle.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { DialogTitle, IconButton, Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import Close from '@material-ui/icons/Close'; -import { useEscapeKey } from 'components/hooks/useKeyListener'; -import * as React from 'react'; - -const useStyles = makeStyles((theme: Theme) => ({ - root: { - margin: 0, - padding: theme.spacing(2), - }, - closeButton: { - color: theme.palette.text.primary, - position: 'absolute', - right: theme.spacing(1), - top: theme.spacing(1), - }, -})); - -export interface ClosableDialogTitleProps { - children: React.ReactNode; - onClose: () => void; -} - -/** A replacement for MUI's DialogTitle which also renders a close button */ -export const ClosableDialogTitle: React.FC = ({ - children, - onClose, -}) => { - const styles = useStyles(); - - // Close modal on escape key press - useEscapeKey(onClose); - - return ( - - {children} - {onClose ? ( - - - - ) : null} - - ); -}; diff --git a/packages/console/src/components/common/DataTable.tsx b/packages/console/src/components/common/DataTable.tsx deleted file mode 100644 index 8fae8a573..000000000 --- a/packages/console/src/components/common/DataTable.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core/styles'; -import * as React from 'react'; -import { - Paper, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, -} from '@material-ui/core'; -import { COLOR_SPECTRUM } from 'components/Theme/colorSpectrum'; -import classNames from 'classnames'; - -const useStyles = makeStyles((theme: Theme) => ({ - headerCell: { - padding: theme.spacing(1, 0, 1, 0), - color: COLOR_SPECTRUM.gray40.color, - }, - cell: { - padding: theme.spacing(1, 0, 1, 0), - minWidth: '100px', - }, - withRightPadding: { - paddingRight: theme.spacing(1), - }, -})); - -export interface DataTableProps { - data: { [k: string]: string }; -} - -export const DataTable: React.FC = ({ data }) => { - const styles = useStyles(); - - return ( - - - - - Key - Value - - - - {Object.keys(data).map(key => ( - - - {key} - - {data[key]} - - ))} - -
-
- ); -}; diff --git a/packages/console/src/components/common/DetailsGroup.tsx b/packages/console/src/components/common/DetailsGroup.tsx deleted file mode 100644 index 7ac261d34..000000000 --- a/packages/console/src/components/common/DetailsGroup.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { makeStyles, Theme, useTheme } from '@material-ui/core/styles'; -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import * as React from 'react'; - -const useStyles = makeStyles((theme: Theme) => ({ - rowsContainer: { - margin: `${theme.spacing(1)}px 0`, - }, - rowContainer: { - display: 'flex', - marginTop: theme.spacing(0.5), - }, - groupLabel: { - marginRight: theme.spacing(2), - }, -})); - -export interface DetailsItem { - name: string; - content: string | JSX.Element; -} - -interface DetailsGroupProps { - className?: string; - items: DetailsItem[]; - /** Width of the labels in *grid units* */ - labelWidthGridUnits?: number; -} - -/** Renders a list of detail items in a consistent style. Each item is shown in its own row with a label - * to the left and the provided content to the right. - */ -export const DetailsGroup: React.FC = ({ - className, - items, - labelWidthGridUnits = 14, -}) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - const theme = useTheme(); - const width = `${theme.spacing(labelWidthGridUnits)}px`; - const style = { - width, - minWidth: width, - }; - return ( -
- {items.map(({ name, content }) => ( -
-
- {name} -
-
{content}
-
- ))} -
- ); -}; diff --git a/packages/console/src/components/common/DetailsPanel.tsx b/packages/console/src/components/common/DetailsPanel.tsx deleted file mode 100644 index 7c1cd0283..000000000 --- a/packages/console/src/components/common/DetailsPanel.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { Drawer, Paper } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { CSSProperties } from '@material-ui/styles'; -import { detailsPanelId } from 'common/constants'; -import { useTheme } from 'components/Theme/useTheme'; -import * as React from 'react'; -import { detailsPanelWidth } from './constants'; - -const useStyles = makeStyles((theme: Theme) => ({ - modal: { - pointerEvents: 'none', - padding: '100px', - }, - paper: { - display: 'flex', - flex: '1 1 100%', - maxHeight: '100%', - paddingBottom: theme.spacing(2), - pointerEvents: 'initial', - width: detailsPanelWidth, - }, - spacer: theme.mixins.toolbar as CSSProperties, -})); - -interface DetailsPanelProps { - onClose?: () => void; - open?: boolean; -} - -/** A shared panel rendered along the right side of the UI. Content can be - * rendered into it using `DetailsPanelContent` - */ -export const DetailsPanel: React.FC = ({ - children, - onClose, - open = false, -}) => { - const styles = useStyles(); - const theme = useTheme(); - return ( - - - {children} - - - ); -}; diff --git a/packages/console/src/components/common/DetailsPanelContent.tsx b/packages/console/src/components/common/DetailsPanelContent.tsx deleted file mode 100644 index ce467ff4c..000000000 --- a/packages/console/src/components/common/DetailsPanelContent.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { detailsPanelId } from 'common/constants'; -import { log } from 'common/log'; -import * as React from 'react'; -import ReactDOM from 'react-dom'; - -/** Complements DetailsPanel, encapsulating the logic needed to locate - * and create a portal into the DOM element. Children of this component will be - * rendered into the DetailsPanel, if it exists. - */ -export const DetailsPanelContent: React.FC<{}> = ({ children }) => { - const detailsPanel = document.getElementById(detailsPanelId); - if (detailsPanel == null) { - log.warn(` - Attempting to mount content into DetailsPanel but it does not exist. - Did you mount an instance of DetailsPanel?`); - return null; - } - return ReactDOM.createPortal(children, detailsPanel); -}; diff --git a/packages/console/src/components/common/DomainSettingsSection.tsx b/packages/console/src/components/common/DomainSettingsSection.tsx deleted file mode 100644 index b156ae126..000000000 --- a/packages/console/src/components/common/DomainSettingsSection.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core/styles'; -import * as React from 'react'; -import { IconButton, Typography } from '@material-ui/core'; -import { COLOR_SPECTRUM } from 'components/Theme/colorSpectrum'; -import { DataTable } from 'components/common/DataTable'; -import { Admin } from '@flyteorg/flyteidl-types'; -import { isEmpty } from 'lodash'; -import { LocalCacheItem, useLocalCache } from 'basics/LocalCache'; -import ExpandLess from '@material-ui/icons/ExpandLess'; -import ExpandMore from '@material-ui/icons/ExpandMore'; -import t from './strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - domainSettingsWrapper: { - padding: theme.spacing(0, 2, 0, 2), - }, - collapseButton: { - marginTop: theme.spacing(-0.5), - }, - domainSettings: { - padding: theme.spacing(2, 4, 0, 4), - display: 'flex', - justifyContent: 'space-between', - }, - title: { - marginTop: theme.spacing(2), - paddingBottom: theme.spacing(1), - borderBottom: `1px solid ${theme.palette.divider}`, - }, - subHeader: { - margin: 0, - paddingBottom: theme.spacing(2), - fontSize: '16px', - fontWeight: 600, - }, - grayText: { - padding: theme.spacing(1, 0, 1, 0), - color: COLOR_SPECTRUM.gray40.color, - }, -})); - -interface DomainSettingsSectionProps { - configData?: Admin.IWorkflowExecutionConfig; -} - -export const DomainSettingsSection = ({ - configData, -}: DomainSettingsSectionProps) => { - const styles = useStyles(); - const [showTable, setShowTable] = useLocalCache( - LocalCacheItem.ShowDomainSettings, - ); - - if (!configData || isEmpty(configData)) { - return null; - } - - const role = configData.securityContext?.runAs?.iamRole || t('noValue'); - const serviceAccount = - configData.securityContext?.runAs?.k8sServiceAccount || t('noValue'); - const rawData = - configData.rawOutputDataConfig?.outputLocationPrefix || t('noValue'); - const maxParallelism = configData.maxParallelism || undefined; - - return ( -
- - setShowTable(!showTable)} - onMouseDown={e => e.preventDefault()} - size="small" - title={t('collapseButton', showTable)} - > - {showTable ? : } - - {t('domainSettingsTitle')} - - {showTable && ( -
-
-

{t('securityContextHeader')}

-
- - {t('iamRoleHeader')} - - {role} -
-
- - {t('serviceAccountHeader')} - - {serviceAccount} -
-
-
-

{t('labelsHeader')}

- {configData.labels?.values ? ( - - ) : ( - t('noValue') - )} -
-
-

{t('annotationsHeader')}

- {configData.annotations?.values ? ( - - ) : ( - t('noValue') - )} -
-
-
-

{t('rawDataHeader')}

- {rawData} -
-
-

- {t('maxParallelismHeader')} -

- - {maxParallelism ?? t('noValue')} - -
-
-
- )} -
- ); -}; diff --git a/packages/console/src/components/common/DumpJSON.tsx b/packages/console/src/components/common/DumpJSON.tsx deleted file mode 100644 index 9fc0676ef..000000000 --- a/packages/console/src/components/common/DumpJSON.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import * as React from 'react'; -import { ReactJsonViewWrapper } from 'components/common/ReactJsonView'; - -export const DumpJSON: React.FC<{ value: any }> = ({ value }) => { - return ; -}; diff --git a/packages/console/src/components/common/ErrorBoundary.tsx b/packages/console/src/components/common/ErrorBoundary.tsx deleted file mode 100644 index c2636ee29..000000000 --- a/packages/console/src/components/common/ErrorBoundary.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { CardContent } from '@material-ui/core'; -import Card from '@material-ui/core/Card'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import ErrorOutline from '@material-ui/icons/ErrorOutline'; -import classnames from 'classnames'; -import { log } from 'common/log'; -import { useCommonStyles } from 'components/common/styles'; -import { NotFound } from 'components/NotFound/NotFound'; -import { NotFoundError } from 'errors/fetchErrors'; -import * as React from 'react'; -import { NonIdealState } from './NonIdealState'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - alignItems: 'center', - display: 'flex', - height: '100%', - justifyContent: 'center', - minHeight: '100%', - minWidth: '100%', - width: '100%', - }, - containerFixed: { - bottom: 0, - left: 0, - position: 'fixed', - right: 0, - top: 0, - }, - errorContainer: { - marginBottom: theme.spacing(2), - }, - messageContainer: { - maxWidth: theme.spacing(60), - }, -})); - -interface ErrorBoundaryState { - error?: Error; -} - -const RenderError: React.FC<{ error: Error; fixed: boolean }> = ({ - error, - fixed, -}) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - const description = ( -
-

The error we received was:

- - {error} - -

There may be additional information in the browser console.

-
- ); - return ( -
- -
- ); -}; - -/** A generic error boundary which will render a NonIdealState and display - * whatever error was thrown. `fixed` controls whether the container is - * rendered with fixed positioning and filled to the edges of the window. - */ -export class ErrorBoundary extends React.Component< - { fixed?: boolean }, - ErrorBoundaryState -> { - constructor(props: object) { - super(props); - this.state = { error: undefined }; - } - - componentDidCatch(error: Error, info: unknown) { - this.setState({ error }); - log.error(error, info); - } - - render() { - const { fixed = false } = this.props; - if (this.state.error) { - if (this.state.error instanceof NotFoundError) { - return ; - } - - return ; - } - return this.props.children; - } -} diff --git a/packages/console/src/components/common/ExpandableMonospaceText.tsx b/packages/console/src/components/common/ExpandableMonospaceText.tsx deleted file mode 100644 index fbdb985e3..000000000 --- a/packages/console/src/components/common/ExpandableMonospaceText.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import { Button, ButtonBase } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import FileCopy from '@material-ui/icons/FileCopy'; -import classnames from 'classnames'; -import { - bodyFontFamily, - errorBackgroundColor, - listhoverColor, - nestedListColor, - primaryHighlightColor, - separatorColor, - smallFontSize, -} from 'components/Theme/constants'; -import copyToClipboard from 'copy-to-clipboard'; -import * as React from 'react'; - -const expandedClass = 'expanded'; -const showOnHoverClass = 'showOnHover'; - -export const useExpandableMonospaceTextStyles = makeStyles((theme: Theme) => ({ - actionContainer: { - transition: theme.transitions.create('opacity', { - duration: theme.transitions.duration.shorter, - easing: theme.transitions.easing.easeInOut, - }), - }, - bottomFade: { - background: - 'linear-gradient(rgba(255,252,252,0.39), rgba(255,255,255,0.79))', - bottom: 0, - height: theme.spacing(4), - left: 0, - position: 'absolute', - right: 0, - }, - container: { - backgroundColor: errorBackgroundColor, - border: `1px solid ${separatorColor}`, - borderRadius: 4, - height: theme.spacing(12), - minHeight: theme.spacing(12), - overflowY: 'hidden', - padding: theme.spacing(2), - position: 'relative', - '$nestedParent &': { - backgroundColor: theme.palette.common.white, - }, - [`&.${expandedClass}`]: { - height: 'auto', - }, - // All children using the showOnHover class will be hidden until - // the mouse enters the container - [`& .${showOnHoverClass}`]: { - opacity: 0, - }, - [`&:hover .${showOnHoverClass}`]: { - opacity: 1, - }, - }, - copyButton: { - backgroundColor: theme.palette.common.white, - border: `1px solid ${primaryHighlightColor}`, - borderRadius: theme.spacing(1), - color: theme.palette.text.secondary, - height: theme.spacing(4), - minWidth: 0, - padding: 0, - position: 'absolute', - right: theme.spacing(1), - top: theme.spacing(1), - width: theme.spacing(4), - '&:hover': { - backgroundColor: listhoverColor, - }, - }, - errorMessage: { - fontFamily: 'monospace', - whiteSpace: 'pre-wrap', - wordBreak: 'break-all', - wordWrap: 'break-word', - }, - expandButton: { - backgroundColor: theme.palette.text.secondary, - borderRadius: 16, - bottom: theme.spacing(4), - color: theme.palette.common.white, - fontFamily: bodyFontFamily, - fontSize: smallFontSize, - fontWeight: 'bold', - left: '50%', - padding: `${theme.spacing(1)}px ${theme.spacing(3)}px`, - position: 'absolute', - transform: 'translateX(-50%)', - '&:hover': { - backgroundColor: theme.palette.text.primary, - }, - [`&.${expandedClass}`]: { - bottom: theme.spacing(2), - }, - }, - // Apply this class to an ancestor container to have the expandable text - // use an alternate background color scheme. - nestedParent: { - backgroundColor: nestedListColor, - }, -})); - -export interface ExpandableMonospaceTextProps { - initialExpansionState?: boolean; - text: string; - onExpandCollapse?: (expanded: boolean) => void; -} - -/** An expandable/collapsible container which renders the provided text in a - * monospace font. It also provides a button to copy the text. - */ -export const ExpandableMonospaceText: React.FC< - ExpandableMonospaceTextProps -> = ({ onExpandCollapse, initialExpansionState = false, text }) => { - const [expanded, setExpanded] = React.useState(initialExpansionState); - const styles = useExpandableMonospaceTextStyles(); - const onClickExpand = (e: React.MouseEvent) => { - // prevent the parent row body onClick event trigger - e.stopPropagation(); - - setExpanded(!expanded); - if (onExpandCollapse) { - onExpandCollapse(!expanded); - } - }; - const onClickCopy = (e: React.MouseEvent) => { - // prevent the parent row body onClick event trigger - e.stopPropagation(); - copyToClipboard(text); - }; - - const expandButtonText = expanded ? 'Collapse' : 'Click to expand inline'; - - return ( -
-
{text}
- {expanded ? null :
} -
- - {expandButtonText} - - -
-
- ); -}; diff --git a/packages/console/src/components/common/FileUpload/FileItem.tsx b/packages/console/src/components/common/FileUpload/FileItem.tsx deleted file mode 100644 index f9b14ce9a..000000000 --- a/packages/console/src/components/common/FileUpload/FileItem.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core'; -import { Clear, Done } from '@material-ui/icons'; -import React from 'react'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - background: theme.palette.grey[100], - display: 'flex', - flexDirection: 'row', - justifyContent: 'space-between', - gap: '8px', - alignItems: 'center', - width: '100%', - padding: theme.spacing(1, 0.5), - fontSize: 12, - }, - icon: { - color: theme.palette.success.main, - }, - fileName: { - flex: 1, - textAlign: 'left', - }, -})); - -interface Props { - file: File; - remove: () => void; -} - -function FileItem({ file, remove }: Props) { - const styles = useStyles(); - - return ( -
- -
{file.name}
- { - e.preventDefault(); - e.stopPropagation(); - - remove(); - }} - /> -
- ); -} - -export default FileItem; diff --git a/packages/console/src/components/common/FileUpload/FileUpload.tsx b/packages/console/src/components/common/FileUpload/FileUpload.tsx deleted file mode 100644 index f24cad7d3..000000000 --- a/packages/console/src/components/common/FileUpload/FileUpload.tsx +++ /dev/null @@ -1,89 +0,0 @@ -// ts-ingnore - -import { makeStyles, Theme } from '@material-ui/core'; -import React, { InputHTMLAttributes } from 'react'; -import { DropzoneProps, useDropzone } from 'react-dropzone'; -import FileItem from './FileItem'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - margin: 'auto', - maxWidth: '536px', - color: theme.palette.grey[400], - cursor: 'pointer', - }, - uploadContainer: { - width: '100%', - display: 'flex', - flexDirection: 'column', - justifyContent: 'center', - alignItems: 'center', - gap: theme.spacing(0.5), - padding: theme.spacing(4, 3), - border: `0.5px dashed ${theme.palette.divider}`, - borderRadius: '4px', - }, - filesContainer: { - width: '100%', - }, - highlight: { - color: theme.palette.primary.main, - }, -})); - -/** - * For a list of available options, see https://react-dropzone.js.org/ - */ -export interface FileUploadProps extends DropzoneProps { - files: File[]; - setFiles: React.Dispatch>; - helpText?: React.ReactNode; -} - -export function FileUpload({ - files, - setFiles, - helpText, - ...options -}: FileUploadProps) { - const styles = useStyles(); - const { getRootProps, getInputProps } = useDropzone({ - ...options, - onDrop: (acceptedFiles, fileRejections, event) => { - setFiles(acceptedFiles); - options?.onDrop?.(acceptedFiles, fileRejections, event); - }, - }); - - const removeFile = (fileIdx: number) => { - setFiles(files => files.filter((_, idx) => idx !== fileIdx)); - }; - - const ctaText = files.length ? 'Replace file' : 'Upload a file'; - - return ( -
-
-
- {files.map((file, idx) => ( - removeFile(idx)} - key={file.name} - /> - ))} -
-
- {ctaText} or drag and drop - here -
- {helpText} - )} - /> -
-
- ); -} - -export default FileUpload; diff --git a/packages/console/src/components/common/FilterableNamedEntityList.tsx b/packages/console/src/components/common/FilterableNamedEntityList.tsx deleted file mode 100644 index 249227d64..000000000 --- a/packages/console/src/components/common/FilterableNamedEntityList.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { - Checkbox, - debounce, - FormControlLabel, - FormGroup, -} from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { NamedEntity } from 'models/Common/types'; -import * as React from 'react'; -import { useEffect, useState } from 'react'; -import { NoResults } from './NoResults'; -import { SearchableInput, SearchResult } from './SearchableList'; -import { useCommonStyles } from './styles'; -import { useSearchableListState } from './useSearchableListState'; - -export const useStyles = makeStyles((theme: Theme) => ({ - archiveCheckbox: { - whiteSpace: 'nowrap', - }, - container: { - marginBottom: theme.spacing(2), - width: '100%', - }, - filterGroup: { - display: 'flex', - flexWrap: 'nowrap', - flexDirection: 'row', - margin: theme.spacing(4, 5, 2, 2), - }, -})); - -type ItemRenderer = (item: SearchResult) => React.ReactNode; - -interface SearchResultsProps { - results: SearchResult[]; - renderItem: ItemRenderer; -} - -export interface FilterableNamedEntityListProps { - names: NamedEntity[]; - onArchiveFilterChange: (showArchievedItems: boolean) => void; - showArchived: boolean; - placeholder: string; - archiveCheckboxLabel: string; - renderItem: ItemRenderer; -} - -const VARIANT = 'normal'; - -const SearchResults: React.FC = ({ - renderItem, - results, -}) => { - const commonStyles = useCommonStyles(); - return results.length === 0 ? ( - - ) : ( -
    {results.map(renderItem)}
- ); -}; - -/** Base component functionalityfor rendering NamedEntities (Workflow/Task/LaunchPlan) */ -export const FilterableNamedEntityList: React.FC< - FilterableNamedEntityListProps -> = ({ - names, - showArchived, - renderItem, - onArchiveFilterChange, - placeholder, - archiveCheckboxLabel, -}) => { - const styles = useStyles(); - const [search, setSearch] = useState(''); - - const { results, setSearchString } = useSearchableListState({ - items: names, - propertyGetter: ({ id }) => id.name, - }); - - useEffect(() => { - const debouncedSearch = debounce(() => setSearchString(search), 1000); - debouncedSearch(); - }, [search]); - - const onSearchChange = (event: React.ChangeEvent) => { - const searchString = event.target.value; - setSearch(searchString); - }; - - const onClear = () => setSearch(''); - - const renderItems = (results: SearchResult[]) => ( - - ); - - return ( -
- - - onArchiveFilterChange(checked)} - /> - } - label={archiveCheckboxLabel} - /> - - {renderItems(results)} -
- ); -}; diff --git a/packages/console/src/components/common/Icons/InfoIcon.tsx b/packages/console/src/components/common/Icons/InfoIcon.tsx deleted file mode 100644 index f346025c9..000000000 --- a/packages/console/src/components/common/Icons/InfoIcon.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import * as React from 'react'; -import { IconProps } from './interface'; - -export const InfoIcon: React.FC = ({ - size = 14, - className, - onClick, -}) => { - return ( - - - - - - ); -}; diff --git a/packages/console/src/components/common/Icons/interface.ts b/packages/console/src/components/common/Icons/interface.ts deleted file mode 100644 index 60e27b707..000000000 --- a/packages/console/src/components/common/Icons/interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface IconProps { - size?: number; - className?: string; - onClick?: () => void; -} diff --git a/packages/console/src/components/common/LoadingSpinner.tsx b/packages/console/src/components/common/LoadingSpinner.tsx deleted file mode 100644 index 2f9dc5c01..000000000 --- a/packages/console/src/components/common/LoadingSpinner.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { CircularProgress } from '@material-ui/core'; -import { makeStyles } from '@material-ui/core/styles'; -import classnames from 'classnames'; -import { useDelayedValue } from 'components/hooks/useDelayedValue'; -import * as React from 'react'; -import { loadingSpinnerDelayMs } from './constants'; - -const useStyles = makeStyles({ - container: { - alignItems: 'center', - display: 'flex', - justifyContent: 'center', - '&.large': { height: '300px' }, - '&.medium': { height: '80px' }, - '&.small': { height: '40px' }, - }, -}); - -type SizeValue = 'small' | 'medium' | 'large'; -interface LoadingSpinnerProps { - size?: SizeValue; - useDelay?: boolean; -} - -const spinnerSizes: Record = { - small: 24, - medium: 48, - large: 96, -}; - -/** Renders a loading spinner after 1000ms. Size options are 'small', 'medium', and 'large' */ -export const LoadingSpinner: React.FC = ({ - size = 'large', - useDelay = true, -}) => { - const styles = useStyles(); - const shouldRender = useDelayedValue( - false, - useDelay ? loadingSpinnerDelayMs : 0, - true, - ); - return shouldRender ? ( -
- -
- ) : null; -}; - -/** `LoadingSpinner` with a pre-bound size of `small` */ -export const SmallLoadingSpinner: React.FC = () => ( - -); -/** `LoadingSpinner` with a pre-bound size of `medium` */ -export const MediumLoadingSpinner: React.FC = () => ( - -); -/** `LoadingSpinner` with a pre-bound size of `large` */ -export const LargeLoadingSpinner: React.FC = () => ( - -); - -export const LargeLoadingComponent = () => { - return ( -
- -
- ); -}; diff --git a/packages/console/src/components/common/MapTaskExecutionsList/MapTaskStatusInfo.tsx b/packages/console/src/components/common/MapTaskExecutionsList/MapTaskStatusInfo.tsx deleted file mode 100644 index de51db651..000000000 --- a/packages/console/src/components/common/MapTaskExecutionsList/MapTaskStatusInfo.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import * as React from 'react'; -import { useEffect, useState } from 'react'; -import { Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { RowExpander } from 'components/Executions/Tables/RowExpander'; -import { TaskExecutionPhase } from 'models/Execution/enums'; -import { getTaskExecutionPhaseConstants } from 'components/Executions/utils'; -import { Core } from '@flyteorg/flyteidl-types'; -import { MapTaskExecution, TaskExecution } from 'models/Execution/types'; -import { TaskNameList } from './TaskNameList'; - -const useStyles = makeStyles((_theme: Theme) => ({ - mainWrapper: { - display: 'flex', - flex: 1, - flexDirection: 'column', - }, - headerWrapper: { - display: 'flex', - flex: 'auto', - alignItems: 'center', - }, - colorBar: { - height: '20px', - borderLeft: 'solid 4px red', - margin: '0 8px 0 4px', - }, - title: { - flex: 'auto', - }, - logs: { - marginLeft: '46px', - }, - semiboldText: { - fontWeight: 600, - }, -})); - -interface MapTaskStatusInfoProps { - taskExecution: TaskExecution; - taskLogs: Core.ITaskLog[]; - phase: TaskExecutionPhase; - selectedPhase?: TaskExecutionPhase; - onTaskSelected: (val: MapTaskExecution) => void; -} - -export const MapTaskStatusInfo = ({ - taskExecution, - taskLogs, - phase, - selectedPhase, - onTaskSelected, -}: MapTaskStatusInfoProps) => { - const [expanded, setExpanded] = useState(selectedPhase === phase); - const styles = useStyles(); - - const phaseData = getTaskExecutionPhaseConstants(phase); - - useEffect(() => { - setExpanded(selectedPhase === phase); - }, [selectedPhase, phase]); - - const toggleExpanded = () => { - setExpanded(!expanded); - }; - - return ( -
-
- -
- - {phaseData.text} - - {`×${taskLogs.length}`} -
- {expanded && ( -
- -
- )} -
- ); -}; diff --git a/packages/console/src/components/common/MapTaskExecutionsList/TaskNameList.tsx b/packages/console/src/components/common/MapTaskExecutionsList/TaskNameList.tsx deleted file mode 100644 index 625920625..000000000 --- a/packages/console/src/components/common/MapTaskExecutionsList/TaskNameList.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import * as React from 'react'; -import { Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { Core } from '@flyteorg/flyteidl-types'; -import { getTaskLogName } from 'components/Executions/TaskExecutionsList/utils'; -import { MapTaskExecution, TaskExecution } from 'models/Execution/types'; -import { noLogsFoundString } from 'components/Executions/constants'; -import { CacheStatus } from 'components/Executions/CacheStatus'; -import classnames from 'classnames'; -import { useCommonStyles } from '../styles'; - -const useStyles = makeStyles((_theme: Theme) => ({ - taskName: { - lineHeight: 2, - overflowWrap: 'anywhere', - }, - - taskTitle: { - cursor: 'default', - '&:hover': { - textDecoration: 'none', - }, - }, - - taskTitleLink: { - cursor: 'pointer', - '&:hover': { - textDecoration: 'underline', - }, - }, - - taskCacheLogo: { - verticalAlign: 'middle', - position: 'relative', - left: 0, - }, -})); - -interface TaskNameListProps { - taskExecution: TaskExecution; - logs: Core.ITaskLog[]; - onTaskSelected: (val: MapTaskExecution) => void; - className?: string; -} - -export const TaskNameList = ({ - taskExecution, - logs, - onTaskSelected, - className, -}: TaskNameListProps) => { - const commonStyles = useCommonStyles(); - const styles = useStyles(); - - if (logs.length === 0) { - return {noLogsFoundString}; - } - - return ( - <> - {logs.map((log, _taskIndex) => { - const taskLogName = getTaskLogName( - taskExecution.id.taskId.name, - log.name ?? '', - ); - - const cacheStatus = - taskExecution.closure?.metadata?.externalResources?.find( - item => - item.externalId === log.name || - !!item.logs?.find(l => l.name === log.name), - )?.cacheStatus; - - const handleClick = () => { - // Use the resource's index instead of the log index - onTaskSelected({ - ...taskExecution, - taskIndex: (log as any).index, - parentRetryAttempt: taskExecution.id.retryAttempt, - }); - }; - - return ( -
- - {taskLogName} - - -
- ); - })} - - ); -}; diff --git a/packages/console/src/components/common/MapTaskExecutionsList/test/TaskNameList.test.tsx b/packages/console/src/components/common/MapTaskExecutionsList/test/TaskNameList.test.tsx deleted file mode 100644 index 010858b54..000000000 --- a/packages/console/src/components/common/MapTaskExecutionsList/test/TaskNameList.test.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import ThemeProvider from '@material-ui/styles/ThemeProvider'; -import { render } from '@testing-library/react'; -import { getMuiTheme } from 'components/Theme/muiTheme'; -import * as React from 'react'; -import { mockExecution as mockTaskExecution } from 'models/Execution/__mocks__/mockTaskExecutionsData'; - -import { TaskNameList } from '../TaskNameList'; - -const taskLogs = [ - { uri: '#', name: 'Kubernetes Logs #0-0' }, - { uri: '#', name: 'Kubernetes Logs #0-1' }, - { uri: '#', name: 'Kubernetes Logs #0-2' }, -]; - -const taskLogsWithoutUri = [ - { name: 'Kubernetes Logs #0-0' }, - { name: 'Kubernetes Logs #0-1' }, - { name: 'Kubernetes Logs #0-2' }, -]; - -describe('TaskNameList', () => { - it('should render log names in color if they have URI', async () => { - const { queryAllByTestId } = render( - - - , - ); - - const logs = queryAllByTestId('map-task-log'); - expect(logs).toHaveLength(3); - logs.forEach(log => { - expect(log).toBeInTheDocument(); - expect(log).toHaveStyle({ color: '#8B37FF' }); - }); - }); - - it('should render log names in black if they have URI', () => { - const { queryAllByTestId } = render( - - - , - ); - - const logs = queryAllByTestId('map-task-log'); - expect(logs).toHaveLength(3); - logs.forEach(log => { - expect(log).toBeInTheDocument(); - expect(log).toHaveStyle({ color: '#292936' }); - }); - }); -}); diff --git a/packages/console/src/components/common/NewTargetLink.tsx b/packages/console/src/components/common/NewTargetLink.tsx deleted file mode 100644 index 00e2450ba..000000000 --- a/packages/console/src/components/common/NewTargetLink.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import Link, { LinkProps } from '@material-ui/core/Link'; -import { makeStyles } from '@material-ui/core/styles'; -import OpenInNew from '@material-ui/icons/OpenInNew'; -import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import * as React from 'react'; - -const useStyles = makeStyles({ - externalBlockContainer: { - alignItems: 'center', - display: 'flex', - }, -}); - -interface NewTargetLinkProps extends LinkProps { - /** If set to true, will show an icon next to the link hinting to the user that they will be leaving the site */ - external?: boolean; - /** If set to true, will be rendered as a to preserve inline behavior */ - inline?: boolean; -} - -/** Renders a link which will be opened in a new tab while also including the required props to avoid - * linter errors. Can be configured to show a special icon for external links as a hint to the user. - */ -export const NewTargetLink: React.FC = props => { - const { - className, - children, - external = false, - inline = false, - ...otherProps - } = props; - const commonStyles = useCommonStyles(); - const styles = useStyles(); - - const icon = external ? ( - - ) : null; - - return ( - - {inline ? ( - - {children} - {icon} - - ) : ( -
- {children} - {icon} -
- )} - - ); -}; diff --git a/packages/console/src/components/common/NoResults.tsx b/packages/console/src/components/common/NoResults.tsx deleted file mode 100644 index 1fa1fccb6..000000000 --- a/packages/console/src/components/common/NoResults.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { makeStyles, Theme, Typography } from '@material-ui/core'; -import * as React from 'react'; -import t from './strings'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - color: theme.palette.text.disabled, - display: 'flex', - justifyContent: 'center', - marginTop: theme.spacing(4), - }, -})); - -export const NoResults: React.FC = () => ( - - {t('noMatchingResults')} - -); diff --git a/packages/console/src/components/common/PanelSection/index.tsx b/packages/console/src/components/common/PanelSection/index.tsx deleted file mode 100644 index e5cd1059e..000000000 --- a/packages/console/src/components/common/PanelSection/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import * as React from 'react'; -import { makeStyles } from '@material-ui/core/styles'; - -const useStyle = makeStyles(theme => ({ - detailsPanelCard: {}, - detailsPanelCardContent: { - padding: `${theme.spacing(2)}px ${theme.spacing(3)}px`, - borderBottom: `1px solid ${theme.palette.divider}`, - }, -})); - -interface PanelSectionProps { - children: React.ReactNode; -} - -export const PanelSection = (props: PanelSectionProps) => { - const commonStyles = useStyle(); - return ( -
-
- {props.children} -
-
- ); -}; diff --git a/packages/console/src/components/common/ReactJsonView.tsx b/packages/console/src/components/common/ReactJsonView.tsx deleted file mode 100644 index 7e85012e3..000000000 --- a/packages/console/src/components/common/ReactJsonView.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import * as React from 'react'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import ReactJsonView, { ReactJsonViewProps } from 'react-json-view'; -import copyToClipboard from 'copy-to-clipboard'; -import { - primaryHighlightColor, - primaryTextColor, -} from 'components/Theme/constants'; - -const useStyles = makeStyles((theme: Theme) => ({ - jsonViewer: { - marginLeft: '-10px', - width: '100%', - '& span': { - fontWeight: 'normal !important', - }, - '& .object-container': { - overflowWrap: 'anywhere !important', - }, - '& .copy-to-clipboard-container': { - position: 'absolute', - }, - '& .copy-icon svg': { - color: `${primaryHighlightColor} !important`, - }, - '& .variable-value': { - paddingLeft: '5px', - }, - '& .variable-value >*': { - color: `${primaryTextColor} !important`, - }, - '& .object-key-val': { - padding: '0 0 0 5px !important', - }, - '& .object-key': { - color: `${theme.palette.grey[500]} !important`, - }, - '& .node-ellipsis': { - color: `${theme.palette.grey[500]} !important`, - }, - }, -})); - -/** - * - * Replacer functionality to pass to the JSON.stringify function that - * does proper serialization of arrays that contain non-numeric indexes - * @param _ parent element key - * @param value the element being serialized - * @returns Transformed version of input - */ -const replacer = (_, value) => { - // Check if associative array - if (value instanceof Array && Object.keys(value).some(v => isNaN(+v))) { - // Serialize associative array - return Object.keys(value).reduce((acc, arrKey) => { - // if: - // string key is encountered insert {[key]: value} into transformed array - // else: - // insert original value - acc.push(isNaN(+arrKey) ? { [arrKey]: value[arrKey] } : value[arrKey]); - - return acc; - }, [] as any[]); - } - - // Non-associative array. return original value to allow default JSON.stringify behavior - return value; -}; - -/** - * Custom implementation for JSON.stringify to allow - * proper serialization of arrays that contain non-numeric indexes - * - * @param json Object to serialize - * @returns A string version of the input json - */ -const customStringify = json => { - return JSON.stringify(json, replacer); -}; - -export const ReactJsonViewWrapper: React.FC = props => { - const styles = useStyles(); - - return ( -
- { - const objToCopy = options.src; - const text = - typeof objToCopy === 'object' - ? customStringify(objToCopy) - : objToCopy; - copyToClipboard(text); - }} - displayDataTypes={false} - quotesOnKeys={false} - iconStyle="triangle" - displayObjectSize={true} - name={null} - indentWidth={4} - collapseStringsAfterLength={80} - sortKeys={true} - {...props} - /> -
- ); -}; diff --git a/packages/console/src/components/common/ScrollableMonospaceText.tsx b/packages/console/src/components/common/ScrollableMonospaceText.tsx deleted file mode 100644 index 894d66257..000000000 --- a/packages/console/src/components/common/ScrollableMonospaceText.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import { Button } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import FileCopy from '@material-ui/icons/FileCopy'; -import classnames from 'classnames'; -import { - errorBackgroundColor, - listhoverColor, - nestedListColor, - primaryHighlightColor, - separatorColor, -} from 'components/Theme/constants'; -import copyToClipboard from 'copy-to-clipboard'; -import * as React from 'react'; - -const showOnHoverClass = 'showOnHover'; - -export const useScrollableMonospaceTextStyles = makeStyles((theme: Theme) => ({ - actionContainer: { - transition: theme.transitions.create('opacity', { - duration: theme.transitions.duration.shorter, - easing: theme.transitions.easing.easeInOut, - }), - }, - wrapper: { - position: 'relative', - }, - container: { - backgroundColor: errorBackgroundColor, - border: `1px solid ${separatorColor}`, - borderRadius: 4, - height: theme.spacing(12), - minHeight: theme.spacing(12), - overflowY: 'scroll', - padding: theme.spacing(2), - display: 'flex', - flexDirection: 'column-reverse', - '$nestedParent &': { - backgroundColor: theme.palette.common.white, - }, - // All children using the showOnHover class will be hidden until - // the mouse enters the container - [`& .${showOnHoverClass}`]: { - opacity: 0, - }, - [`&:hover .${showOnHoverClass}`]: { - opacity: 1, - }, - }, - copyButton: { - backgroundColor: theme.palette.common.white, - border: `1px solid ${primaryHighlightColor}`, - borderRadius: theme.spacing(1), - color: theme.palette.text.secondary, - height: theme.spacing(4), - minWidth: 0, - padding: 0, - position: 'absolute', - right: theme.spacing(3), - top: theme.spacing(1), - width: theme.spacing(4), - '&:hover': { - backgroundColor: listhoverColor, - }, - }, - errorMessage: { - fontFamily: 'monospace', - whiteSpace: 'pre-wrap', - wordBreak: 'break-all', - wordWrap: 'break-word', - }, - // Apply this class to an ancestor container to have the expandable text - // use an alternate background color scheme. - nestedParent: { - backgroundColor: nestedListColor, - }, -})); - -export interface ScrollableMonospaceTextProps { - text: string; -} - -/** An expandable/collapsible container which renders the provided text in a - * monospace font. It also provides a button to copy the text. - */ -export const ScrollableMonospaceText: React.FC< - ScrollableMonospaceTextProps -> = ({ text }) => { - const styles = useScrollableMonospaceTextStyles(); - const scrollRef = React.useRef(null); - const onClickCopy = (e: React.MouseEvent) => { - // prevent the parent row body onClick event trigger - e.stopPropagation(); - copyToClipboard(text); - }; - - React.useEffect(() => { - scrollRef.current?.scrollTo({ - top: scrollRef.current.scrollHeight, - }); - }, [text, scrollRef.current]); - - return ( -
-
-
{text}
-
- -
-
-
- ); -}; diff --git a/packages/console/src/components/common/SearchInputForm.tsx b/packages/console/src/components/common/SearchInputForm.tsx deleted file mode 100644 index 94c06e917..000000000 --- a/packages/console/src/components/common/SearchInputForm.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { - Button, - FormControl, - FormLabel, - makeStyles, - OutlinedInput, - Theme, -} from '@material-ui/core'; -import * as React from 'react'; - -const useStyles = makeStyles((theme: Theme) => ({ - title: { - textTransform: 'uppercase', - color: theme.palette.text.secondary, - }, - input: { - margin: `${theme.spacing(1)}px 0`, - }, -})); - -export interface SearchInputFormProps { - label: string; - placeholder?: string; - onChange: (newValue: string) => void; - defaultValue: string; -} - -/** Form content for rendering a header and search input. The value is applied - * on submission of the form. - */ -export const SearchInputForm: React.FC = ({ - label, - placeholder, - onChange, - defaultValue, -}) => { - const [value, setValue] = React.useState(defaultValue); - const styles = useStyles(); - const onInputChange: React.ChangeEventHandler = ({ - target: { value }, - }) => setValue(value); - - const onSubmit: React.FormEventHandler = event => { - event.preventDefault(); - onChange(value); - }; - return ( -
- - {label} - - - - - -
- ); -}; diff --git a/packages/console/src/components/common/SearchableList.tsx b/packages/console/src/components/common/SearchableList.tsx deleted file mode 100644 index ed61459be..000000000 --- a/packages/console/src/components/common/SearchableList.tsx +++ /dev/null @@ -1,152 +0,0 @@ -import { IconButton } from '@material-ui/core'; -import InputAdornment from '@material-ui/core/InputAdornment'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import TextField, { TextFieldProps } from '@material-ui/core/TextField'; -import Close from '@material-ui/icons/Close'; -import Search from '@material-ui/icons/Search'; -import { bodyFontSize } from 'components/Theme/constants'; -import * as React from 'react'; -import classNames from 'classnames'; -import { - PropertyGetter, - SearchResult, - useSearchableListState, -} from './useSearchableListState'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - padding: `0 ${theme.spacing(3)}px`, - marginBottom: theme.spacing(0.5), - width: '100%', - }, - containerMinimal: { - margin: theme.spacing(1), - }, - minimalNotchedOutline: { - borderRadius: 0, - }, - minimalInput: { - fontSize: bodyFontSize, - padding: theme.spacing(1), - }, -})); - -type SearchableListVariant = 'normal' | 'minimal'; - -export interface SearchableListProps { - /** Note that all items must have an id property! */ - items: T[]; - /** Text to show in the search box when no query has been entered */ - placeholder?: string; - /** The name of the property on each item which is being used for search */ - propertyGetter: keyof T | PropertyGetter; - variant?: SearchableListVariant; - renderContent(results: SearchResult[]): JSX.Element; -} - -/** - * Show searchable text input field. - * @param onClear - * @param onSearchChange - * @param placeholder - * @param value - * @param variant - * @constructor - */ -export const SearchableInput: React.FC<{ - onClear: () => void; - onSearchChange: React.ChangeEventHandler; - placeholder?: string; - variant: SearchableListVariant; - value?: string; - className?: string; -}> = ({ onClear, onSearchChange, placeholder, value, variant, className }) => { - const styles = useStyles(); - const startAdornment = ( - - - - ); - - const endAdornment = ( - - - - - - ); - - const baseProps: TextFieldProps = { - placeholder, - value, - autoFocus: true, - dir: 'auto', - fullWidth: true, - inputProps: { role: 'search' }, - onChange: onSearchChange, - variant: 'outlined', - }; - switch (variant) { - case 'normal': - return ( -
- -
- ); - case 'minimal': - return ( -
- -
- ); - } -}; - -/** Handles fuzzy search logic and filtering for a searchable list of items */ -export const SearchableList = (props: SearchableListProps) => { - const { placeholder, renderContent, variant = 'normal' } = props; - const { results, searchString, setSearchString } = - useSearchableListState(props); - const onSearchChange = (event: React.ChangeEvent) => { - const searchString = event.target.value; - setSearchString(searchString); - }; - const onClear = () => setSearchString(''); - return ( - <> - - {renderContent(results)} - - ); -}; - -export type { SearchResult, PropertyGetter }; diff --git a/packages/console/src/components/common/SearchableNamedEntityList.tsx b/packages/console/src/components/common/SearchableNamedEntityList.tsx deleted file mode 100644 index 51e35547e..000000000 --- a/packages/console/src/components/common/SearchableNamedEntityList.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { - listhoverColor, - primaryHighlightColor, - separatorColor, -} from 'components/Theme/constants'; -import { NamedEntity } from 'models/Common/types'; -import * as React from 'react'; -import { NoResults } from './NoResults'; -import { SearchableList, SearchResult } from './SearchableList'; -import { useCommonStyles } from './styles'; - -export const useNamedEntityListStyles = makeStyles((theme: Theme) => ({ - container: { - marginBottom: theme.spacing(2), - width: '100%', - }, - itemName: { - flex: '1 1 auto', - padding: `${theme.spacing(2)}px 0`, - }, - itemChevron: { - color: theme.palette.grey[500], - flex: '0 0 auto', - }, - searchResult: { - alignItems: 'center', - borderBottom: `1px solid ${separatorColor}`, - display: 'flex', - position: 'relative', - flexDirection: 'row', - padding: `0 ${theme.spacing(3)}px`, - '&:first-of-type': { - borderTop: `1px solid ${separatorColor}`, - }, - '&:hover': { - backgroundColor: listhoverColor, - }, - '& mark': { - backgroundColor: 'unset', - color: primaryHighlightColor, - fontWeight: 'bold', - }, - }, -})); - -export interface SearchableNamedEntity extends NamedEntity { - key: string; -} - -const nameKey = ({ id: { domain, name, project } }: NamedEntity) => - `${domain}/${name}/${project}`; - -type ItemRenderer = ( - item: SearchResult, -) => React.ReactNode; - -interface SearchResultsProps { - results: SearchResult[]; - renderItem: ItemRenderer; -} -const SearchResults: React.FC = ({ - renderItem, - results, -}) => { - const commonStyles = useCommonStyles(); - return results.length === 0 ? ( - - ) : ( -
    {results.map(renderItem)}
- ); -}; - -export interface SearchableNamedEntityListProps { - names: NamedEntity[]; - renderItem: ItemRenderer; -} - -const nameSearchPropertyGetter = ({ id }: SearchableNamedEntity) => id.name; -/** Base component functionalityfor rendering NamedEntities (Workflow/Task/LaunchPlan) */ -export const SearchableNamedEntityList: React.FC< - SearchableNamedEntityListProps -> = ({ names, renderItem }) => { - const styles = useNamedEntityListStyles(); - const searchValues = names.map(name => ({ - ...name, - key: nameKey(name), - })); - - const renderItems = (results: SearchResult[]) => ( - - ); - - return ( -
- -
- ); -}; diff --git a/packages/console/src/components/common/SectionHeader.tsx b/packages/console/src/components/common/SectionHeader.tsx deleted file mode 100644 index b7b49ba95..000000000 --- a/packages/console/src/components/common/SectionHeader.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core/styles'; -import Typography from '@material-ui/core/Typography'; -import * as React from 'react'; - -const useStyles = makeStyles((theme: Theme) => ({ - container: { - marginBottom: theme.spacing(1), - }, -})); - -export interface SectionHeaderProps { - title: string; - subtitle?: string | null; -} -export const SectionHeader: React.FC = ({ - title, - subtitle, -}) => { - const styles = useStyles(); - return ( -
- {title} - {!!subtitle && {subtitle}} -
- ); -}; diff --git a/packages/console/src/components/common/Shimmer.tsx b/packages/console/src/components/common/Shimmer.tsx deleted file mode 100644 index ccf32763e..000000000 --- a/packages/console/src/components/common/Shimmer.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import * as React from 'react'; -import { makeStyles } from '@material-ui/core/styles'; - -const useStyles = makeStyles(() => ({ - animate: { - height: 10, - animation: '$shimmer 4s infinite linear', - background: - 'linear-gradient(to right, #eff1f3 4%, #e2e2e2 25%, #eff1f3 36%)', - backgroundSize: '1000px 100%', - borderRadius: 8, - width: '100%', - }, - '@keyframes shimmer': { - '0%': { - backgroundPosition: '-1000px 0', - }, - '100%': { - backgroundPosition: '1000px 0', - }, - }, -})); - -interface ShimmerProps { - height?: number; -} - -export const Shimmer: React.FC = () => { - const styles = useStyles(); - - return
; -}; diff --git a/packages/console/src/components/common/index.ts b/packages/console/src/components/common/index.ts deleted file mode 100644 index b4fb31025..000000000 --- a/packages/console/src/components/common/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { useCommonStyles } from './styles'; -export { withRouteParams } from './withRouteParams'; -export * from './LoadingSpinner'; -export { WaitForData } from './WaitForData'; -export { WaitForQuery } from './WaitForQuery'; -export { DetailsGroup } from './DetailsGroup'; -export { ScrollableMonospaceText } from './ScrollableMonospaceText'; -export * from './LocalStoreDefaults'; diff --git a/packages/console/src/components/common/keyboardEvents.ts b/packages/console/src/components/common/keyboardEvents.ts deleted file mode 100644 index e13719692..000000000 --- a/packages/console/src/components/common/keyboardEvents.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** Creates an event handler that will call the specified callback when - * the event is the result of pressing the Escape key. - */ -export function escapeKeyListener(callback: () => void) { - return function ( - event: React.KeyboardEvent, - ) { - if (event.defaultPrevented) { - return; - } - - const key = event.key || event.keyCode; - - if (key === 'Escape' || key === 'Esc' || key === 27) { - callback(); - } - }; -} diff --git a/packages/console/src/components/common/styles.ts b/packages/console/src/components/common/styles.ts deleted file mode 100644 index 2d9df5bdb..000000000 --- a/packages/console/src/components/common/styles.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { makeStyles, Theme } from '@material-ui/core/styles'; -import { - buttonHoverColor, - dangerousButtonBorderColor, - dangerousButtonColor, - dangerousButtonHoverColor, - mutedPrimaryTextColor, - smallFontSize, -} from 'components/Theme/constants'; - -const unstyledLinkProps = { - textDecoration: 'none', - color: 'inherit', -}; - -export const horizontalListSpacing = (spacing: number) => ({ - '& > :not(:first-child)': { - marginLeft: spacing, - }, -}); - -export const buttonGroup = (theme: Theme) => ({ - ...horizontalListSpacing(theme.spacing(1)), - display: 'flex', -}); - -export const useCommonStyles = makeStyles((theme: Theme) => ({ - buttonWhiteOutlined: { - backgroundColor: theme.palette.common.white, - '&:hover': { - backgroundColor: buttonHoverColor, - }, - }, - codeBlock: { - display: 'block', - fontFamily: 'monospace', - marginTop: theme.spacing(1), - textTransform: 'none', - whiteSpace: 'pre-wrap', - wordBreak: 'break-all', - wordWrap: 'break-word', - }, - dangerousButton: { - borderColor: dangerousButtonBorderColor, - color: dangerousButtonColor, - '&:hover': { - borderColor: dangerousButtonHoverColor, - color: dangerousButtonHoverColor, - }, - }, - errorText: { - color: theme.palette.error.main, - }, - flexCenter: { - alignItems: 'center', - display: 'flex', - }, - flexFill: { - flex: '1 1 100%', - }, - formButtonGroup: { - ...buttonGroup(theme), - justifyContent: 'center', - marginTop: theme.spacing(1), - }, - formControlLabelSmall: { - // This is adjusting the negative margin used by - // FormControlLabel to make sure the control lines up correctly - marginLeft: -3, - marginTop: theme.spacing(1), - }, - formControlSmall: { - marginRight: theme.spacing(1), - padding: 0, - }, - hintText: { - color: theme.palette.text.hint, - }, - iconLeft: { - marginRight: theme.spacing(1), - }, - iconRight: { - marginLeft: theme.spacing(1), - }, - iconSecondary: { - color: theme.palette.text.secondary, - }, - linkUnstyled: { - ...unstyledLinkProps, - '&:hover': { - ...unstyledLinkProps, - }, - }, - listUnstyled: { - listStyle: 'none', - margin: 0, - padding: 0, - '& li': { - padding: 0, - }, - }, - microHeader: { - textTransform: 'uppercase', - fontWeight: 'bold', - fontSize: smallFontSize, - lineHeight: '.9375rem', - }, - mutedHeader: { - color: mutedPrimaryTextColor, - fontWeight: 'bold', - fontSize: '1rem', - lineHeight: '1.375rem', - }, - primaryLink: { - color: theme.palette.primary.main, - cursor: 'pointer', - fontWeight: 'bold', - textDecoration: 'none', - '&:hover': { - color: theme.palette.primary.main, - textDecoration: 'underline', - }, - }, - secondaryLink: { - color: theme.palette.text.secondary, - cursor: 'pointer', - fontWeight: 'bold', - textDecoration: 'none', - '&:hover': { - color: theme.palette.text.secondary, - textDecoration: 'underline', - }, - }, - smallDropdownWindow: { - border: `1px solid ${theme.palette.divider}`, - marginTop: theme.spacing(0.5), - }, - textMonospace: { - textTransform: 'none', - fontFamily: 'monospace', - }, - textMuted: { - color: theme.palette.grey[500], - }, - textSmall: { - fontSize: smallFontSize, - lineHeight: 1.25, - }, - textWrapped: { - overflowWrap: 'break-word', - wordBreak: 'break-all', - }, - truncateText: { - overflow: 'hidden', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', - }, -})); diff --git a/packages/console/src/components/common/test/DomainSettingsSection.test.tsx b/packages/console/src/components/common/test/DomainSettingsSection.test.tsx deleted file mode 100644 index ca6ae8dde..000000000 --- a/packages/console/src/components/common/test/DomainSettingsSection.test.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import { render } from '@testing-library/react'; -import * as React from 'react'; -import { LocalCacheProvider } from 'basics/LocalCache/ContextProvider'; -import { DomainSettingsSection } from '../DomainSettingsSection'; - -const serviceAccount = 'default'; -const rawData = 'cliOutputLocationPrefix'; -const maxParallelism = 10; - -const mockConfigData = { - maxParallelism: maxParallelism, - securityContext: { runAs: { k8sServiceAccount: serviceAccount } }, - rawOutputDataConfig: { outputLocationPrefix: rawData }, - annotations: { values: { cliAnnotationKey: 'cliAnnotationValue' } }, - labels: { values: { cliLabelKey: 'cliLabelValue' } }, -}; - -const mockConfigDataWithoutLabels = { - maxParallelism: maxParallelism, - securityContext: { runAs: { k8sServiceAccount: serviceAccount } }, - rawOutputDataConfig: { outputLocationPrefix: rawData }, - annotations: { values: { cliAnnotationKey: 'cliAnnotationValue' } }, -}; - -const mockConfigDataWithoutLabelsAndAnnotations = { - maxParallelism: maxParallelism, - securityContext: { runAs: { k8sServiceAccount: serviceAccount } }, - rawOutputDataConfig: { outputLocationPrefix: rawData }, -}; - -describe('DomainSettingsSection', () => { - it('should not render a block if config data passed is empty', () => { - const { container } = render( - - - , - ); - expect(container).toBeEmptyDOMElement(); - }); - - it('should render a section without IAMRole data', () => { - const { queryByText, queryAllByRole } = render( - - - , - ); - expect(queryByText('Domain Settings')).toBeInTheDocument(); - // should display serviceAccount value - expect(queryByText(serviceAccount)).toBeInTheDocument(); - // should display rawData value - expect(queryByText(rawData)).toBeInTheDocument(); - // should display maxParallelism value - expect(queryByText(maxParallelism)).toBeInTheDocument(); - // should display 2 data tables - const tables = queryAllByRole('table'); - expect(tables).toHaveLength(2); - // should display a placeholder text, as role was not passed - const emptyRole = queryByText('-'); - expect(emptyRole).toBeInTheDocument(); - }); - - it('should render a section without IAMRole and Labels data', () => { - const { queryByText, queryAllByText, queryAllByRole } = render( - - - , - ); - expect(queryByText('Domain Settings')).toBeInTheDocument(); - // should display serviceAccount value - expect(queryByText(serviceAccount)).toBeInTheDocument(); - // should display rawData value - expect(queryByText(rawData)).toBeInTheDocument(); - // should display maxParallelism value - expect(queryByText(maxParallelism)).toBeInTheDocument(); - // should display 1 data table - const tables = queryAllByRole('table'); - expect(tables).toHaveLength(1); - // should display two placeholder text, as role and labels were not passed - const inheritedPlaceholders = queryAllByText('-'); - expect(inheritedPlaceholders).toHaveLength(2); - }); - - it('should render a section without IAMRole, Labels, Annotations data', () => { - const { queryByText, queryAllByText, queryByRole } = render( - - - , - ); - expect(queryByText('Domain Settings')).toBeInTheDocument(); - // should display serviceAccount value - expect(queryByText(serviceAccount)).toBeInTheDocument(); - // should display rawData value - expect(queryByText(rawData)).toBeInTheDocument(); - // should display maxParallelism value - expect(queryByText(maxParallelism)).toBeInTheDocument(); - // should not display any data tables - const tables = queryByRole('table'); - expect(tables).not.toBeInTheDocument(); - // should display three placeholder text, as role, labels, annotations were not passed - const inheritedPlaceholders = queryAllByText('-'); - expect(inheritedPlaceholders).toHaveLength(3); - }); -}); diff --git a/packages/console/src/components/common/test/LoadingSpinner.test.tsx b/packages/console/src/components/common/test/LoadingSpinner.test.tsx deleted file mode 100644 index 76b45343c..000000000 --- a/packages/console/src/components/common/test/LoadingSpinner.test.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { render, waitFor } from '@testing-library/react'; -import * as React from 'react'; - -import { LoadingSpinner } from '../LoadingSpinner'; - -describe('LoadingSpinner', () => { - beforeEach(() => { - jest.useFakeTimers(); - }); - - afterEach(() => { - jest.clearAllTimers(); - jest.useRealTimers(); - }); - - it('delays rendering for 1 second', async () => { - const { queryByTestId, getByTestId } = render(); - await waitFor(() => { - jest.advanceTimersByTime(500); - }); - expect(queryByTestId('loading-spinner')).toBeNull(); - await waitFor(() => { - jest.advanceTimersByTime(500); - }); - expect(getByTestId('loading-spinner')).not.toBeNull(); - }); -}); diff --git a/packages/console/src/components/common/test/SearchableList.spec.tsx b/packages/console/src/components/common/test/SearchableList.spec.tsx deleted file mode 100644 index d2f56c778..000000000 --- a/packages/console/src/components/common/test/SearchableList.spec.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { fireEvent, render } from '@testing-library/react'; -import * as React from 'react'; - -import { - SearchableList, - SearchableListProps, - SearchResult, -} from '../SearchableList'; - -const listStringItems: string[] = [ - 'A Workflow', - 'BetterWorkflow', - 'ZZLastItemz', -]; - -interface SimpleItem { - id: string; - label: string; -} -const listObjectItems: SimpleItem[] = listStringItems.map(s => ({ - id: s, - label: s, -})); - -const renderContent = (results: SearchResult[]) => ( -
- {results.map(r => ( -
- {r.content} -
- ))} -
-); - -describe('SearchableList', () => { - let props: SearchableListProps; - const renderList = () => render(); - beforeEach(() => { - props = { - renderContent, - items: [...listObjectItems], - propertyGetter: 'id', - }; - }); - - it('should use custom placeholder if provided', () => { - props.placeholder = 'custom placeholder'; - const { getByPlaceholderText } = renderList(); - expect(getByPlaceholderText(props.placeholder)).toBeTruthy(); - }); - - describe('when a search string is provided', () => { - // [input string, expected_matches[]] - const searchCases: [string, string[]][] = [ - ['A', ['A Workflow', 'ZZLastItemz']], - ['a', ['A Workflow', 'ZZLastItemz']], // should be case-insensitive - ['B', ['BetterWorkflow']], - ['C', []], - ['W', ['A Workflow', 'BetterWorkflow']], - ['Z', ['ZZLastItemz']], - ['ZZ', ['ZZLastItemz']], - ['ZZZ', ['ZZLastItemz']], - ['ZZZZ', []], - ]; - - searchCases.forEach(([input, expectedValues]) => { - const expectString = expectedValues.length - ? `should match ${expectedValues} with input ${input}` - : `should have no matches for input ${input}`; - - it(expectString, async () => { - const { getByRole, getByLabelText, queryAllByRole } = renderList(); - await fireEvent.change(getByRole('search'), { - target: { value: input }, - }); - - expect(queryAllByRole('list-item').length).toEqual( - expectedValues.length, - ); - expectedValues.forEach(value => - expect(getByLabelText(value)).toBeTruthy(), - ); - }); - }); - - it('should accept a string propertyGetter', async () => { - props.propertyGetter = 'id'; - const { getByRole, getByLabelText } = renderList(); - await fireEvent.change(getByRole('search'), { - target: { value: 'A W' }, - }); - - expect(getByLabelText('A Workflow')).toBeTruthy(); - }); - - it('should accept a function propertyGetter', async () => { - props.propertyGetter = item => item.id; - const { getByRole, getByLabelText } = renderList(); - await fireEvent.change(getByRole('search'), { - target: { value: 'A W' }, - }); - - expect(getByLabelText('A Workflow')).toBeTruthy(); - }); - }); -}); diff --git a/packages/console/src/components/common/useSearchableListState.ts b/packages/console/src/components/common/useSearchableListState.ts deleted file mode 100644 index 7a2cc87dc..000000000 --- a/packages/console/src/components/common/useSearchableListState.ts +++ /dev/null @@ -1,159 +0,0 @@ -import fuzzysort from 'fuzzysort'; -import { createElement, Fragment, useEffect, useState } from 'react'; - -interface SearchTarget { - value: T; - prepared: Fuzzysort.Prepared | undefined; -} - -interface PreparedItem { - value: T; - prepared: Fuzzysort.Prepared | undefined; -} - -export type PropertyGetter = (item: T) => string; - -/** A displayable search result item */ -export interface SearchResult { - /** Undecorated string identifying the item */ - key: string; - /** (Potentially) decorated string of HTML to be displayed */ - content: React.ReactNode; - /** The raw value of the item */ - value: T; -} - -export interface SearchableListStateArgs { - items: T[]; - propertyGetter: keyof T | PropertyGetter; -} - -function getProperty(item: T, getter: keyof T | PropertyGetter): string { - return typeof getter === 'function' ? getter(item) : `${item[getter]}`; -} - -/** Generates a plain list of un-highlighted search results */ -function toSearchResults( - items: T[], - getter: keyof T | PropertyGetter, -): SearchResult[] { - return items.map(item => { - const property = getProperty(item, getter); - return { - content: property, - key: property, - value: item, - }; - }); -} - -interface MatchRange { - start: number; - end: number; -} -const createHighlightedResult = ( - result: Fuzzysort.KeyResult>, - highlightElement = 'mark', -) => { - const { indexes, target } = result; - const parts: React.ReactNodeArray = []; - let lastMatchRange: MatchRange = { - start: 0, - end: 0, - }; - let prevIndex = 0; - // fuzzysort generates an array of indices for each matching letter - // in the target string. We want to wrap a highlight element around each - // continuous range of matching indices. This will result in an array of - // mixed fragments that are either string literals or an element with - // a string literal as a child. - indexes.forEach((matchIndex, idx) => { - if (lastMatchRange.end !== matchIndex) { - lastMatchRange = { - start: matchIndex, - end: matchIndex + 1, - }; - } else { - lastMatchRange.end = matchIndex + 1; - } - - if (idx + 1 === indexes.length || indexes[idx + 1] !== lastMatchRange.end) { - if (lastMatchRange.start !== 0) { - parts.push(result.target.substring(prevIndex, lastMatchRange.start)); - } - parts.push( - createElement( - highlightElement, - { key: lastMatchRange.start }, - result.target.substring(lastMatchRange.start, lastMatchRange.end), - ), - ); - prevIndex = matchIndex + 1; - } - }); - - if (lastMatchRange.end !== target.length) { - parts.push(result.target.substring(lastMatchRange.end, target.length)); - } - - return createElement(Fragment, { children: parts }); -}; - -/** Converts a prepared list of search targets into a list of search results */ -function getFilteredItems( - targets: SearchTarget[], - searchString: string, -): SearchResult[] { - const results = fuzzysort.go(searchString, targets, { - allowTypo: false, - key: 'prepared', - }); - return results.map(result => { - const content = createHighlightedResult(result); - return { - content, - key: result.target, - value: result.obj.value, - }; - }); -} - -/** Manages state for fuzzy-matching a set of items by a search string, with the - * resulting list of items being highlighted where characters in the search - * string match characters in the item - */ -export const useSearchableListState = ({ - items, - propertyGetter, -}: SearchableListStateArgs) => { - const [preparedItems, setPreparedItems] = useState[]>([]); - const [results, setResults] = useState[]>([]); - const [searchString, setSearchString] = useState(''); - const [unfilteredResults, setUnfilteredResults] = useState[]>( - [], - ); - - useEffect(() => { - setUnfilteredResults(toSearchResults(items, propertyGetter)); - setPreparedItems( - items.map(value => ({ - value, - prepared: fuzzysort.prepare(getProperty(value, propertyGetter)), - })), - ); - }, [items]); - - useEffect(() => { - setResults( - searchString.length === 0 - ? unfilteredResults - : getFilteredItems(preparedItems, searchString), - ); - }, [preparedItems, unfilteredResults, searchString]); - - return { - results, - searchString, - setSearchString, - }; -}; diff --git a/packages/console/src/components/common/utils.ts b/packages/console/src/components/common/utils.ts deleted file mode 100644 index f01a68a42..000000000 --- a/packages/console/src/components/common/utils.ts +++ /dev/null @@ -1,57 +0,0 @@ -// Canvas will be created on first use and cached for better performance -let textMeasureCanvas: HTMLCanvasElement; - -/** Uses a canvas to measure the needed width to render a string using a given - * font definition. - */ -export function measureText(fontDefinition: string, text: string) { - if (!textMeasureCanvas) { - textMeasureCanvas = document.createElement('canvas'); - } - const context = textMeasureCanvas.getContext('2d'); - if (!context) { - throw new Error('Unable to create canvas context for text measurement'); - } - - context.font = fontDefinition; - return context.measureText(text); -} - -/** - * Note: - * Dynamic nodes are deteremined at runtime and thus do not come - * down as part of the workflow closure. We can detect and place - * dynamic nodes by finding orphan execution id's and then mapping - * those executions into the dag by using the executions 'uniqueParentId' - * to render that node as a subworkflow - */ -export const checkForDynamicExecutions = (allExecutions, staticExecutions) => { - const parentsToFetch = {}; - const executionsByNodeId = {}; - for (const executionId in allExecutions) { - const execution = allExecutions[executionId]; - executionsByNodeId[execution?.id?.nodeId] = execution; - if (!staticExecutions[executionId]) { - if (execution) { - const dynamicExecutionId = - execution.metadata?.specNodeId || execution.id; - const uniqueParentId = execution.fromUniqueParentId; - if (uniqueParentId) { - if (parentsToFetch[uniqueParentId]) { - parentsToFetch[uniqueParentId].push(dynamicExecutionId); - } else { - parentsToFetch[uniqueParentId] = [dynamicExecutionId]; - } - } - } - } - } - const result = {}; - for (const parentId in parentsToFetch) { - const execution = executionsByNodeId[parentId]; - if (execution) { - result[execution.scopedId] = execution; - } - } - return result; -}; diff --git a/packages/console/src/components/data/index.ts b/packages/console/src/components/data/index.ts deleted file mode 100644 index a36473679..000000000 --- a/packages/console/src/components/data/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './apiContext'; diff --git a/packages/console/src/components/flytegraph/Arrowhead.tsx b/packages/console/src/components/flytegraph/Arrowhead.tsx deleted file mode 100644 index 41da510eb..000000000 --- a/packages/console/src/components/flytegraph/Arrowhead.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from 'react'; - -/** This is the definition for an arrowhead-style point marker. It should be - * inserted in the `` section of the parent `` component in order to - * be available to any path/line components rendered as children. The `id` - * property is configurable and should match the value used in `url(#)`-style - * strings (e.g the `markerMid` property in NodeLinks) - */ -export const Arrowhead: React.FC<{ id: string; fill: string }> = ({ - fill, - id, -}) => { - return ( - - - - ); -}; diff --git a/packages/console/src/components/flytegraph/DragAllowingClickHandler.ts b/packages/console/src/components/flytegraph/DragAllowingClickHandler.ts deleted file mode 100644 index be3b77d00..000000000 --- a/packages/console/src/components/flytegraph/DragAllowingClickHandler.ts +++ /dev/null @@ -1,54 +0,0 @@ -import * as React from 'react'; - -export type DragFilteringClickHandlerListener = ( - event: React.MouseEvent, -) => void; - -/** A helper class to filter click events on an element if the mousedown event - * results in a drag further than the specified threshold. The provided listener - * will be called with the final mouseup event if the click has not been filtered - */ -export class DragFilteringClickHandler { - private deltaX = 0; - private deltaY = 0; - private xPos = 0; - private yPos = 0; - private dragging = false; - - constructor( - private listener: DragFilteringClickHandlerListener, - private dragThresholdPx: number = 2, - ) {} - - public onMouseDown = (event: React.MouseEvent) => { - this.dragging = true; - this.xPos = event.clientX; - this.yPos = event.clientY; - this.deltaX = 0; - this.deltaY = 0; - }; - - public onMouseUp = (event: React.MouseEvent) => { - if (!this.dragging) { - return; - } - - this.dragging = false; - if ( - this.deltaX < this.dragThresholdPx && - this.deltaY < this.dragThresholdPx - ) { - this.listener(event); - } - }; - - public onMouseMove = (event: React.MouseEvent) => { - if (!this.dragging) { - return; - } - this.deltaX += Math.abs(event.clientX - this.xPos); - this.deltaY += Math.abs(event.clientY - this.yPos); - this.xPos = event.clientX; - this.yPos = event.clientY; - }; -} diff --git a/packages/console/src/components/flytegraph/InteractiveViewBox.tsx b/packages/console/src/components/flytegraph/InteractiveViewBox.tsx deleted file mode 100644 index 260687d96..000000000 --- a/packages/console/src/components/flytegraph/InteractiveViewBox.tsx +++ /dev/null @@ -1,215 +0,0 @@ -import * as React from 'react'; - -const viewBoxStyles = { - display: 'flex', - height: '100%', - width: '100%', -}; - -interface InteractiveViewBoxChildrenProps { - /** An SVG viewbox string, suitable for use in a `` element */ - viewBox: string; -} - -interface InteractiveViewBoxProps { - /** A single function component which will accept the current viewBox - * string and render arbitrary content - */ - children: (props: InteractiveViewBoxChildrenProps) => React.ReactNode; - /** The natural width of the content */ - height: number; - /** The natural height of the content */ - width: number; -} - -interface ViewBoxRect { - naturalHeight: number; - naturalWidth: number; - height: number; - width: number; - x: number; - y: number; -} - -interface DragData { - xPos: number; - yPos: number; -} - -/** The smallest ratio difference between actual and natural dimensions */ -const minScale = 0.1; -/** The percentage increment/decrement mapped to each pixel on the mouse wheel */ -const scaleMultiplier = 0.001; -/** The ratio of screen pixels to viewport pixels used when dragging. Values - * greater than 1 mean a faster / more sensitive drag. - */ -const dragMultiplier = 2; -const defaultDragData: DragData = { xPos: 0, yPos: 0 }; - -/** Translates a ViewBoxRect by a given x/y, clamping it within the original - * (natural) dimensions - */ -function translateViewBox( - viewBox: ViewBoxRect, - translateX: number, - translateY: number, -): ViewBoxRect { - const x = Math.min( - Math.max(0, viewBox.x - translateX), - viewBox.naturalWidth - viewBox.width, - ); - const y = Math.min( - Math.max(0, viewBox.y - translateY), - viewBox.naturalHeight - viewBox.height, - ); - return { ...viewBox, x, y }; -} - -/** Scales a ViewBoxRect, clamping it within the original dimensions (when - * zooming out) and the smallest allowed viewBox (when zooming in) */ -function scaleViewBox(viewBox: ViewBoxRect, scaleDelta: number): ViewBoxRect { - const width = - scaleDelta < 1 - ? Math.max(minScale * viewBox.naturalWidth, viewBox.width * scaleDelta) - : Math.min(viewBox.naturalWidth, viewBox.width * scaleDelta); - const height = - scaleDelta < 1 - ? Math.max(minScale * viewBox.naturalHeight, viewBox.height * scaleDelta) - : Math.min(viewBox.naturalHeight, viewBox.height * scaleDelta); - return { ...viewBox, height, width }; -} - -class InteractiveViewBoxImpl extends React.Component { - private viewBox: ViewBoxRect; - private updating = false; - private dragData: DragData = defaultDragData; - private viewboxRef: React.RefObject; - - constructor(props: InteractiveViewBoxProps) { - super(props); - this.viewBox = { - naturalWidth: props.width, - naturalHeight: props.height, - width: props.width, - height: props.height, - x: 0, - y: 0, - }; - this.viewboxRef = React.createRef(); - } - - public componentDidMount() { - if (!this.viewboxRef.current) { - return; - } - - this.viewboxRef.current.addEventListener('wheel', this.onWheel, { - capture: true, - }); - } - - public componentWillUnmount() { - this.detachDrag(); - if (this.viewboxRef.current) { - this.viewboxRef.current.removeEventListener('wheel', this.onWheel, { - capture: true, - }); - } - } - - private onWheel = (event: WheelEvent) => { - event.preventDefault(); - // Make the zooming less twitchy - if (Math.abs(event.deltaY) < 2) { - return; - } - - const scaleDelta = 1.0 + scaleMultiplier * event.deltaY; - const scaled = scaleViewBox(this.viewBox, scaleDelta); - - // To keep the zoom centered, we need to translate by half the change - // in width/height - const xDiff = (this.viewBox.width - scaled.width) / 2; - const yDiff = (this.viewBox.height - scaled.height) / 2; - const translated = translateViewBox(scaled, -xDiff, -yDiff); - - this.updateViewBox(translated); - }; - - private onMouseDown = (event: React.MouseEvent) => { - this.attachDrag(event); - }; - - private onMouseUp = () => { - this.detachDrag(); - }; - - private attachDrag = (event: React.MouseEvent) => { - const { clientX: xStart, clientY: yStart } = event; - this.dragData = { - xPos: xStart, - yPos: yStart, - }; - - document.addEventListener('mousemove', this.onMouseMove, { - capture: true, - }); - document.addEventListener('mouseup', this.onMouseUp, { capture: true }); - }; - - private detachDrag = () => { - document.removeEventListener('mousemove', this.onMouseMove, { - capture: true, - }); - document.removeEventListener('mouseup', this.onMouseUp, { - capture: true, - }); - - this.dragData = defaultDragData; - }; - - private onMouseMove = (event: MouseEvent) => { - const deltaX = (event.clientX - this.dragData.xPos) * dragMultiplier; - const deltaY = (event.clientY - this.dragData.yPos) * dragMultiplier; - - this.dragData = { xPos: event.clientX, yPos: event.clientY }; - this.updateViewBox(translateViewBox(this.viewBox, deltaX, deltaY)); - }; - - private updateViewBox(viewBox: ViewBoxRect) { - this.viewBox = viewBox; - if (!this.updating) { - this.updating = true; - window.requestAnimationFrame(() => { - this.forceUpdate(); - this.updating = false; - }); - } - } - - public render() { - const { x, y, width, height } = this.viewBox; - const viewBox = `${x},${y},${width},${height}`; - return ( -
- {this.props.children({ viewBox })} -
- ); - } -} - -/** A Wrapper component for SVGs which provides zoom / pan mouse interactions - * and feeds the resulting `viewBox` string to its child component. This - * component will fill stretch to fill the available *content* space of its - * parent. So it's best used inside a flex child with `flex-grow: 1`, or an - * element with an explicit width/height. - */ -export const InteractiveViewBox: React.FC = props => ( - // Using key to force a re-mount of the viewbox if the desired width/height - // changed. - -); diff --git a/packages/console/src/components/flytegraph/Layout.tsx b/packages/console/src/components/flytegraph/Layout.tsx deleted file mode 100644 index 7acc30495..000000000 --- a/packages/console/src/components/flytegraph/Layout.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { isEqual } from 'lodash'; -import memoizeOne, { EqualityFn } from 'memoize-one'; -import * as React from 'react'; -import shallowEqual from 'shallowequal'; - -import { layoutGraph } from './layoutUtils'; -import { LayoutProps } from './types'; - -type LayoutGraphArgs = Parameters; -function layoutArgsAreEqual( - newArgs: LayoutGraphArgs, - oldArgs: LayoutGraphArgs, -) { - const [newData, newConfig] = newArgs; - const [oldData, oldConfig] = oldArgs; - /* Nodes can be very deep structures, so we don't want to do a deep compare. - * For the purposes of layout, we just want to check that the array of - * references to nodes hasn't changed. Changing any value in the config will - * result in re-computing a layout, so we do a deep comparison there. - */ - return shallowEqual(newData, oldData) && isEqual(newConfig, oldConfig); -} - -/** Performs layout of graph nodes and passes them to a child component for - * rendering - */ -export class Layout extends React.Component> { - // We memoize the layout result to avoid recomputing it unless the - // input props actually change - layoutGraph = memoizeOne( - (data, config) => layoutGraph(data, config), - layoutArgsAreEqual as EqualityFn, - ); - - public render() { - const { config, data } = this.props; - return this.props.children(this.layoutGraph(data, config)); - } -} diff --git a/packages/console/src/components/flytegraph/Node.tsx b/packages/console/src/components/flytegraph/Node.tsx deleted file mode 100644 index 7cb1388f4..000000000 --- a/packages/console/src/components/flytegraph/Node.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import * as React from 'react'; -import { NodeText as DefaultNodeText } from './NodeText'; -import { NodeRendererProps } from './types'; - -const hoverScaleMultiplier = 1.1; -const selectedScaleMultiplier = 1.2; -const transitionConfig = '0.1s ease-in-out'; - -const nodeStyles: Record = { - base: { - transition: `transform ${transitionConfig}`, - userSelect: 'none', - }, - hovered: { - transform: `scale(${hoverScaleMultiplier})`, - }, - selected: { - transform: `scale(${selectedScaleMultiplier})`, - }, -}; -const nodeContainerStyles: React.CSSProperties = { - cursor: 'pointer', -}; - -const selectionRectStyles: Record = { - base: { - transition: `opacity ${transitionConfig}`, - opacity: 0, - }, - visible: { - opacity: 1, - }, -}; - -function getNodeStyles({ - selected, - hovered, -}: NodeRendererProps): React.CSSProperties { - return { - ...nodeStyles.base, - ...(hovered && nodeStyles.hovered), - ...(selected && nodeStyles.selected), - }; -} - -function getSelectionRectStyles({ - selected, -}: NodeRendererProps): React.CSSProperties { - return { - ...selectionRectStyles.base, - ...(selected && selectionRectStyles.visible), - }; -} - -/** Default renderer for a Node, which will render a simple rounded rectangle */ -export const Node: React.FC> = props => { - const { - children, - config, - node, - selected = false, - hovered = false, - onClick, - onEnter, - onLeave, - textRenderer: NodeText = DefaultNodeText, - } = props; - const { - cornerRounding, - fontSize, - fillColor, - selectStrokeColor, - selectStrokeWidth, - strokeColor, - textPadding, - strokeWidth, - } = config; - - const height = fontSize + textPadding * 2; - const width = node.textWidth + textPadding * 2; - - const baseRectProps: React.SVGProps = { - height, - width, - rx: cornerRounding, - ry: cornerRounding, - x: -width / 2, - y: -height / 2, - }; - return ( - - - - - - {children} - - - ); -}; diff --git a/packages/console/src/components/flytegraph/NodeLink.tsx b/packages/console/src/components/flytegraph/NodeLink.tsx deleted file mode 100644 index 6deef4d6a..000000000 --- a/packages/console/src/components/flytegraph/NodeLink.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import d3Shape from 'd3-shape'; -import * as React from 'react'; - -import { componentIds } from './constants'; -import { NodeLinkRendererProps, Point } from './types'; -import { getMidpoint } from './utils'; - -// Given a set of points, will generate path data for a curve through them -const generateLine: d3Shape.Line = d3Shape - .line() - .curve(d3Shape.curveCatmullRom) - .x(d => d.x) - .y(d => d.y); - -/** The default NodeLink renderer. This component draws links - * as Catmull-Rom curves in a element using at least the start point - * (source) and end point (target). Additional mid points are passed as - * `link.data.points`. If no midpoints exist (such as for a straight line), this - * component will calculate and insert a point to ensure at least one - * directional marker is drawn along the line. */ -export const NodeLink: React.FC> = ({ - config, - link, -}) => { - const { strokeColor, strokeWidth } = config; - const { - source, - target, - data: { points }, - } = link; - - // We need at least one midpoint for an arrow to be drawn. - // For simple straight paths, no midpoints will have been - // generated, so we must add one. - const midpoints = - points && points.length ? points : [getMidpoint(source, target)]; - const finalPoints: Point[] = [ - { x: source.x, y: source.y }, - ...midpoints, - { x: target.x, y: target.y }, - ]; - - return ( - - ); -}; diff --git a/packages/console/src/components/flytegraph/NodeText.tsx b/packages/console/src/components/flytegraph/NodeText.tsx deleted file mode 100644 index 4d0bb469f..000000000 --- a/packages/console/src/components/flytegraph/NodeText.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import contrast from 'contrast'; -import * as React from 'react'; -import { textColors } from './theme'; -import { NodeTextRendererProps } from './types'; - -/** Renders the text content for an individual node. */ -export const NodeText: React.FC> = ({ - config, - node, -}) => { - const textColor = config.textColor - ? config.textColor - : textColors[contrast(config.fillColor)]; - return ( - - {node.id} - - ); -}; diff --git a/packages/console/src/components/flytegraph/ReactFlow/BreadCrumb.tsx b/packages/console/src/components/flytegraph/ReactFlow/BreadCrumb.tsx deleted file mode 100644 index ab4cd7971..000000000 --- a/packages/console/src/components/flytegraph/ReactFlow/BreadCrumb.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import React, { PropsWithChildren } from 'react'; -import { - NodeExecutionDynamicProvider, - useNodeExecutionDynamicContext, -} from 'components/Executions/contextProvider/NodeExecutionDetails/NodeExecutionDynamicProvider'; -import { COLOR_SPECTRUM } from 'components/Theme/colorSpectrum'; -import { dNode } from 'models/Graph/types'; -import { NodeExecutionPhase } from 'models'; -import { findNodeInDag, getNestedContainerStyle } from './utils'; -import { RFCustomData } from './types'; - -const BREAD_FONT_SIZE = '9px'; -const BREAD_COLOR_ACTIVE = COLOR_SPECTRUM.purple60.color; -const BREAD_COLOR_INACTIVE = COLOR_SPECTRUM.black.color; - -export const BreadElement = ({ - nestedView, - index, - currentNestedDepth, - scopedId, - onClick, -}) => { - const liStyles: React.CSSProperties = { - cursor: 'pointer', - fontSize: BREAD_FONT_SIZE, - color: BREAD_COLOR_ACTIVE, - }; - - const liStyleInactive: React.CSSProperties = { ...liStyles }; - liStyleInactive['color'] = BREAD_COLOR_INACTIVE; - - const beforeStyle: React.CSSProperties = { - cursor: 'pointer', - color: BREAD_COLOR_ACTIVE, - padding: '0 .2rem', - fontSize: BREAD_FONT_SIZE, - }; - - return ( -
  • - {index === 0 ? {'>'} : null} - {nestedView} - {index < currentNestedDepth - 1 ? ( - {'>'} - ) : null} -
  • - ); -}; - -const BorderElement = ({ - node, - initialNodeExecutionStatus, - children, -}: PropsWithChildren<{ - node: dNode; - initialNodeExecutionStatus: NodeExecutionPhase; -}>) => { - const { componentProps } = useNodeExecutionDynamicContext(); - - const nodeExecutionStatus = - node?.execution?.closure.phase || initialNodeExecutionStatus; - const borderStyle = getNestedContainerStyle(nodeExecutionStatus); - - return ( -
    - {children} -
    - ); -}; - -export const BorderContainer = ({ - data, - children, -}: PropsWithChildren<{ - data: RFCustomData; -}>) => { - const { node, currentNestedView, nodeExecutionStatus } = data; - - let contextNode = node; - let borders = ( - - {children} - - ); - for (const view of currentNestedView || []) { - contextNode = findNodeInDag(view, contextNode); - - borders = contextNode ? ( - - - {borders} - - - ) : ( - - {borders} - - ); - } - return borders; -}; - -const breadContainerStyle: React.CSSProperties = { - position: 'absolute', - display: 'flex', - width: '100%', - marginTop: '-1rem', -}; -const olStyles: React.CSSProperties = { - margin: 0, - padding: 0, - display: 'flex', - listStyle: 'none', - listStyleImage: 'none', - minWidth: '1rem', -}; -const headerStyle: React.CSSProperties = { - color: BREAD_COLOR_ACTIVE, - fontSize: BREAD_FONT_SIZE, - margin: 0, - padding: 0, -}; - -export const BreadCrumbContainer = ({ - text, - currentNestedDepth, - handleRootClick, - children, -}: PropsWithChildren<{ - text: string; - currentNestedDepth: number; - handleRootClick: () => void; -}>) => { - const rootClick = currentNestedDepth > 0 ? handleRootClick : undefined; - return ( -
    -
    { - e.stopPropagation(); - rootClick?.(); - }} - > - {text} -
    -
      {children}
    -
    - ); -}; diff --git a/packages/console/src/components/flytegraph/ReactFlow/ReactFlowBreadCrumbProvider.tsx b/packages/console/src/components/flytegraph/ReactFlow/ReactFlowBreadCrumbProvider.tsx deleted file mode 100644 index 26e7a6633..000000000 --- a/packages/console/src/components/flytegraph/ReactFlow/ReactFlowBreadCrumbProvider.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import React, { - createContext, - PropsWithChildren, - useContext, - Ref, - useState, -} from 'react'; - -export type RefType = Ref; -export interface IReactFlowBreadCrumbContext { - currentNestedDepth: number; - currentNestedView: BreadCrumbViews; - setCurrentNestedView: (newLevels: BreadCrumbViews) => void; - onAddNestedView: (view: any, sourceNode?: any) => Promise; - onRemoveNestedView: (viewParent: any, viewIndex: any) => void; -} - -export const ReactFlowBreadCrumbContext = - createContext({ - currentNestedDepth: 0, - currentNestedView: {}, - setCurrentNestedView: () => {}, - onAddNestedView: () => { - throw new Error('please use NodeExecutionDynamicProvider'); - }, - onRemoveNestedView: () => { - throw new Error('please use NodeExecutionDynamicProvider'); - }, - }); - -export interface BreadCrumbViews { - [key: string]: string[]; -} -/** Should wrap "top level" component in Execution view, will build a nodeExecutions tree for specific workflow */ -export const ReactFlowBreadCrumbProvider = ({ - children, -}: PropsWithChildren<{}>) => { - const [currentNestedView, setCurrentNestedView] = useState( - {}, - ); - const currentNestedDepth = (currentNestedView?.length || 0) as any as number; - - const onAddNestedView = async view => { - const currentView = currentNestedView[view.parent] || []; - const newView = { - [view.parent]: [...currentView, view.view], - }; - setCurrentNestedView(newView); - }; - - const onRemoveNestedView = (viewParent, viewIndex) => { - const newcurrentNestedView: any = { ...currentNestedView }; - newcurrentNestedView[viewParent] = newcurrentNestedView[viewParent]?.filter( - (_item, i) => i <= viewIndex, - ); - if (newcurrentNestedView[viewParent]?.length < 1) { - delete newcurrentNestedView[viewParent]; - } - setCurrentNestedView(newcurrentNestedView); - }; - - return ( - - {children} - - ); -}; - -export const useReactFlowBreadCrumbContext = - (): IReactFlowBreadCrumbContext => { - return useContext(ReactFlowBreadCrumbContext); - }; diff --git a/packages/console/src/components/flytegraph/ReactFlow/test/utils.test.ts b/packages/console/src/components/flytegraph/ReactFlow/test/utils.test.ts deleted file mode 100644 index 607b79081..000000000 --- a/packages/console/src/components/flytegraph/ReactFlow/test/utils.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { nodeExecutionPhaseConstants } from 'components/Executions/constants'; -import { NodeExecutionPhase } from 'models/Execution/enums'; -import { COLOR_NOT_EXECUTED, getStatusColor } from '../utils'; - -describe('getStatusColor', () => { - describe.each` - nodeExecutionStatus | expected - ${undefined} | ${COLOR_NOT_EXECUTED} - ${NodeExecutionPhase.FAILED} | ${nodeExecutionPhaseConstants()[NodeExecutionPhase.FAILED].nodeColor} - ${NodeExecutionPhase.FAILING} | ${nodeExecutionPhaseConstants()[NodeExecutionPhase.FAILING].nodeColor} - ${NodeExecutionPhase.SUCCEEDED} | ${nodeExecutionPhaseConstants()[NodeExecutionPhase.SUCCEEDED].nodeColor} - ${NodeExecutionPhase.ABORTED} | ${nodeExecutionPhaseConstants()[NodeExecutionPhase.ABORTED].nodeColor} - ${NodeExecutionPhase.RUNNING} | ${nodeExecutionPhaseConstants()[NodeExecutionPhase.RUNNING].nodeColor} - ${NodeExecutionPhase.QUEUED} | ${nodeExecutionPhaseConstants()[NodeExecutionPhase.QUEUED].nodeColor} - ${NodeExecutionPhase.PAUSED} | ${nodeExecutionPhaseConstants()[NodeExecutionPhase.PAUSED].nodeColor} - ${NodeExecutionPhase.UNDEFINED} | ${nodeExecutionPhaseConstants()[NodeExecutionPhase.UNDEFINED].nodeColor} - `('for each case', ({ nodeExecutionStatus, expected }) => { - it(`should return ${expected} when called with nodeExecutionStatus = ${nodeExecutionStatus}`, () => { - const result = getStatusColor(nodeExecutionStatus); - expect(result).toEqual(expected); - }); - }); -}); diff --git a/packages/console/src/components/flytegraph/RenderedGraph.tsx b/packages/console/src/components/flytegraph/RenderedGraph.tsx deleted file mode 100644 index fc64c9a6e..000000000 --- a/packages/console/src/components/flytegraph/RenderedGraph.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import * as React from 'react'; -import { Arrowhead } from './Arrowhead'; -import { componentIds } from './constants'; -import { DragFilteringClickHandler } from './DragAllowingClickHandler'; -import { Node as DefaultNode } from './Node'; -import { NodeLink as DefaultNodeLink } from './NodeLink'; -import { NodeRenderer, RenderedGraphProps } from './types'; - -interface RenderedGraphState { - hoveredNodes: Record; -} - -/** Renders a DAG that has already undergone layout into a specified height and - * width. These values are usually created by `layoutGraph` or the `Layout` - * component. - */ -export class RenderedGraph extends React.Component< - RenderedGraphProps, - RenderedGraphState -> { - state: RenderedGraphState = { - hoveredNodes: {}, - }; - - private containerClickHandler: DragFilteringClickHandler; - - constructor(props: RenderedGraphProps) { - super(props); - this.containerClickHandler = new DragFilteringClickHandler( - this.onContainerClick, - ); - } - - private clearSelection = () => { - // Don't need to trigger a re-render if selection is already empty - if ( - !this.props.selectedNodes || - this.props.selectedNodes.length === 0 || - !this.props.onNodeSelectionChanged - ) { - return; - } - this.props.onNodeSelectionChanged([]); - }; - - private onNodeEnter = (id: string) => { - const hoveredNodes: Dictionary = { - ...this.state.hoveredNodes, - [id]: true, - }; - this.setState({ hoveredNodes }); - this.props.onNodeEnter && this.props.onNodeEnter(id); - }; - - private onNodeLeave = (id: string) => { - const hoveredNodes: Dictionary = { - ...this.state.hoveredNodes, - }; - delete hoveredNodes[id]; - this.setState({ hoveredNodes }); - this.props.onNodeLeave && this.props.onNodeLeave(id); - }; - - private onNodeSelect = (id: string) => { - // Only supporting single-select at the moment. So if we clicked - // a selected node, reset it. Otherwise, the clicked node is the - // new selection - if (this.props.selectedNodes && this.props.selectedNodes.includes(id)) { - return this.clearSelection(); - } - - this.props.onNodeSelectionChanged && - this.props.onNodeSelectionChanged([id]); - }; - - private onNodeClick = (id: string) => { - this.props.onNodeClick && this.props.onNodeClick(id); - this.onNodeSelect(id); - }; - - private onContainerClick = () => { - this.clearSelection(); - }; - - public render() { - const { - config, - rootNode, - height, - linkRenderer: NodeLink = DefaultNodeLink, - nodeRenderer = DefaultNode, - nodeTextRender, - selectedNodes = [], - width, - } = this.props; - - const viewBox = - this.props.viewBox || `0 0 ${this.props.width} ${this.props.height}`; - - // This is to help the compiler with type inference - const Node = nodeRenderer as NodeRenderer; - - const { hoveredNodes } = this.state; - const selectedNodesById = selectedNodes.reduce>( - (out, nodeId) => Object.assign(out, { [nodeId]: true }), - {}, - ); - const { - nodeLink: { strokeColor: linkStrokeColor }, - } = config; - - const links = rootNode.links(); - const nodes = rootNode.descendants(); - - return ( - - - - - {/* Content container */} - - {/* Empty rect behind everything for background clicks */} - - {/* Links go first, so that Nodes draw over them */} - - {links.map(link => ( - - ))} - - {/* Node layer */} - - {nodes.map(node => ( - - - - ))} - - - - ); - } -} diff --git a/packages/console/src/components/flytegraph/constants.ts b/packages/console/src/components/flytegraph/constants.ts deleted file mode 100644 index 9f15cd774..000000000 --- a/packages/console/src/components/flytegraph/constants.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const componentIds = { - arrowhead: 'arrowhead', -}; - -// This is the grid size used for layout with d3-dag. d3-dag will arrange all of -// the nodes in a square of this size, with x/y values in range [0, layoutSize] -export const layoutSize = 1000; - -// Adjusts the amount of room between edges of adjacent nodes. -// Greater values lead to more space. -export const nodeSpacingMultiplier = 1.5; diff --git a/packages/console/src/components/flytegraph/layoutUtils.ts b/packages/console/src/components/flytegraph/layoutUtils.ts deleted file mode 100644 index 3346f39d6..000000000 --- a/packages/console/src/components/flytegraph/layoutUtils.ts +++ /dev/null @@ -1,215 +0,0 @@ -import d3 from 'd3-dag'; -import { cloneDeep } from 'lodash'; -import { createDebugLogger } from 'common/log'; -import { layoutSize, nodeSpacingMultiplier } from './constants'; -import { createTimer } from './timer'; -import { - GraphConfig, - GraphInputNode, - GraphLayoutResult, - RenderableNode, -} from './types'; -import { groupBy } from './utils'; - -const log = createDebugLogger('layout'); - -interface ColumnMeasurement { - x: number; - maxWidth: number; -} - -function findColumnMeasurements( - nodes: RenderableNode[], -): ColumnMeasurement[] { - // sorting will modify in place, so make a copy - const cloned = [...nodes]; - const buckets = groupBy('x', cloned); - return buckets.map(({ x, points }) => { - const maxWidth = points.reduce((out, node) => { - return Math.max(out, node.textWidth); - }, 0); - return { x, maxWidth }; - }); -} - -function findNeededHorizontalColumnScale(columns: ColumnMeasurement[]) { - return columns.reduce((currentMax, column, idx) => { - if (idx === 0) { - return currentMax; - } - const prevColumn = columns[idx - 1]; - const prevRightBound = prevColumn.x + prevColumn.maxWidth / 2; - const leftBound = column.x - prevColumn.maxWidth / 2; - const overlap = prevRightBound - leftBound; - const oldSpacing = column.x - prevColumn.x; - const newSpacing = oldSpacing + overlap; - return Math.max( - currentMax, - (newSpacing / oldSpacing) * nodeSpacingMultiplier, - ); - }, 0); -} - -// Canvas will be created on first use and cached for better performance -let textMeasureCanvas: HTMLCanvasElement; - -/** Uses a canvas to measure the needed width to render a string using a given - * font definition. - */ -export function measureText(fontSize: number, text: string) { - if (!textMeasureCanvas) { - textMeasureCanvas = document.createElement('canvas'); - } - const context = textMeasureCanvas.getContext('2d'); - if (!context) { - throw new Error('Unable to create canvas context for text measurement'); - } - - const fontString = `${fontSize}px sans-serif`; - - context.font = fontString; - return context.measureText(text); -} - -export interface AssignNodeTextWidthsResult { - // The resulting array of nodes. Nodes are modified in-place, so this is - // provided for convenience. - nodes: RenderableNode[]; - // The maximum measured node width, useful for calculating the necessary - // graph scale to prevent nodes from overlapping horizontally - maxWidth: number; -} - -/** For an array of nodes and a given font size, this will calculate the text - * width for each node and assign it as a property `textWidth` to be used - * when rendering the text rectangle for each node. - */ -export function assignNodeTextSizes( - input: d3.DierarchyPointNode[], - fontSize: number, -): AssignNodeTextWidthsResult { - const nodes = input as RenderableNode[]; - const maxWidth = nodes.reduce((currentMax, node) => { - const measured = measureText(fontSize, node.id); - (node as RenderableNode).textWidth = measured.width; - return Math.max(currentMax, Math.ceil(measured.width)); - }, 0); - return { maxWidth, nodes }; -} - -interface LayoutFunctions { - coordFunction(): unknown; - decrossFunction(): unknown; - layeringFunction(): unknown; -} - -function determineLayoutFunctions( - nodes: T[], -): LayoutFunctions { - // This is the best balance between performance and aesthetics, so we don't - // change it based on the graph. - const layeringFunction = d3.layeringCoffmanGraham(); - // Using a simple criteria (node count) to switch off the expensive - // algorithms. This isn't 100% guaranteed to be efficient (a graph with - // an insane amount of edges of example), but should cover all practical cases - const isLargeGraph = nodes.length > 10; - const coordFunction = isLargeGraph ? d3.coordGreedy() : d3.coordVert(); - const decrossFunction = isLargeGraph ? d3.decrossTwoLayer() : d3.decrossOpt(); - return { coordFunction, decrossFunction, layeringFunction }; -} - -/** Assigns x/y positions to an array of connected graph nodes using a vertical - * graph structure which optimizes for minimum link crossings. Will return the - * root node of the arranged graph, which exposes functions for retrieving the - * links and descendants. - */ -export function layoutGraph( - input: T[], - config: GraphConfig, -): GraphLayoutResult { - const { - node: { fontSize, textPadding }, - } = config; - const timer = createTimer(); - - // The layout operations will modify the data in place, so make a copy - const nodeList = cloneDeep(input); - - const dag = d3.dagStratify()(nodeList); - - const { coordFunction, decrossFunction, layeringFunction } = - determineLayoutFunctions(nodeList); - - const processedDag = d3 - .sugiyama() - .layering(layeringFunction) - .size([layoutSize, layoutSize]) - .coord(coordFunction) - .decross(decrossFunction)(dag); - - // We're rendering horizontally, so flip the x/y coordinates of nodes/links - processedDag.descendants().forEach(node => { - const { x, y } = node; - node.x = y; - node.y = x; - }); - - processedDag.links().forEach(link => { - link.data.points.forEach(point => { - const { x, y } = point; - point.x = y; - point.y = x; - }); - }); - - // Measure the text size of each node and assign it a width to be used for - // rendering - const { nodes } = assignNodeTextSizes(processedDag.descendants(), fontSize); - - // Split the nodes into columns by x position and find the max width in each - // column, to be used for calculating the ideal final size - const columns = findColumnMeasurements(nodes); - - // Find the minimum scale needed to ensure nodes don't overlap - const graphScale = findNeededHorizontalColumnScale(columns); - - const maxOuterColumnWidth = Math.max( - columns[0].maxWidth / 2, - columns[columns.length - 1].maxWidth / 2, - ); - - // we want enough padding on the sides to account for node - // width and enough on top to account for node height, given that - // the center of some nodes will be placed on the edges of the graph. - // Each value is doubled to allow nodes room to grow or shrink up to 2x - // without hitting the bounds - const padding = { - x: 2 * Math.ceil(maxOuterColumnWidth + config.node.strokeWidth), - y: 2 * Math.ceil(fontSize + textPadding + config.node.strokeWidth), - }; - - // Now that we changed the graph size, we need to scale all the - // node and link point positions to match - processedDag.descendants().forEach(node => { - node.x = node.x * graphScale + padding.x; - node.y = node.y * graphScale + padding.y; - }); - - processedDag.links().forEach(link => { - link.data.points.forEach(point => { - point.x = point.x * graphScale + padding.x; - point.y = point.y * graphScale + padding.y; - }); - }); - - // Add the padding to the output graph dimensions - const height = layoutSize * graphScale + padding.y * 2; - const width = layoutSize * graphScale + padding.x * 2; - - log(`Layout time: ${timer.timeStringMS}`); - return { - height, - width, - rootNode: processedDag as RenderableNode, - }; -} diff --git a/packages/console/src/components/flytegraph/theme.ts b/packages/console/src/components/flytegraph/theme.ts deleted file mode 100644 index e367ba76d..000000000 --- a/packages/console/src/components/flytegraph/theme.ts +++ /dev/null @@ -1,28 +0,0 @@ -export const colors = { - black: '#000000', - blue: '#48AFF0', - cobalt: '#2965CC', - darkGray1: '#182026', - forest: '#29A634', - gold: '#D99E0B', - gray1: '#5C7080', - gray4: '#A7B6C2', - indigo: '#7157D9', - lime: '#9BBF30', - rose: '#DB2C6F', - sepia: '#96622D', - turqoise: '#00B3A4', - vermilion: '#D13913', - violet: '#8F398F', - white: '#FFFFFF', - - primary: '#137CBD', - success: '#0F9960', - warning: '#D9822B', - failure: '#DB3737', -}; - -export const textColors = { - light: colors.black, - dark: colors.white, -}; diff --git a/packages/console/src/components/flytegraph/timer.ts b/packages/console/src/components/flytegraph/timer.ts deleted file mode 100644 index 67903dc07..000000000 --- a/packages/console/src/components/flytegraph/timer.ts +++ /dev/null @@ -1,20 +0,0 @@ -class Timer { - public readonly startTime = window.performance.now(); - - public get time() { - return window.performance.now() - this.startTime; - } - - public get timeStringMS() { - return `${this.time.toFixed(2)}ms`; - } -} - -/** Returns a simple object to allow precision timing based on - * window.performance. On construction, the current timestamp is read. - * Subsequent calls to the accessor functions will return the time elapsed since - * `startTime` was sampled. - */ -export function createTimer() { - return new Timer(); -} diff --git a/packages/console/src/components/flytegraph/utils.ts b/packages/console/src/components/flytegraph/utils.ts deleted file mode 100644 index a6c9cea0f..000000000 --- a/packages/console/src/components/flytegraph/utils.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Point } from './types'; - -/** Simple helper to get the midpoint between two points a & b */ -export function getMidpoint(a: Point, b: Point) { - return { - x: (a.x + b.x) / 2, - y: (a.y + b.y) / 2, - }; -} - -interface PointBucket { - x: number; - points: T[]; -} - -/** Will organize a set of points into buckets based on a common - * x/y value. - */ -export function groupBy( - prop: 'x' | 'y', - points: T[], -): PointBucket[] { - points.sort((a, b) => a[prop] - b[prop]); - return points.reduce[]>((buckets, point, idx) => { - const previousPoint = idx === 0 ? null : points[idx - 1]; - if ( - previousPoint === null || - Math.abs(point[prop] - previousPoint[prop]) > Number.EPSILON - ) { - const newBucket = { - x: point[prop], - points: [point], - }; - buckets.push(newBucket); - } else { - const bucket = buckets[buckets.length - 1]; - bucket.points.push(point); - } - return buckets; - }, []); -} diff --git a/packages/console/src/components/hooks/index.ts b/packages/console/src/components/hooks/index.ts deleted file mode 100644 index 53c4e548b..000000000 --- a/packages/console/src/components/hooks/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { useNodeExecution } from './useNodeExecution'; -export { useConditionalQuery } from './useConditionalQuery'; -export * from './utils'; diff --git a/packages/console/src/components/hooks/useDataRefresher.ts b/packages/console/src/components/hooks/useDataRefresher.ts deleted file mode 100644 index 098df0e90..000000000 --- a/packages/console/src/components/hooks/useDataRefresher.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { createDebugLogger } from 'common/log'; -import { getCacheKey } from 'components/Cache/utils'; -import { useEffect } from 'react'; -import { isLoadingState } from './fetchMachine'; -import { FetchableData, fetchStates, RefreshConfig } from './types'; - -const log = createDebugLogger('useDataRefresher'); - -const defaultRefresh = (fetchable: FetchableData) => fetchable.fetch(); - -/** A hook which attaches auto-refresh behavior to a `FetchableData` object. - * @param id A unique id value used to key this hook. This usually should match - * the value provided to your data-fetching hook - * @param fetchable An instance of `FetchableData`, usually provided by a data- - * fetching hook - * @param refreshConfig Configures the refresh behavior (interval, termination - * logic, fetch function, etc) - */ -export function useDataRefresher( - id: IDType, - fetchable: FetchableData, - refreshConfig: RefreshConfig, -) { - const { interval } = refreshConfig; - const { debugName, state, value } = fetchable; - - const isFinal = refreshConfig.valueIsFinal(value); - - // Default refresh implementation is just to fetch the current entity - const doRefresh = refreshConfig.doRefresh || defaultRefresh; - const stateIsRefreshable = - state.matches(fetchStates.LOADED) || isLoadingState(state); - - useEffect(() => { - if (isFinal) { - return; - } - - let timerId = 0; - - const clear = () => { - if (timerId === 0) { - return; - } - - log(`${debugName} detaching data refresher`); - window.clearInterval(timerId); - }; - - if (stateIsRefreshable) { - log(`${debugName} attaching data refresher`); - timerId = window.setInterval(() => doRefresh(fetchable), interval); - } else { - log( - `${debugName} not refreshing fetchable because it is in a failed/idle state`, - fetchable, - ); - } - - // When this effect is cleaned up, we should stop refreshing - return clear; - }, [getCacheKey(id), stateIsRefreshable, isFinal, doRefresh]); -} diff --git a/packages/console/src/components/hooks/useDescription.ts b/packages/console/src/components/hooks/useDescription.ts deleted file mode 100644 index b23028c63..000000000 --- a/packages/console/src/components/hooks/useDescription.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Identifier, IdentifierScope, RequestConfig } from '../../models'; -import { useFetchableData } from './useFetchableData'; -import { DescriptionEntity } from '../../models/DescriptionEntity/types'; -import { FetchableData } from './types'; -import { useAPIContext } from '../data/apiContext'; -import { usePagination } from './usePagination'; - -/** A hook for fetching a description entity */ -export function useDescriptionEntity( - id: Identifier, -): FetchableData { - const { getDescriptionEntity } = useAPIContext(); - return useFetchableData( - { - useCache: true, - debugName: 'DescriptionEntity', - defaultValue: {} as DescriptionEntity, - doFetch: async descriptionEntityId => - (await getDescriptionEntity(descriptionEntityId)) as DescriptionEntity, - }, - id, - ); -} - -/** A hook for fetching a paginated list of description entities */ -export function useDescriptionEntityList( - scope: IdentifierScope, - config: RequestConfig, -) { - const { listDescriptionEntities } = useAPIContext(); - return usePagination( - { ...config, cacheItems: true, fetchArg: scope }, - listDescriptionEntities, - ); -} diff --git a/packages/console/src/components/hooks/useLaunchPlans.ts b/packages/console/src/components/hooks/useLaunchPlans.ts deleted file mode 100644 index 5df29ffc8..000000000 --- a/packages/console/src/components/hooks/useLaunchPlans.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { RequestConfig } from 'models/AdminEntity/types'; -import { listIdentifiers } from 'models/Common/api'; -import { - IdentifierScope, - NamedEntityIdentifier, - ResourceType, -} from 'models/Common/types'; -import { listLaunchPlans } from 'models/Launch/api'; -import { LaunchPlan } from 'models/Launch/types'; -import { usePagination } from './usePagination'; - -/** A hook for fetching a paginated list of launch plans */ -export function useLaunchPlans(scope: IdentifierScope, config: RequestConfig) { - return usePagination( - { ...config, cacheItems: true, fetchArg: scope }, - listLaunchPlans, - ); -} - -/** A hook for fetching a paginated list of launch plan ids */ -export function useLaunchPlanIds( - scope: IdentifierScope, - config: RequestConfig, -) { - return usePagination( - { ...config, fetchArg: scope }, - (scope, requestConfig) => - listIdentifiers({ scope, type: ResourceType.LAUNCH_PLAN }, requestConfig), - ); -} diff --git a/packages/console/src/components/hooks/useLocationState.ts b/packages/console/src/components/hooks/useLocationState.ts deleted file mode 100644 index e065417f9..000000000 --- a/packages/console/src/components/hooks/useLocationState.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { StaticContext } from 'react-router'; -import useReactRouter from 'use-react-router'; - -export interface LocationState { - backLink?: string; -} - -/** A hook for fetching potential state values from the `location` object for the - * current . `LocationState` defines the values that can exist. - */ -export function useLocationState(): LocationState { - const { state = {} } = useReactRouter<{}, StaticContext, LocationState>() - .location; - return state; -} diff --git a/packages/console/src/components/hooks/useNamedEntity.ts b/packages/console/src/components/hooks/useNamedEntity.ts deleted file mode 100644 index 00ae168ff..000000000 --- a/packages/console/src/components/hooks/useNamedEntity.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { useAPIContext } from 'components/data/apiContext'; -import { Core } from '@flyteorg/flyteidl-types'; -import { RequestConfig } from 'models/AdminEntity/types'; -import { getNamedEntity } from 'models/Common/api'; -import { - DomainIdentifierScope, - NamedEntity, - ResourceIdentifier, - ResourceType, -} from 'models/Common/types'; -import { useFetchableData } from './useFetchableData'; -import { usePagination } from './usePagination'; - -/** Fetches a NamedEntity (Workflow, LaunchPlan, Task, etc) for a given - * resourceType/project/domain/name. This is useful to determine any metadata - * associated with the given entity name */ -export function useNamedEntity(input: ResourceIdentifier) { - return useFetchableData( - { - debugName: 'NamedEntity', - defaultValue: {} as NamedEntity, - doFetch: id => getNamedEntity(id), - useCache: true, - }, - input, - ); -} - -/** Fetches the NamedEntity record for a LaunchPlan */ -export function useLaunchPlanNamedEntity( - input: Omit, -) { - return useNamedEntity({ - ...input, - resourceType: Core.ResourceType.LAUNCH_PLAN, - }); -} - -/** Fetches the NamedEntity record for a Task */ -export function useTaskNamedEntity( - input: Omit, -) { - return useNamedEntity({ ...input, resourceType: Core.ResourceType.TASK }); -} - -/** Fetches the NamedEntity record for a Workflow */ -export function useWorkflowNamedEntity( - input: Omit, -) { - return useNamedEntity({ - ...input, - resourceType: Core.ResourceType.WORKFLOW, - }); -} - -/** A hook for fetching a paginated list of task names */ -export function useTaskNameList( - scope: DomainIdentifierScope, - config: RequestConfig, -) { - const { listNamedEntities } = useAPIContext(); - return usePagination( - { ...config, fetchArg: scope }, - (scope, requestConfig) => - listNamedEntities( - { ...scope, resourceType: ResourceType.TASK }, - requestConfig, - ), - ); -} - -/** A hook for fetching a paginated list of workflow names */ -export function useWorkflowNameList( - scope: DomainIdentifierScope, - config: RequestConfig, -) { - const { listNamedEntities } = useAPIContext(); - return usePagination( - { ...config, fetchArg: scope }, - (scope, requestConfig) => - listNamedEntities( - { ...scope, resourceType: ResourceType.WORKFLOW }, - requestConfig, - ), - ); -} diff --git a/packages/console/src/components/hooks/useNodeExecution.ts b/packages/console/src/components/hooks/useNodeExecution.ts deleted file mode 100644 index 1db7d9081..000000000 --- a/packages/console/src/components/hooks/useNodeExecution.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { useAPIContext } from 'components/data/apiContext'; -import { - ExecutionData, - NodeExecution, - NodeExecutionIdentifier, -} from 'models/Execution/types'; -import { FetchableData } from './types'; -import { useFetchableData } from './useFetchableData'; - -/** A hook for fetching a NodeExecution */ -export function useNodeExecution( - id: NodeExecutionIdentifier, -): FetchableData { - const { getNodeExecution } = useAPIContext(); - return useFetchableData( - { - debugName: 'NodeExecution', - defaultValue: {} as NodeExecution, - doFetch: id => getNodeExecution(id), - }, - id, - ); -} - -/** Fetches the signed URLs for NodeExecution data (inputs/outputs) */ -export function useNodeExecutionData( - id: NodeExecutionIdentifier, -): FetchableData { - const { getNodeExecutionData } = useAPIContext(); - return useFetchableData( - { - debugName: 'NodeExecutionData', - defaultValue: {} as ExecutionData, - doFetch: id => - getNodeExecutionData(id).catch(() => { - return {} as ExecutionData; - }), - }, - id, - ); -} diff --git a/packages/console/src/components/hooks/useProjects.ts b/packages/console/src/components/hooks/useProjects.ts deleted file mode 100644 index 4e28a6ca2..000000000 --- a/packages/console/src/components/hooks/useProjects.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { listProjects } from 'models/Project/api'; -import { Project } from 'models/Project/types'; -import { useMemo } from 'react'; -import { useQuery } from 'react-query'; -import isEmpty from 'lodash/isEmpty'; - -/** A hook for fetching the list of available projects */ -export function useProjects(): [Project[], Error | any] { - const query = useQuery({ - queryKey: ['projects'], - queryFn: () => listProjects(), - }); - - const queryData = useMemo(() => { - if (isEmpty(query.data) && !query.isSuccess) { - return [] as Project[]; - } - return query.data as Project[]; - }, [query.data]); - - return [queryData, query.error]; -} - -/** A hook for fetching a single Project */ -export function useProject(id: string) { - const [projects, error] = useProjects(); - - const project = useMemo(() => { - return projects.find(p => p.id === id); - }, [projects, id]); - - return [project, error]; -} diff --git a/packages/console/src/components/hooks/useQueryState.ts b/packages/console/src/components/hooks/useQueryState.ts deleted file mode 100644 index d2050f996..000000000 --- a/packages/console/src/components/hooks/useQueryState.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { pickBy } from 'lodash'; -import { parse, ParsedQuery, stringify } from 'query-string'; -import { useEffect, useState } from 'react'; -import { history } from 'routes/history'; - -/** A hook which allows reading/setting of the current query string params - * It will attach a listener to history so that components using query params - * are updated whenever the path/query changes. - */ -export const useQueryState = () => { - const [params, setParams] = useState>( - parse(history.location.search) as Partial, - ); - - const setQueryState = (newState: T) => { - // Remove any undefined values before serializing - const finalState = pickBy(newState, v => v !== undefined); - history.replace({ ...history.location, search: stringify(finalState) }); - }; - - const setQueryStateValue = (key: string, value?: string) => { - const newParams = { ...params, [key]: value } as T; - setQueryState(newParams); - }; - - useEffect(() => { - return history.listen(location => { - setParams(parse(location.search) as Partial); - }); - }, [history]); - - return { - params, - setQueryState, - setQueryStateValue, - }; -}; diff --git a/packages/console/src/components/hooks/useTabState.ts b/packages/console/src/components/hooks/useTabState.ts deleted file mode 100644 index 83cdabadb..000000000 --- a/packages/console/src/components/hooks/useTabState.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useState } from 'react'; - -export function useTabState( - tabs: { [k: string]: string | object }, - defaultValue: string, -) { - const [value, setValue] = useState(defaultValue); - const onChange = (event: any, tabId: string) => setValue(tabId); - - return { - onChange, - value, - }; -} diff --git a/packages/console/src/components/hooks/useTask.ts b/packages/console/src/components/hooks/useTask.ts deleted file mode 100644 index 83fb45e31..000000000 --- a/packages/console/src/components/hooks/useTask.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { useAPIContext } from 'components/data/apiContext'; -import { RequestConfig } from 'models/AdminEntity/types'; -import { Identifier, IdentifierScope } from 'models/Common/types'; -import { Task, TaskTemplate } from 'models/Task/types'; -import { FetchableData } from './types'; -import { useFetchableData } from './useFetchableData'; -import { usePagination } from './usePagination'; - -/** A hook for fetching a Task template. TaskTemplates may have already been - * fetched as part of retrieving a Workflow. If not, we can retrieve the Task - * directly and read the template from there. - */ -export function useTaskTemplate(id: Identifier): FetchableData { - const { getTask } = useAPIContext(); - return useFetchableData( - { - // Tasks are immutable - useCache: true, - debugName: 'TaskTemplate', - defaultValue: {} as TaskTemplate, - doFetch: async taskId => (await getTask(taskId)) as TaskTemplate, - }, - id, - ); -} - -/** A hook for fetching a paginated list of tasks */ -export function useTaskList(scope: IdentifierScope, config: RequestConfig) { - const { listTasks } = useAPIContext(); - return usePagination( - { ...config, cacheItems: true, fetchArg: scope }, - listTasks, - ); -} diff --git a/packages/console/src/components/hooks/useTaskExecution.ts b/packages/console/src/components/hooks/useTaskExecution.ts deleted file mode 100644 index 6b346971a..000000000 --- a/packages/console/src/components/hooks/useTaskExecution.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { getTaskExecution } from 'models/Execution/api'; -import { TaskExecution, TaskExecutionIdentifier } from 'models/Execution/types'; -import { FetchableData } from './types'; -import { useFetchableData } from './useFetchableData'; - -/** A hook for fetching a TaskExecution */ -export function useTaskExecution( - id: TaskExecutionIdentifier, -): FetchableData { - return useFetchableData( - { - debugName: 'TaskExecution', - defaultValue: {} as TaskExecution, - doFetch: id => getTaskExecution(id), - }, - id, - ); -} diff --git a/packages/console/src/components/hooks/useVersion.ts b/packages/console/src/components/hooks/useVersion.ts deleted file mode 100644 index 16b37cb27..000000000 --- a/packages/console/src/components/hooks/useVersion.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - useFlyteApi, - AdminEndpoint, - getAxiosApiCall, -} from '@flyteorg/flyte-api'; -import { GetVersionResponse } from 'models/Common/types'; -import { useFetchableData } from './useFetchableData'; - -/** State hook that returns the version information */ -function useVersion() { - const { getAdminApiUrl } = useFlyteApi(); - const versionPath = getAdminApiUrl(AdminEndpoint.Version); - - return useFetchableData({ - debugName: 'Version', - defaultValue: null, - doFetch: () => getAxiosApiCall(versionPath), - useCache: true, - }); -} - -export function useAdminVersion() { - const version = useVersion(); - - const cpVersion = version?.value?.controlPlaneVersion; - - // Remove letter "v" from version string, if it's in the beginning - const adminVersion = cpVersion?.Version?.replace(/^v/, '') ?? null; - - return { adminVersion }; -} diff --git a/packages/console/src/components/hooks/useWorkflowExecutions.ts b/packages/console/src/components/hooks/useWorkflowExecutions.ts deleted file mode 100644 index bd8ce0404..000000000 --- a/packages/console/src/components/hooks/useWorkflowExecutions.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { RequestConfig } from 'models/AdminEntity/types'; -import { IdentifierScope } from 'models/Common/types'; -import { listExecutions } from 'models/Execution/api'; -import { Execution } from 'models/Execution/types'; -import { usePagination } from './usePagination'; - -/** A hook for fetching a paginated list of workflow executions */ -export function useWorkflowExecutions( - scope: IdentifierScope, - config: RequestConfig, -) { - return usePagination( - { ...config, cacheItems: true, fetchArg: scope }, - listExecutions, - ); -} diff --git a/packages/console/src/components/index.ts b/packages/console/src/components/index.ts deleted file mode 100644 index d14761b7d..000000000 --- a/packages/console/src/components/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -export * from './data'; -export * from './hooks'; -export * from './common'; -export * from './Errors'; -export * from './Launch'; - -export * from './Navigation'; -export * from './Breadcrumbs'; - -export * from './Executions'; -export * from './Task'; -export * from './Workflow'; - -export * from './App/App'; diff --git a/packages/console/src/components/utils/GlobalStyles.tsx b/packages/console/src/components/utils/GlobalStyles.tsx deleted file mode 100644 index 5f9cf7894..000000000 --- a/packages/console/src/components/utils/GlobalStyles.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React, { useEffect } from 'react'; -import { injectGlobal } from 'emotion'; - -const GlobalStyles = () => { - useEffect(() => { - injectGlobal(` - body > div { - overscroll-behavior: none; - } - .sr-only { - display: none; - } - `); - }, []); - return <>; -}; - -export default GlobalStyles; diff --git a/packages/console/src/config/types.ts b/packages/console/src/config/types.ts deleted file mode 100644 index 18097f144..000000000 --- a/packages/console/src/config/types.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface Env extends NodeJS.ProcessEnv { - ADMIN_API_URL?: string; - BASE_URL?: string; - FLYTE_NAVIGATION?: string; - - DISABLE_ANALYTICS?: string; - NODE_ENV?: 'development' | 'production' | 'test'; - STATUS_URL?: string; -} diff --git a/packages/console/src/errors/fetchErrors.ts b/packages/console/src/errors/fetchErrors.ts deleted file mode 100644 index 89a892882..000000000 --- a/packages/console/src/errors/fetchErrors.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* eslint-disable max-classes-per-file */ - -/** Indicates failure to fetch a resource because it does not exist (404) */ -export class NotFoundError extends Error { - constructor( - public name: string, - msg = 'The requested item could not be found', - ) { - super(msg); - } -} - -/** Indicates failure to fetch a resource because the user is not authorized (401) */ -export class NotAuthorizedError extends Error { - constructor(msg = 'User is not authorized to view this resource') { - super(msg); - } -} diff --git a/packages/console/src/errors/parameterErrors.ts b/packages/console/src/errors/parameterErrors.ts deleted file mode 100644 index 768f342ff..000000000 --- a/packages/console/src/errors/parameterErrors.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable max-classes-per-file */ - -/** Indicates a generic problem with a function parameter */ -export class ParameterError extends Error { - constructor(public name: string, msg: string) { - super(msg); - } -} - -/** Indicates that a parameter requires a value and none was provided */ -export class RequiredError extends ParameterError { - constructor(public name: string, msg = 'This value is required') { - super(name, msg); - } -} - -/** Indicates that the provided parameter value is invalid */ -export class ValueError extends ParameterError { - constructor(public name: string, msg = 'Invalid value') { - super(name, msg); - } -} diff --git a/packages/console/src/errors/protobufErrors.ts b/packages/console/src/errors/protobufErrors.ts deleted file mode 100644 index 0d04c766f..000000000 --- a/packages/console/src/errors/protobufErrors.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** Indicates that a protobuf message is missing one or more expected fields */ -export class MessageMissingRequiredFieldsError extends Error { - constructor( - public fields: string[], - msg = `Message is missing required fields: ${fields.join(',')}`, - ) { - super(msg); - } -} diff --git a/packages/console/src/errors/validationErrors.ts b/packages/console/src/errors/validationErrors.ts deleted file mode 100644 index 6ba045bee..000000000 --- a/packages/console/src/errors/validationErrors.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ParameterError } from './parameterErrors'; - -/** Indicates that one or more provided values are invalid */ -export class ValidationError extends Error { - constructor( - public errors: ParameterError[], - msg = 'One or more parameters are invalid', - ) { - super(msg); - } -} diff --git a/packages/console/src/index.ts b/packages/console/src/index.ts deleted file mode 100644 index 4f70a2912..000000000 --- a/packages/console/src/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import './common/setupProtobuf'; -import { LOCAL_PROJECT_DOMAIN, getLocalStore } from './components'; - -export * from './components'; -export * from './routes'; -export * from './models'; -export * from './common'; -export * from './basics'; -export { LOCAL_PROJECT_DOMAIN, getLocalStore }; diff --git a/packages/console/src/mocks/data/fixtures/dynamicPythonWorkflow.ts b/packages/console/src/mocks/data/fixtures/dynamicPythonWorkflow.ts deleted file mode 100644 index 42c250123..000000000 --- a/packages/console/src/mocks/data/fixtures/dynamicPythonWorkflow.ts +++ /dev/null @@ -1,224 +0,0 @@ -import { TaskExecutionPhase } from 'models/Execution/enums'; -import { endNodeId, startNodeId } from 'models/Node/constants'; -import { nodeIds } from '../constants'; -import { - generateExecutionForWorkflow, - generateNodeExecution, - generateTask, - generateTaskExecution, - generateWorkflow, -} from '../generators'; -import { makeDefaultLaunchPlan, taskNodeIds } from '../utils'; - -const workflowName = 'DynamicPythonTaskWorkflow'; -const pythonTaskName = `${workflowName}.PythonTask`; -const pythonNodeId = 'pythonNode'; -const dynamicTaskName = `${workflowName}.DynamicTask`; -const dynamicNodeId = 'dynamicNode'; - -function getSharedEntities() { - const pythonTask = generateTask( - { name: pythonTaskName }, - { - template: { - type: 'python-task', - }, - }, - ); - - const dynamicTask = generateTask( - { name: dynamicTaskName }, - { - template: { - type: 'dynamic-task', - }, - }, - ); - - const workflow = generateWorkflow( - { name: workflowName }, - { - closure: { - compiledWorkflow: { - primary: { - connections: { - downstream: { - [startNodeId]: { - ids: [dynamicNodeId], - }, - [nodeIds.dynamicTask]: { ids: [endNodeId] }, - }, - upstream: { - [nodeIds.dynamicTask]: { ids: [startNodeId] }, - [endNodeId]: { - ids: [nodeIds.dynamicTask], - }, - }, - }, - template: { - nodes: [ - { - ...taskNodeIds(dynamicNodeId, dynamicTask), - inputs: [], - }, - ], - outputs: [], - }, - }, - tasks: [ - dynamicTask.closure.compiledTask, - pythonTask.closure.compiledTask, - ], - }, - }, - }, - ); - - const launchPlan = makeDefaultLaunchPlan(workflow); - const execution = generateExecutionForWorkflow(workflow, launchPlan); - return { pythonTask, dynamicTask, workflow, launchPlan, execution }; -} - -function generateWithDynamicTaskChild() { - const { dynamicTask, pythonTask, workflow, launchPlan, execution } = - getSharedEntities(); - const pythonNodeExecution = generateNodeExecution(execution, pythonNodeId); - const pythonTaskExecutions = [ - generateTaskExecution(pythonNodeExecution, pythonTask, { - closure: { - phase: TaskExecutionPhase.FAILED, - error: { message: 'Something went wrong.' }, - }, - }), - generateTaskExecution(pythonNodeExecution, pythonTask, { - id: { retryAttempt: 1 }, - }), - ]; - const dynamicNodeExecution = generateNodeExecution(execution, dynamicNodeId); - const dynamicTaskExecution = generateTaskExecution( - dynamicNodeExecution, - dynamicTask, - { - isParent: true, - }, - ); - return { - launchPlans: { top: launchPlan }, - tasks: { dynamic: dynamicTask, python: pythonTask }, - workflows: { top: workflow }, - workflowExecutions: { - top: { - data: execution, - nodeExecutions: { - dynamicNode: { - data: dynamicNodeExecution, - taskExecutions: { - firstAttempt: { - data: dynamicTaskExecution, - nodeExecutions: { - pythonNode: { - data: pythonNodeExecution, - taskExecutions: { - firstAttempt: { - data: pythonTaskExecutions[0], - }, - secondAttempt: { - data: pythonTaskExecutions[1], - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }; -} - -function generateWithNodeExecutionChild() { - const { dynamicTask, pythonTask, workflow, launchPlan, execution } = - getSharedEntities(); - const dynamicNodeExecution = generateNodeExecution(execution, dynamicNodeId, { - metadata: { isParentNode: true }, - }); - const dynamicTaskExecution = generateTaskExecution( - dynamicNodeExecution, - dynamicTask, - ); - const pythonNodeExecutions = [ - generateNodeExecution(execution, `${pythonNodeId}-1`, { - metadata: { retryGroup: '0' }, - }), - generateNodeExecution(execution, `${pythonNodeId}-2`, { - metadata: { retryGroup: '1' }, - }), - ]; - const pythonTaskExecutions = [ - generateTaskExecution(pythonNodeExecutions[0], pythonTask, { - closure: { - phase: TaskExecutionPhase.FAILED, - error: { message: 'Something went wrong.' }, - }, - }), - generateTaskExecution(pythonNodeExecutions[1], pythonTask), - ]; - return { - launchPlans: { top: launchPlan }, - tasks: { - dynamic: dynamicTask, - python: pythonTask, - }, - workflows: { top: workflow }, - workflowExecutions: { - top: { - data: execution, - nodeExecutions: { - dynamicNode: { - data: dynamicNodeExecution, - nodeExecutions: { - firstChild: { - data: pythonNodeExecutions[0], - taskExecutions: { - firstAttempt: { - data: pythonTaskExecutions[0], - }, - }, - }, - secondChild: { - data: pythonNodeExecutions[1], - taskExecutions: { - firstAttempt: { - data: pythonTaskExecutions[1], - }, - }, - }, - }, - taskExecutions: { - firstAttempt: { - data: dynamicTaskExecution, - }, - }, - }, - }, - }, - }, - }; -} - -/** This workflow has a single dynamic task node which will yield an additional - * python task node at runtime using the `TaskExecution.isParent` field. - * The nested python task has two attempts. - */ -export const dynamicPythonTaskWorkflow = { - generate: generateWithDynamicTaskChild, -}; - -/** This workflow has a single dynamic task node which will yield an additional - * python task node at runtime using the `NodeExecution.metadata.isParentNode` field. - * The nested python task has two attempts. - */ -export const dynamicPythonNodeExecutionWorkflow = { - generate: generateWithNodeExecutionChild, -}; diff --git a/packages/console/src/mocks/data/projects.ts b/packages/console/src/mocks/data/projects.ts deleted file mode 100644 index 6627ba376..000000000 --- a/packages/console/src/mocks/data/projects.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Project } from 'models/Project/types'; -import { testDomain, testProject } from './constants'; - -export function emptyProject(id: string, name?: string) { - return { - id, - name: name ?? id, - domains: [], - description: '', - }; -} - -const flyteTest: Project = { - id: testProject, - name: testProject, - description: - 'An umbrella project with a single domain to contain all of the test data.', - domains: [ - { - id: testDomain, - name: testDomain, - }, - ], -}; - -export const projects = { - flyteTest, -}; diff --git a/packages/console/src/mocks/insertDefaultData.ts b/packages/console/src/mocks/insertDefaultData.ts deleted file mode 100644 index 57d0ea4c2..000000000 --- a/packages/console/src/mocks/insertDefaultData.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { AdminServer } from './createAdminServer'; -import { projects } from './data/projects'; - -/** Inserts default global mock data. This can be extended by inserting additional - * mock data fixtures. - */ -export function insertDefaultData(server: AdminServer): void { - server.insertProjects([projects.flyteTest]); -} diff --git a/packages/console/src/models/AdminEntity/index.ts b/packages/console/src/models/AdminEntity/index.ts deleted file mode 100644 index 388345a82..000000000 --- a/packages/console/src/models/AdminEntity/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './AdminApiQuery'; -export * from './AdminEntity'; -export * from './constants'; -export * from './transformRequestError'; -export * from './types'; diff --git a/packages/console/src/models/AdminEntity/test/AdminEntity.spec.ts b/packages/console/src/models/AdminEntity/test/AdminEntity.spec.ts deleted file mode 100644 index cd6992da1..000000000 --- a/packages/console/src/models/AdminEntity/test/AdminEntity.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { NotAuthorizedError, NotFoundError } from 'errors/fetchErrors'; -import { Admin } from '@flyteorg/flyteidl-types'; -import { mockServer } from 'mocks/server'; -import { rest } from 'msw'; -import { getAdminEntity } from '../AdminEntity'; -import { adminApiUrl } from '../utils'; - -describe('getAdminEntity', () => { - const messageType = Admin.Workflow; - let path: string; - - beforeEach(() => { - path = '/workflows/someId'; - }); - - it('Returns a NotFoundError for 404 responses', async () => { - mockServer.use( - rest.get(adminApiUrl(path), (_, res, ctx) => { - return res(ctx.status(404)); - }), - ); - - await expect(getAdminEntity({ path, messageType })).rejects.toEqual( - new NotFoundError(path), - ); - }); - - it('Returns a NotAuthorizedError for 401 responses', async () => { - mockServer.use( - rest.get(adminApiUrl(path), (_, res, ctx) => { - return res(ctx.status(401)); - }), - ); - - await expect(getAdminEntity({ path, messageType })).rejects.toBeInstanceOf( - NotAuthorizedError, - ); - }); -}); diff --git a/packages/console/src/models/Graph/convertFlyteGraphToDAG.ts b/packages/console/src/models/Graph/convertFlyteGraphToDAG.ts deleted file mode 100644 index db1f87830..000000000 --- a/packages/console/src/models/Graph/convertFlyteGraphToDAG.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { createDebugLogger } from 'common/log'; -import { createTimer } from 'common/timer'; -import { cloneDeep, keyBy, values } from 'lodash'; -import { identifierToString } from 'models/Common/utils'; -import { startNodeId } from 'models/Node/constants'; -import { CompiledWorkflowClosure } from 'models/Workflow/types'; -import { DAGNode } from './types'; - -const log = createDebugLogger('models/Workflow'); - -/** Converts a Flyte graph spec to one which can be consumed by the `Graph` - * component. This mostly involves gathering the nodes into an array and - * assigning them `parentId` values based on the connections defined in the - * graph spec. - */ -export function convertFlyteGraphToDAG( - workflow: CompiledWorkflowClosure, -): DAGNode[] { - const timer = createTimer(); - - const { - primary: { - template: { nodes: nodesInput }, - connections, - }, - tasks, - } = workflow; - - const tasksById = keyBy(tasks, task => identifierToString(task.template.id)); - - const nodes = cloneDeep(nodesInput); - // For any nodes that have a `taskNode` field, store a reference to - // the task template for use later during rendering - nodes.forEach(node => { - if (!node.taskNode) { - return; - } - const { referenceId } = node.taskNode; - const task = tasksById[identifierToString(referenceId)]; - if (!task) { - log(`Node ${node.id} references missing task: ${referenceId}`); - return; - } - (node as DAGNode).taskTemplate = task.template; - }); - - const nodeMap: Record = keyBy(nodes, 'id'); - const connectionMap: Map> = new Map(); - - Object.keys(connections.downstream).forEach(parentId => { - const edges = connections.downstream[parentId]; - edges.ids.forEach(id => { - const node = nodeMap[id]; - if (!node) { - log(`Ignoring edge for missing node: ${id}`); - return; - } - if (!node.parentIds) { - node.parentIds = []; - connectionMap.set(node.id, new Map()); - } - - const connectionsForNode = connectionMap.get(node.id)!; - - // Ignore empty node ids and check for duplicates - if (parentId.length > 0 && !connectionsForNode.has(parentId)) { - node.parentIds.push(parentId); - connectionsForNode.set(parentId, true); - } - }); - }); - - // Filter out any nodes with no parents (except for the start node) - const result = values(nodeMap).filter( - n => n.id === startNodeId || (n.parentIds && n.parentIds.length > 0), - ); - - log(`Compilation time: ${timer.timeStringMS}`); - return result; -} diff --git a/packages/console/src/models/Launch/api.ts b/packages/console/src/models/Launch/api.ts deleted file mode 100644 index e11251155..000000000 --- a/packages/console/src/models/Launch/api.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Admin } from '@flyteorg/flyteidl-types'; -import { getAdminEntity } from 'models/AdminEntity/AdminEntity'; -import { defaultPaginationConfig } from 'models/AdminEntity/constants'; -import { RequestConfig } from 'models/AdminEntity/types'; -import { endpointPrefixes } from 'models/Common/constants'; -import { Identifier, IdentifierScope } from 'models/Common/types'; -import { makeIdentifierPath } from 'models/Common/utils'; -import { LaunchPlan } from './types'; -import { launchPlanListTransformer } from './utils'; - -/** Fetches a list of `LaunchPlan` records matching the provided `scope` */ -export const listLaunchPlans = ( - scope: IdentifierScope, - config?: RequestConfig, -) => - getAdminEntity( - { - path: makeIdentifierPath(endpointPrefixes.launchPlan, scope), - messageType: Admin.LaunchPlanList, - transform: launchPlanListTransformer, - }, - { ...defaultPaginationConfig, ...config }, - ); - -/** Fetches an individual `LaunchPlan` */ -export const getLaunchPlan = (id: Identifier, config?: RequestConfig) => - getAdminEntity( - { - path: makeIdentifierPath(endpointPrefixes.launchPlan, id), - messageType: Admin.LaunchPlan, - }, - config, - ); diff --git a/packages/console/src/models/Launch/constants.ts b/packages/console/src/models/Launch/constants.ts deleted file mode 100644 index beec28925..000000000 --- a/packages/console/src/models/Launch/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const launchSortFields = { - name: 'name', -}; diff --git a/packages/console/src/models/Node/utils.ts b/packages/console/src/models/Node/utils.ts deleted file mode 100644 index adc92390b..000000000 --- a/packages/console/src/models/Node/utils.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { endNodeId, ignoredNodeIds, startNodeId } from './constants'; - -export const isStartOrEndNode = (node: any) => { - return ignoredNodeIds.includes(node.id); -}; - -export function isStartNode(node: any) { - return node.id === startNodeId; -} - -export function isEndNode(node: any) { - return node.id === endNodeId; -} - -export function isExpanded(node: any) { - return !!node.expanded; -} diff --git a/packages/console/src/models/Project/test/api.test.ts b/packages/console/src/models/Project/test/api.test.ts deleted file mode 100644 index 9c66b12ac..000000000 --- a/packages/console/src/models/Project/test/api.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { emptyProject } from 'mocks/data/projects'; -import { mockServer } from 'mocks/server'; -import { listProjects } from '../api'; -import { Project } from '../types'; - -describe('Project.api', () => { - let projects: Project[]; - beforeEach(() => { - projects = [ - emptyProject('projectb', 'B Project'), - emptyProject('projecta', 'aproject'), - ]; - mockServer.insertProjects(projects); - }); - describe('listProjects', () => { - it('sorts projects by case-insensitive name', async () => { - const projectsResult = await listProjects(); - expect(projectsResult).toEqual([projects[1], projects[0]]); - }); - }); -}); diff --git a/packages/console/src/models/Project/utils.ts b/packages/console/src/models/Project/utils.ts deleted file mode 100644 index 50ae585b6..000000000 --- a/packages/console/src/models/Project/utils.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { compact } from 'lodash'; -import { Identifier } from 'models/Common/types'; -import { Project } from './types'; - -export function getProjectDomain(project: Project, domainId: string) { - const domain = project.domains.find(d => d.id === domainId); - if (!domain) { - throw new Error( - `Project ${project.name} has no domain with id ${domainId}`, - ); - } - return domain; -} - -export function makeProjectDomainAttributesPath( - prefix: string, - { project, domain }: Partial, -) { - return compact([prefix, project, domain]).join('/'); -} diff --git a/packages/console/src/models/Task/index.ts b/packages/console/src/models/Task/index.ts deleted file mode 100644 index 7c072126e..000000000 --- a/packages/console/src/models/Task/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './constants'; -export * from './types'; -export * from './api'; -export * from './utils'; diff --git a/packages/console/src/models/Workflow/index.ts b/packages/console/src/models/Workflow/index.ts deleted file mode 100644 index fcb073fef..000000000 --- a/packages/console/src/models/Workflow/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './types'; diff --git a/packages/console/src/models/Workflow/utils.ts b/packages/console/src/models/Workflow/utils.ts deleted file mode 100644 index 711eb16a8..000000000 --- a/packages/console/src/models/Workflow/utils.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Admin } from '@flyteorg/flyteidl-types'; -import { createPaginationTransformer } from 'models/AdminEntity/utils'; -import { endpointPrefixes } from 'models/Common/constants'; -import { IdentifierScope } from 'models/Common/types'; -import { makeIdentifierPath } from 'models/Common/utils'; -import { Workflow } from './types'; - -export function makeWorkflowPath(scope: IdentifierScope) { - return makeIdentifierPath(endpointPrefixes.workflow, scope); -} - -/** Transformer to coerce an `Admin.WorkflowList` into a standard shape */ -export const workflowListTransformer = createPaginationTransformer< - Workflow, - Admin.WorkflowList ->('workflows'); diff --git a/packages/console/src/models/__mocks__/graphWorkflowData.ts b/packages/console/src/models/__mocks__/graphWorkflowData.ts deleted file mode 100644 index fa9100f46..000000000 --- a/packages/console/src/models/__mocks__/graphWorkflowData.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { CompiledNode } from 'models/Node/types'; -import { - WorkflowTemplate, - CompiledWorkflow, - CompiledWorkflowClosure, -} from 'models/Workflow/types'; - -export const workflowData = require('models/__mocks__/simpleWorkflowClosure.json'); - -export const mockCompiledWorkflowClosure: CompiledWorkflowClosure = - workflowData.compiledWorkflow; - -export const mockCompiledWorkflow: CompiledWorkflow = - mockCompiledWorkflowClosure.primary; - -export const mockTemplate: WorkflowTemplate = - mockCompiledWorkflowClosure.primary.template; - -export const mockNodesList: CompiledNode[] = mockTemplate.nodes; -export const mockCompiledStartNode: CompiledNode = mockNodesList[0]; -export const mockCompiledEndNode: CompiledNode = mockNodesList[1]; -export const mockCompiledTaskNode: CompiledNode = mockNodesList[2]; - -// const subWorkflow: CompiledWorkflow[] = [{ -// template:{ -// id:{ - -// } -// }, -// connections: {} -// }] -// export const mockSubworkflow: CompiledWorkflow = diff --git a/packages/console/src/models/__mocks__/projectData.ts b/packages/console/src/models/__mocks__/projectData.ts deleted file mode 100644 index d260846e8..000000000 --- a/packages/console/src/models/__mocks__/projectData.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Domain, Project } from 'models/Project/types'; - -export const mockDomainIds = ['development', 'production']; -export const mockProjectIds = Array.from(Array(10).keys()).map( - idx => `project number ${idx}`, -); -const makeDomain: (id: string) => Domain = id => ({ - id, - name: id, -}); - -const makeDomainList: (domainIds: string[]) => Domain[] = domainIds => - domainIds.map(id => makeDomain(id)); - -export const createMockProjects: () => Project[] = () => - mockProjectIds.map(id => ({ - id, - name: id, - domains: makeDomainList(mockDomainIds), - })); diff --git a/packages/console/src/models/index.ts b/packages/console/src/models/index.ts deleted file mode 100644 index a342742c9..000000000 --- a/packages/console/src/models/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './Workflow'; -export * from './AdminEntity'; -export * from './Execution/enums'; -export * from './Execution/types'; -export * from './Task'; -export * from './Common/types'; diff --git a/packages/console/src/routes/ApplicationRouter.tsx b/packages/console/src/routes/ApplicationRouter.tsx deleted file mode 100644 index 6928d77c6..000000000 --- a/packages/console/src/routes/ApplicationRouter.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import React from 'react'; -import { Redirect, Route, Switch } from 'react-router-dom'; -import { history } from 'routes/history'; -import { useExternalConfigurationContext } from 'basics/ExternalConfigurationProvider'; -import { makeRoute } from '@flyteorg/common'; -import { - getLocalStore, - LocalStorageProjectDomain, - LOCAL_PROJECT_DOMAIN, -} from 'components/common/LocalStoreDefaults'; -import { components } from './components'; -import { Routes } from './routes'; - -/** - * Perform an animation when the route changes - * Currently only resets scroll - * @param history - * @returns - */ -const AnimateRoute = ({ history }) => { - const from = React.useRef(window.location); - - const scrollToTop = () => { - setTimeout(() => { - window.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); - }, 0); - }; - - React.useEffect(() => { - const historyAction = history.listen((to, action) => { - if (action === 'PUSH') { - // link click - return scrollToTop(); - } - - if (action === 'POP' && from.current.pathname !== to.pathname) { - // browser back button - // only scroll to top if the path is different - // ignore query params or hash changes - return scrollToTop(); - } - - // update from location - from.current = to.pathname; - }); - - return () => { - historyAction(); - }; - }, []); - - return <>; -}; - -export const ApplicationRouter: React.FC = () => { - const localProjectDomain = getLocalStore( - LOCAL_PROJECT_DOMAIN, - ) as LocalStorageProjectDomain; - const additionalRoutes = - useExternalConfigurationContext()?.registry?.additionalRoutes || []; - return ( - <> - - {additionalRoutes?.length && additionalRoutes.map(route => route)} - - - - - - - - { - /** - * If LocalStoreDefaults exists, we direct them to the project detail view - * for those values. - * - * TODO: the Routes.SelectProject.id check should be removed once we phase out the - * local storage bug that leads to 404 - */ - if ( - localProjectDomain && - localProjectDomain.project !== Routes.SelectProject.id - ) { - return ( - - ); - } else { - return ; - } - }} - /> - - - - - ); -}; diff --git a/packages/console/src/routes/components.ts b/packages/console/src/routes/components.ts deleted file mode 100644 index 230d5d8ec..000000000 --- a/packages/console/src/routes/components.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ExecutionDetails } from 'components/Executions/ExecutionDetails/ExecutionDetails'; -import { NotFound } from 'components/NotFound/NotFound'; -import { ProjectDetails } from 'components/Project/ProjectDetails'; -import { SelectProject } from 'components/SelectProject/SelectProject'; -import { TaskDetails } from 'components/Task/TaskDetails'; -import { WorkflowDetails } from 'components/Workflow/WorkflowDetails'; -import { LaunchPlanDetails } from 'components/LaunchPlan/LaunchPlanDetails'; -import { EntityVersionsDetailsContainer } from 'components/Entities/VersionDetails/EntityVersionDetailsContainer'; - -export interface ComponentsTypes { - executionDetails: typeof ExecutionDetails; - notFound: typeof NotFound; - projectDetails: typeof ProjectDetails; - selectProject: typeof SelectProject; - taskDetails: typeof TaskDetails; - workflowDetails: typeof WorkflowDetails; - entityVersionDetails: typeof EntityVersionsDetailsContainer; - launchPlanDetails: typeof LaunchPlanDetails; -} - -/** Indexes the components for each defined route. These are done separately to avoid circular references - * in components which include the Routes dictionary - */ -export const components: ComponentsTypes = { - executionDetails: ExecutionDetails, - notFound: NotFound, - projectDetails: ProjectDetails, - selectProject: SelectProject, - taskDetails: TaskDetails, - workflowDetails: WorkflowDetails, - entityVersionDetails: EntityVersionsDetailsContainer, - launchPlanDetails: LaunchPlanDetails, -}; diff --git a/packages/console/src/routes/constants.ts b/packages/console/src/routes/constants.ts deleted file mode 100644 index ecae4aafa..000000000 --- a/packages/console/src/routes/constants.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { makeRoute } from '@flyteorg/common'; - -const projectPrefix = '/projects/:projectId'; - -export const projectBasePath = makeRoute(projectPrefix); -export const projectDomainBasePath = makeRoute( - `${projectPrefix}/domains/:domainId`, -); - -export const taskExecutionPath = `${projectDomainBasePath}/task_executions/:executionName/:nodeId/:taskProject/:taskDomain/:taskName/:taskVersion/:retryAttempt`; diff --git a/packages/console/src/routes/history.ts b/packages/console/src/routes/history.ts deleted file mode 100644 index f529e5d6f..000000000 --- a/packages/console/src/routes/history.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createBrowserHistory } from 'history'; - -export const history = createBrowserHistory(); diff --git a/packages/console/src/routes/index.ts b/packages/console/src/routes/index.ts deleted file mode 100644 index 3ae21e10d..000000000 --- a/packages/console/src/routes/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './routes'; -export * from './ApplicationRouter'; -export * from './constants'; diff --git a/packages/console/src/routes/routes.ts b/packages/console/src/routes/routes.ts deleted file mode 100644 index 67814db23..000000000 --- a/packages/console/src/routes/routes.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { ensureSlashPrefixed } from 'common/utils'; -import { WorkflowExecutionIdentifier } from 'models/Execution/types'; -import { makeRoute } from '@flyteorg/common'; -import { projectBasePath, projectDomainBasePath } from './constants'; - -/** Creates a path relative to a particular project */ -export const makeProjectBoundPath = (projectId: string, path = '') => { - return makeRoute( - `/projects/${projectId}${path.length ? ensureSlashPrefixed(path) : path}`, - ); -}; - -/** Creates a path relative to a particular project and domain. Paths should begin with a slash (/) */ -export const makeProjectDomainBoundPath = ( - projectId: string, - domainId: string, - path = '', -) => makeRoute(`/projects/${projectId}/domains/${domainId}${path}`); - -export class Routes { - static NotFound = {}; - - // Landing page - static SelectProject = { - id: '__FLYTE__VIEW_ALL_PROJECTS__', - path: makeRoute('/select-project'), - }; - - // Projects - static ProjectDetails = { - makeUrl: (project: string, section?: string) => { - if (project === this.SelectProject.id) { - return this.SelectProject.path; - } - return makeProjectBoundPath(project, section ? `/${section}` : ''); - }, - path: projectBasePath, - sections: { - dashboard: { - makeUrl: (project: string, domain?: string) => { - return makeProjectBoundPath( - project, - `/executions${domain ? `?domain=${domain}` : ''}`, - ); - }, - path: `${projectBasePath}/executions`, - }, - tasks: { - makeUrl: (project: string, domain?: string) => - makeProjectBoundPath( - project, - `/tasks${domain ? `?domain=${domain}` : ''}`, - ), - path: `${projectBasePath}/tasks`, - }, - workflows: { - makeUrl: (project: string, domain?: string) => - makeProjectBoundPath( - project, - `/workflows${domain ? `?domain=${domain}` : ''}`, - ), - path: `${projectBasePath}/workflows`, - }, - launchPlans: { - makeUrl: (project: string, domain?: string) => - makeProjectBoundPath( - project, - `/launchPlans${domain ? `?domain=${domain}` : ''}`, - ), - path: `${projectBasePath}/launchPlans`, - }, - }, - }; - - static ProjectDashboard = { - makeUrl: (project: string, domain: string) => - makeProjectDomainBoundPath(project, domain, '/executions'), - path: `${projectDomainBasePath}/executions`, - }; - - static ProjectTasks = { - makeUrl: (project: string, domain: string) => - makeProjectDomainBoundPath(project, domain, '/tasks'), - path: `${projectDomainBasePath}/tasks`, - }; - - static ProjectWorkflows = { - makeUrl: (project: string, domain: string) => - makeProjectDomainBoundPath(project, domain, '/workflows'), - path: `${projectDomainBasePath}/workflows`, - }; - - // Workflows - static WorkflowDetails = { - makeUrl: (project: string, domain: string, workflowName: string) => - makeProjectDomainBoundPath(project, domain, `/workflows/${workflowName}`), - path: `${projectDomainBasePath}/(workflows|workflow)/:workflowName`, - }; - - // LaunchPlans - static LaunchPlanDetails = { - makeUrl: (project: string, domain: string, launchPlanName: string) => - makeProjectDomainBoundPath( - project, - domain, - `/launchPlans/${launchPlanName}`, - ), - path: `${projectDomainBasePath}/launchPlans/:launchPlanName`, - }; - - // Entity Version Details - static EntityVersionDetails = { - makeUrl: ( - project: string, - domain: string, - entityName: string, - entityType: string, - version: string, - ) => - makeProjectDomainBoundPath( - project, - domain, - `/${entityType}/${entityName}/version/${encodeURIComponent(version)}`, - ), - path: `${projectDomainBasePath}/:entityType/:entityName/version/:entityVersion`, - }; - - // Tasks - static TaskDetails = { - makeUrl: (project: string, domain: string, taskName: string) => - makeProjectDomainBoundPath(project, domain, `/tasks/${taskName}`), - path: `${projectDomainBasePath}/tasks/:taskName`, - }; - - // Executions - static ExecutionDetails = { - makeUrl: ({ domain, name, project }: WorkflowExecutionIdentifier) => - makeProjectDomainBoundPath(project, domain, `/executions/${name}`), - path: `${projectDomainBasePath}/executions/:executionId`, - }; - - public static getRoute(route: string) { - return this[route]; - } -} diff --git a/packages/console/src/test/modelUtils.ts b/packages/console/src/test/modelUtils.ts deleted file mode 100644 index bfcb8b608..000000000 --- a/packages/console/src/test/modelUtils.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Core } from '@flyteorg/flyteidl-types'; -import { - Identifier, - NamedEntity, - NamedEntityIdentifier, - NamedEntityMetadata, - ResourceType, -} from 'models/Common/types'; -import { NamedEntityState } from 'models/enums'; - -const defaultMetadata = { - description: '', - state: NamedEntityState.NAMED_ENTITY_ACTIVE, -}; - -export function createNamedEntity( - resourceType: ResourceType, - id: NamedEntityIdentifier, - metadataOverrides?: Partial, -): NamedEntity { - return { - id, - resourceType, - metadata: { ...defaultMetadata, ...metadataOverrides }, - }; -} - -export function makeIdentifier(id?: Partial): Identifier { - return { - resourceType: Core.ResourceType.UNSPECIFIED, - project: 'project', - domain: 'domain', - name: 'name', - version: 'version', - ...id, - }; -} - -export function createWorkflowName( - id: NamedEntityIdentifier, - metadata?: Partial, -) { - return createNamedEntity(ResourceType.WORKFLOW, id, metadata); -} diff --git a/packages/console/src/test/setupTests.ts b/packages/console/src/test/setupTests.ts deleted file mode 100644 index 72c4e728f..000000000 --- a/packages/console/src/test/setupTests.ts +++ /dev/null @@ -1,22 +0,0 @@ -import '@testing-library/jest-dom'; -import { insertDefaultData } from 'mocks/insertDefaultData'; -import { mockServer } from 'mocks/server'; -import { obj } from './utils'; - -beforeAll(() => { - insertDefaultData(mockServer); - mockServer.listen({ - onUnhandledRequest: req => { - const message = `Unexpected request: ${obj(req)}`; - throw new Error(message); - }, - }); -}); - -afterEach(() => { - mockServer.resetHandlers(); -}); - -afterAll(() => { - mockServer.close(); -}); diff --git a/packages/console/src/tsd/window.d.ts b/packages/console/src/tsd/window.d.ts deleted file mode 100644 index 33374292f..000000000 --- a/packages/console/src/tsd/window.d.ts +++ /dev/null @@ -1 +0,0 @@ -import "@flyteorg/common"; diff --git a/packages/console/tsconfig.build.es.json b/packages/console/tsconfig.build.es.json deleted file mode 100644 index 9467d3b93..000000000 --- a/packages/console/tsconfig.build.es.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - - "compilerOptions": { - "outDir": "./lib" - }, - - "references": [ - { - "path": "../common/tsconfig.build.es.json" - }, - { - "path": "../flyte-api/tsconfig.build.es.json" - }, - { - "path": "../flyteidl-types/tsconfig.build.es.json" - }, - { - "path": "../locale/tsconfig.build.es.json" - }, - { - "path": "../ui-atoms/tsconfig.build.es.json" - }, - { - "path": "../components/tsconfig.build.es.json" - } - ] -} diff --git a/packages/console/tsconfig.json b/packages/console/tsconfig.json deleted file mode 100644 index 3c65c09bc..000000000 --- a/packages/console/tsconfig.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist", - "baseUrl": "./src", - - "composite": true, - - // TODO: this items should be removed when violations are fixed: - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitAny": false, - "noImplicitOverride": false, - - "paths": { - "@flyteorg/*": ["../packages/*/src"] - } - }, - - "include": ["src/**/*"], - - "references": [ - { - "path": "../common" - }, - { - "path": "../flyte-api" - }, - { - "path": "../flyteidl-types" - }, - { - "path": "../locale" - }, - { - "path": "../ui-atoms" - }, - { - "path": "../components" - } - ] -} diff --git a/packages/console/tsconfig.test.json b/packages/console/tsconfig.test.json deleted file mode 100644 index 7a475311d..000000000 --- a/packages/console/tsconfig.test.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "./tsconfig.json", - "references": [ - { - "path": "../common/tsconfig.test.json" - }, - { - "path": "../components/tsconfig.test.json" - }, - { - "path": "../flyte-api/tsconfig.test.json" - }, - { - "path": "../flyteidl-types/tsconfig.test.json" - }, - { - "path": "../locale/tsconfig.test.json" - }, - { - "path": "../ui-atoms/tsconfig.test.json" - } - ] -} diff --git a/packages/flyte-api/LICENSE b/packages/flyte-api/LICENSE deleted file mode 100644 index bed437514..000000000 --- a/packages/flyte-api/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Lyft, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/packages/flyte-api/README.md b/packages/flyte-api/README.md deleted file mode 100644 index b182b15e1..000000000 --- a/packages/flyte-api/README.md +++ /dev/null @@ -1,42 +0,0 @@ - - -# @flyteorg/flyte-api · [![license](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/flyteorg/flyteconsole/blob/master/packages/flyte-api/LICENSE) [![npm (scoped)](https://img.shields.io/npm/v/@flyteorg/flyte-api?color=blue)](https://www.npmjs.com/package/@flyteorg/flyte-api) [![bundle size](https://img.shields.io/bundlephobia/min/@flyteorg/flyte-api)](https://www.npmjs.com/package/@flyteorg/flyte-api) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/flyteorg/flyteconsole/blob/master/CONTRIBUTING.md) - -This package provides ability to do FlyteAdmin API calls from JS/TS code. - -At this point it allows to get though authentication steps, request user profile and FlyteAdmin version. -In future releases we will add ability to do all types of FlyteAdmin API calls. - -### Installation - -To install the package please run: - -```bash -yarn add @flyteorg/flyte-api -``` - -### Usage - -To use in your application - -- Wrap parent component with - -`ADMIN_API_URL` is a flyte admin domain URL to which `/api/v1/_endpoint` part would be added, to perform REST API call. -` -Then from any child component - -```js -import useAxios from 'axios-hooks'; -import { useFlyteApi, defaultAxiosConfig } from '@flyteorg/flyte-api'; - -... -/** Get profile information */ -const apiContext = useFlyteApi(); - -const profilePath = apiContext.getProfileUrl(); -const [{ data: profile, loading }] = useAxios({ - url: profilePath, - method: 'GET', - ...defaultAxiosConfig, -}); -``` diff --git a/packages/flyte-api/jest.config.js b/packages/flyte-api/jest.config.js index 47c9c236b..a7bde03d6 100644 --- a/packages/flyte-api/jest.config.js +++ b/packages/flyte-api/jest.config.js @@ -1,13 +1,6 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -const sharedConfig = require('../../script/test/jest.base.js'); +/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */ +const sharedConfig = require('../../scripts/jest.base.js'); module.exports = { ...sharedConfig, - setupFilesAfterEnv: ['/../../script/test/jest-setup.ts'], - globals: { - 'ts-jest': { - isolatedModules: true, - tsconfig: '/../../tsconfig.json', - }, - }, }; diff --git a/packages/flyte-api/package.json b/packages/flyte-api/package.json index df268c231..e236fac74 100644 --- a/packages/flyte-api/package.json +++ b/packages/flyte-api/package.json @@ -1,59 +1,33 @@ { - "name": "@flyteorg/flyte-api", - "version": "0.0.2", + "name": "@clients/flyte-api", + "version": "0.1.0", "description": "FlyteConsole plugin to allow access FlyteAPI", "main": "./dist/index.js", "module": "./lib/index.js", "types": "./lib/index.d.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, "repository": { "type": "git", - "url": "https://github.com/flyteorg/flyteconsole.git", + "url": "https://github.com/unionai/cloud.git", "directory": "packages/flyte-api" }, - "files": [ - "LICENSE", - "README.md", - "dist", - "lib", - "node_modules" - ], - "keywords": [ - "flyteorg", - "flyteconsole", - "react", - "flyte-api" - ], - "installConfig": { - "hoistingLimits": "workspaces" - }, "scripts": { - "clean": "rm -rf dist && rm -rf lib && rm -rf **.tsbuildinfo || true", - "build:watch": "run -T tsc-watch --noClear --signalEmittedFiles -p ./tsconfig.build.es.json --onSuccess \"yarn build:watch:success\"", - "build:watch:success": "yarn build:esm:alias && yalc push --force", - "build": "yarn clean && yarn build:esm && yarn build:cjs", - "build:esm": "run -T tsc --module esnext --project ./tsconfig.build.es.json && yarn build:esm:alias", - "build:esm:alias": "run -T tsc-alias -p ./tsconfig.build.es.json", - "build:cjs": "run -T tsc --project ./tsconfig.build.json && run -T tsc-alias -p ./tsconfig.build.json", - "build:types": "run -T tsc --module esnext --project ./tsconfig.build.es.json --emitDeclarationOnly && run -T tsc-alias -p ./tsconfig.build.es.json", - "push:update": "yarn clean && yarn build && yarn publish", - "test": "NODE_ENV=test jest" + "build": "yarn build:esm && yarn build:cjs", + "build:esm": "run -T tsc --module esnext --outDir lib --project ./tsconfig.build.json", + "build:types": "yarn build:cjs --emitDeclarationOnly && yarn build:esm --emitDeclarationOnly", + "build:cjs": "run -T tsc --project ./tsconfig.build.json", + "test": "NODE_ENV=test run -T jest" }, "peerDependencies": { - "react": "^16.14.0", - "react-dom": "^16.14.0" + "@clients/common": "^0.1.0", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.4", + "react": "^18.1.0", + "react-dom": "^18.1.0", + "tslib": "^2.4.1" }, "dependencies": { "axios": "^0.27.2", "camelcase-keys": "^7.0.2", "snakecase-keys": "^5.4.2" - }, - "devDependencies": { - "@types/react": "^16.9.34", - "@types/react-dom": "^16.9.7" } } diff --git a/packages/flyte-api/src/ApiProvider/apiProvider.test.tsx b/packages/flyte-api/src/ApiProvider/apiProvider.test.tsx index 63b84cbb3..68703b311 100644 --- a/packages/flyte-api/src/ApiProvider/apiProvider.test.tsx +++ b/packages/flyte-api/src/ApiProvider/apiProvider.test.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; import { render } from '@testing-library/react'; import { FlyteApiProvider, useFlyteApi } from '.'; -import { AdminEndpoint } from '../utils/constants'; import { getLoginUrl } from './login'; +import AdminEndpoint from '../utils/AdminEndpoint'; const MockCoponent = () => { const context = useFlyteApi(); diff --git a/packages/flyte-api/src/ApiProvider/index.tsx b/packages/flyte-api/src/ApiProvider/index.tsx index 0aa6a58ca..d656e3092 100644 --- a/packages/flyte-api/src/ApiProvider/index.tsx +++ b/packages/flyte-api/src/ApiProvider/index.tsx @@ -1,12 +1,14 @@ -import * as React from 'react'; -import { createContext, useContext } from 'react'; -import { getAdminApiUrl, getEndpointUrl } from '../utils'; -import { AdminEndpoint, RawEndpoint } from '../utils/constants'; -import { defaultLoginStatus, getLoginUrl, LoginStatus } from './login'; +import React, { createContext, useContext } from 'react'; +import AdminEndpoint from '../utils/AdminEndpoint'; +import { defaultLoginStatus, getLoginUrl, getLogoutUrl, LoginStatus } from './login'; +import getEndpointUrl from '../utils/getEndpointUrl'; +import RawEndpoint from '../utils/RawEndpoint'; +import getAdminApiUrl from '../utils/getAdminApiUrl'; export interface FlyteApiContextState { loginStatus: LoginStatus; getLoginUrl: (redirect?: string) => string; + getLogoutUrl: (redirect?: string) => string; getProfileUrl: () => string; getAdminApiUrl: (endpoint: AdminEndpoint | string) => string; } @@ -15,25 +17,27 @@ const FlyteApiContext = createContext({ // default values - used when Provider wrapper is not found loginStatus: defaultLoginStatus, getLoginUrl: () => '#', + getLogoutUrl: () => '#', getProfileUrl: () => '#', getAdminApiUrl: () => '#', }); interface FlyteApiProviderProps { flyteApiDomain?: string; + disableAutomaticLogin?: boolean; children?: React.ReactNode; } export const useFlyteApi = () => useContext(FlyteApiContext); export const FlyteApiProvider = (props: FlyteApiProviderProps) => { - const { flyteApiDomain } = props; + const { flyteApiDomain, disableAutomaticLogin, children } = props; const [loginExpired, setLoginExpired] = React.useState(false); // Whenever we detect expired credentials, trigger a login redirect automatically React.useEffect(() => { - if (loginExpired) { + if (!disableAutomaticLogin && loginExpired) { window.location.href = getLoginUrl(flyteApiDomain); } }, [loginExpired]); @@ -45,13 +49,15 @@ export const FlyteApiProvider = (props: FlyteApiProviderProps) => { expired: loginExpired, setExpired: setLoginExpired, }, - getLoginUrl: redirect => getLoginUrl(flyteApiDomain, redirect), - getProfileUrl: () => - getEndpointUrl(RawEndpoint.Profile, flyteApiDomain), - getAdminApiUrl: endpoint => getAdminApiUrl(endpoint, flyteApiDomain), + getLoginUrl: (redirect) => getLoginUrl(flyteApiDomain, redirect), + getLogoutUrl: (redirect) => getLogoutUrl(flyteApiDomain, redirect), + getProfileUrl: () => getEndpointUrl(RawEndpoint.Profile, flyteApiDomain), + getAdminApiUrl: (endpoint) => getAdminApiUrl(endpoint, flyteApiDomain), }} > - {props.children} + {children} ); }; + +export default FlyteApiProvider; diff --git a/packages/flyte-api/src/ApiProvider/login.ts b/packages/flyte-api/src/ApiProvider/login.ts index aca68eab0..9dca52624 100644 --- a/packages/flyte-api/src/ApiProvider/login.ts +++ b/packages/flyte-api/src/ApiProvider/login.ts @@ -1,5 +1,6 @@ -import { getEndpointUrl } from '../utils'; -import { RawEndpoint } from '../utils/constants'; +import { env } from '@clients/common/environment'; +import getEndpointUrl from '../utils/getEndpointUrl'; +import RawEndpoint from '../utils/RawEndpoint'; export interface LoginStatus { expired: boolean; @@ -16,10 +17,20 @@ export const defaultLoginStatus: LoginStatus = { /** Constructs a url for redirecting to the Admin login endpoint and returning * to the current location after completing the flow. */ -export function getLoginUrl( +export function getLoginUrl(adminUrl?: string, redirectUrl: string = window.location.href) { + const baseUrl = getEndpointUrl(RawEndpoint.Login, adminUrl); + return `${baseUrl}?redirect_url=${redirectUrl}`; +} + +/** Constructs a url for redirecting to the Admin login endpoint and returning + * to the current location after completing the flow. + */ +export function getLogoutUrl( adminUrl?: string, - redirectUrl: string = window.location.href, + redirectUrl: string = `${window.location.origin}${ + env.BASE_URL ? `${env.BASE_URL}` : '' + }/select-project`, ) { - const baseUrl = getEndpointUrl(RawEndpoint.Login, adminUrl); + const baseUrl = getEndpointUrl(RawEndpoint.Logout, adminUrl); return `${baseUrl}?redirect_url=${redirectUrl}`; } diff --git a/packages/flyte-api/src/index.ts b/packages/flyte-api/src/index.ts deleted file mode 100644 index 38885b552..000000000 --- a/packages/flyte-api/src/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { - FlyteApiProvider, - useFlyteApi, - type FlyteApiContextState, -} from './ApiProvider'; - -export { AdminEndpoint, RawEndpoint } from './utils/constants'; -export { getAxiosApiCall, defaultAxiosConfig } from './utils'; diff --git a/packages/flyte-api/src/utils/AdminEndpoint.ts b/packages/flyte-api/src/utils/AdminEndpoint.ts new file mode 100644 index 000000000..815bccac3 --- /dev/null +++ b/packages/flyte-api/src/utils/AdminEndpoint.ts @@ -0,0 +1,5 @@ +export enum AdminEndpoint { + Version = '/version', +} + +export default AdminEndpoint; diff --git a/packages/flyte-api/src/utils/RawEndpoint.ts b/packages/flyte-api/src/utils/RawEndpoint.ts new file mode 100644 index 000000000..07eb645bc --- /dev/null +++ b/packages/flyte-api/src/utils/RawEndpoint.ts @@ -0,0 +1,6 @@ +export enum RawEndpoint { + Logout = '/logout', + Login = '/login', + Profile = '/me', +} +export default RawEndpoint; diff --git a/packages/flyte-api/src/utils/adminApiPrefix.ts b/packages/flyte-api/src/utils/adminApiPrefix.ts new file mode 100644 index 000000000..4531f6d57 --- /dev/null +++ b/packages/flyte-api/src/utils/adminApiPrefix.ts @@ -0,0 +1,2 @@ +export const adminApiPrefix = '/api/v1'; +export default adminApiPrefix; diff --git a/packages/flyte-api/src/utils/constants.ts b/packages/flyte-api/src/utils/constants.ts deleted file mode 100644 index 49cf31413..000000000 --- a/packages/flyte-api/src/utils/constants.ts +++ /dev/null @@ -1,10 +0,0 @@ -export enum RawEndpoint { - Login = '/login', - Profile = '/me', -} - -export const adminApiPrefix = '/api/v1'; - -export enum AdminEndpoint { - Version = '/version', -} diff --git a/packages/flyte-api/src/utils/createLocalURL.ts b/packages/flyte-api/src/utils/createLocalURL.ts new file mode 100644 index 000000000..69e7df580 --- /dev/null +++ b/packages/flyte-api/src/utils/createLocalURL.ts @@ -0,0 +1,6 @@ +import ensureSlashPrefixed from './ensureSlashPrefixed'; + +/** Creates a URL to the same host with a given path */ +export default function createLocalURL(path: string) { + return `${window.location.origin}${ensureSlashPrefixed(path)}`; +} diff --git a/packages/flyte-api/src/utils/defaultAxiosConfig.ts b/packages/flyte-api/src/utils/defaultAxiosConfig.ts new file mode 100644 index 000000000..d1ce6a99f --- /dev/null +++ b/packages/flyte-api/src/utils/defaultAxiosConfig.ts @@ -0,0 +1,27 @@ +import axios, { + AxiosRequestConfig, + AxiosRequestTransformer, + AxiosResponseTransformer, +} from 'axios'; +import snakecaseKeys from 'snakecase-keys'; +import camelcaseKeys from 'camelcase-keys'; +import isObject from './isObject'; + +/** Config object that can be used for requests that are not sent to + * the Admin entity API (`/api/v1/...`), such as the `/me` endpoint. This config + * ensures that requests/responses are correctly converted and that cookies are + * included. + */ +export const defaultAxiosConfig: AxiosRequestConfig = { + transformRequest: [ + (data: any) => (isObject(data) ? snakecaseKeys(data) : data), + ...(axios.defaults.transformRequest as AxiosRequestTransformer[]), + ], + transformResponse: [ + ...(axios.defaults.transformResponse as AxiosResponseTransformer[] as any), + camelcaseKeys, + ], + withCredentials: true, +}; + +export default defaultAxiosConfig; diff --git a/packages/flyte-api/src/utils/ensureSlashPrefixed.ts b/packages/flyte-api/src/utils/ensureSlashPrefixed.ts new file mode 100644 index 000000000..b0ef99a8c --- /dev/null +++ b/packages/flyte-api/src/utils/ensureSlashPrefixed.ts @@ -0,0 +1,4 @@ +/** Ensures that a string is slash-prefixed */ +export default function ensureSlashPrefixed(path: string) { + return path.startsWith('/') ? path : `/${path}`; +} diff --git a/packages/flyte-api/src/utils/errors.ts b/packages/flyte-api/src/utils/errors.ts deleted file mode 100644 index abbbb14a5..000000000 --- a/packages/flyte-api/src/utils/errors.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* eslint-disable max-classes-per-file */ -import { AxiosError } from 'axios'; - -export class NotFoundError extends Error { - constructor( - public override name: string, - msg = 'The requested item could not be found', - ) { - super(msg); - } -} - -/** Indicates failure to fetch a resource because the user is not authorized (401) */ -export class NotAuthorizedError extends Error { - constructor(msg = 'User is not authorized to view this resource') { - super(msg); - } -} - -/** Detects special cases for errors returned from Axios and lets others pass through. */ -export function transformRequestError(err: unknown, path: string) { - const error = err as AxiosError; - - if (!error.response) { - return error; - } - - // For some status codes, we'll throw a special error to allow - // client code and components to handle separately - if (error.response.status === 404) { - return new NotFoundError(path); - } - if (error.response.status === 401) { - return new NotAuthorizedError(); - } - - // this error is not decoded. - return error; -} diff --git a/packages/flyte-api/src/utils/getAdminApiUrl.ts b/packages/flyte-api/src/utils/getAdminApiUrl.ts new file mode 100644 index 000000000..c37f7b99c --- /dev/null +++ b/packages/flyte-api/src/utils/getAdminApiUrl.ts @@ -0,0 +1,17 @@ +import AdminEndpoint from './AdminEndpoint'; +import adminApiPrefix from './adminApiPrefix'; +import createLocalURL from './createLocalURL'; +import ensureSlashPrefixed from './ensureSlashPrefixed'; + +/** Adds admin api prefix to domain Url */ +export function getAdminApiUrl(endpoint: AdminEndpoint | string, adminUrl?: string) { + const finalUrl = `${adminApiPrefix}${ensureSlashPrefixed(endpoint)}`; + + if (adminUrl) { + return `${adminUrl}${finalUrl}`; + } + + return createLocalURL(finalUrl); +} + +export default getAdminApiUrl; diff --git a/packages/flyte-api/src/utils/getAxiosApiCall.ts b/packages/flyte-api/src/utils/getAxiosApiCall.ts new file mode 100644 index 000000000..729a0644c --- /dev/null +++ b/packages/flyte-api/src/utils/getAxiosApiCall.ts @@ -0,0 +1,22 @@ +import axios from 'axios'; +import { transformRequestError } from './transformRequestError'; +import defaultAxiosConfig from './defaultAxiosConfig'; + +/** + * @deprecated Please use `axios-hooks` instead, it will allow you to get full call status. + * example usage https://www.npmjs.com/package/axios-hooks: + * const [{ data: profile, loading, errot }] = useAxios({url: path, method: 'GET', ...defaultAxiosConfig}); + */ +export const getAxiosApiCall = async (path: string): Promise => { + try { + const { data } = await axios.get(path, defaultAxiosConfig); + return data; + } catch (e) { + const { message } = transformRequestError(e, path); + // eslint-disable-next-line no-console + console.error(`Failed to fetch data: ${message}`); + return null; + } +}; + +export default getAxiosApiCall; diff --git a/packages/flyte-api/src/utils/getEndpointUrl.ts b/packages/flyte-api/src/utils/getEndpointUrl.ts new file mode 100644 index 000000000..ab85e46d4 --- /dev/null +++ b/packages/flyte-api/src/utils/getEndpointUrl.ts @@ -0,0 +1,13 @@ +import RawEndpoint from './RawEndpoint'; +import createLocalURL from './createLocalURL'; + +/** Updates Enpoint url depending on admin domain */ +export function getEndpointUrl(endpoint: RawEndpoint | string, adminUrl?: string) { + if (adminUrl) { + return `${adminUrl}${endpoint}`; + } + + return createLocalURL(endpoint); +} + +export default getEndpointUrl; diff --git a/packages/flyte-api/src/utils/index.ts b/packages/flyte-api/src/utils/index.ts deleted file mode 100644 index 4b5ad6396..000000000 --- a/packages/flyte-api/src/utils/index.ts +++ /dev/null @@ -1,80 +0,0 @@ -import axios, { - AxiosRequestConfig, - AxiosRequestTransformer, - AxiosResponseTransformer, -} from 'axios'; -import snakecaseKeys from 'snakecase-keys'; -import camelcaseKeys from 'camelcase-keys'; -import { AdminEndpoint, adminApiPrefix, RawEndpoint } from './constants'; -import { isObject } from './nodeChecks'; -import { transformRequestError } from './errors'; - -/** Ensures that a string is slash-prefixed */ -function ensureSlashPrefixed(path: string) { - return path.startsWith('/') ? path : `/${path}`; -} - -/** Creates a URL to the same host with a given path */ -function createLocalURL(path: string) { - return `${window.location.origin}${ensureSlashPrefixed(path)}`; -} - -/** Updates Enpoint url depending on admin domain */ -export function getEndpointUrl( - endpoint: RawEndpoint | string, - adminUrl?: string, -) { - if (adminUrl) { - return `${adminUrl}${endpoint}`; - } - - return createLocalURL(endpoint); -} - -/** Adds admin api prefix to domain Url */ -export function getAdminApiUrl( - endpoint: AdminEndpoint | string, - adminUrl?: string, -) { - const finalUrl = `${adminApiPrefix}${ensureSlashPrefixed(endpoint)}`; - - if (adminUrl) { - return `${adminUrl}${finalUrl}`; - } - - return createLocalURL(finalUrl); -} - -/** Config object that can be used for requests that are not sent to - * the Admin entity API (`/api/v1/...`), such as the `/me` endpoint. This config - * ensures that requests/responses are correctly converted and that cookies are - * included. - */ -export const defaultAxiosConfig: AxiosRequestConfig = { - transformRequest: [ - (data: any) => (isObject(data) ? snakecaseKeys(data) : data), - ...(axios.defaults.transformRequest as AxiosRequestTransformer[]), - ], - transformResponse: [ - ...(axios.defaults.transformResponse as AxiosResponseTransformer[] as any), - camelcaseKeys, - ], - withCredentials: true, -}; - -/** - * @deprecated Please use `axios-hooks` instead, it will allow you to get full call status. - * example usage https://www.npmjs.com/package/axios-hooks: - * const [{ data: profile, loading, errot }] = useAxios({url: path, method: 'GET', ...defaultAxiosConfig}); - */ -export const getAxiosApiCall = async (path: string): Promise => { - try { - const { data } = await axios.get(path, defaultAxiosConfig); - return data; - } catch (e) { - const { message } = transformRequestError(e, path); - // eslint-disable-next-line no-console - console.error(`Failed to fetch data: ${message}`); - return null; - } -}; diff --git a/packages/flyte-api/src/utils/nodeChecks.ts b/packages/flyte-api/src/utils/isObject.ts similarity index 85% rename from packages/flyte-api/src/utils/nodeChecks.ts rename to packages/flyte-api/src/utils/isObject.ts index 13dc100b7..32d0cac39 100644 --- a/packages/flyte-api/src/utils/nodeChecks.ts +++ b/packages/flyte-api/src/utils/isObject.ts @@ -2,3 +2,5 @@ export const isObject = (value: unknown): boolean => { return value !== null && typeof value === 'object'; }; + +export default isObject; diff --git a/packages/console/src/models/AdminEntity/transformRequestError.ts b/packages/flyte-api/src/utils/transformRequestError.ts similarity index 63% rename from packages/console/src/models/AdminEntity/transformRequestError.ts rename to packages/flyte-api/src/utils/transformRequestError.ts index 47113d5a9..96cb59e2a 100644 --- a/packages/console/src/models/AdminEntity/transformRequestError.ts +++ b/packages/flyte-api/src/utils/transformRequestError.ts @@ -1,7 +1,8 @@ import { AxiosError } from 'axios'; -import { NotAuthorizedError, NotFoundError } from 'errors/fetchErrors'; -import { Admin } from '@flyteorg/flyteidl-types'; -import { decodeProtoResponse } from './utils'; +import Admin from '@clients/common/flyteidl/admin'; +import NotFoundError from '@clients/common/Errors/NotFoundError'; +import NotAuthorizedError from '@clients/common/Errors/NotAuthorizedError'; +import { decodeProtoResponse } from '@clients/common/Utils/decodeProtoResponse'; // to enrich the error message by adding the response function decodeErrorResponseMessage(error: AxiosError) { @@ -11,13 +12,9 @@ function decodeErrorResponseMessage(error: AxiosError) { error.response?.data as any, Admin.RawOutputDataConfig, ); - if ( - decodedErrorResponseMessage && - decodedErrorResponseMessage.outputLocationPrefix - ) { + if (decodedErrorResponseMessage && decodedErrorResponseMessage.outputLocationPrefix) { const errorStatusMessage = error?.message; - const errorResponseMessage = - decodedErrorResponseMessage.outputLocationPrefix; + const errorResponseMessage = decodedErrorResponseMessage.outputLocationPrefix; return new Error(`${errorStatusMessage} ${errorResponseMessage}`); } @@ -28,7 +25,7 @@ function decodeErrorResponseMessage(error: AxiosError) { } /** Detects special cases for errors returned from Axios and lets others pass through. */ -export function transformRequestError(err: unknown, path: string) { +export function transformRequestError(err: unknown, path: string, decodeError = false) { const error = err as AxiosError; if (!error.response) { @@ -44,5 +41,12 @@ export function transformRequestError(err: unknown, path: string) { return new NotAuthorizedError(); } - return decodeErrorResponseMessage(error); + if (decodeError) { + return decodeErrorResponseMessage(error); + } + + // this error is not decoded. + return error; } + +export default transformRequestError; diff --git a/packages/flyte-api/src/utils/utils.test.ts b/packages/flyte-api/src/utils/utils.test.ts index 53fad6ac2..5d93fad75 100644 --- a/packages/flyte-api/src/utils/utils.test.ts +++ b/packages/flyte-api/src/utils/utils.test.ts @@ -1,7 +1,9 @@ -import { getAdminApiUrl, getEndpointUrl } from '.'; -import { AdminEndpoint, RawEndpoint } from './constants'; -import { transformRequestError } from './errors'; -import { isObject } from './nodeChecks'; +import AdminEndpoint from './AdminEndpoint'; +import RawEndpoint from './RawEndpoint'; +import getAdminApiUrl from './getAdminApiUrl'; +import getEndpointUrl from './getEndpointUrl'; +import isObject from './isObject'; +import transformRequestError from './transformRequestError'; describe('flyte-api/utils', () => { it('getEndpointUrl properly uses local or admin domain', () => { @@ -51,26 +53,15 @@ describe('flyte-api/utils', () => { expect(result.message).toEqual('default'); // 401 - Unauthorised - result = transformRequestError( - { response: { status: 401 }, message: 'default' }, - '', - ); - expect(result.message).toEqual( - 'User is not authorized to view this resource', - ); + result = transformRequestError({ response: { status: 401 }, message: 'default' }, ''); + expect(result.message).toEqual('User is not authorized to view this resource'); // 404 - Not Found - result = transformRequestError( - { response: { status: 404 }, message: 'default' }, - '', - ); + result = transformRequestError({ response: { status: 404 }, message: 'default' }, ''); expect(result.message).toEqual('The requested item could not be found'); // unnown status - return item as is - result = transformRequestError( - { response: { status: 502 }, message: 'default' }, - '', - ); + result = transformRequestError({ response: { status: 502 }, message: 'default' }, ''); expect(result.message).toEqual('default'); }); }); diff --git a/packages/flyte-api/tsconfig.build.es.json b/packages/flyte-api/tsconfig.build.es.json deleted file mode 100644 index 7695e5785..000000000 --- a/packages/flyte-api/tsconfig.build.es.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - - "compilerOptions": { - "outDir": "./lib" - } -} diff --git a/packages/flyte-api/tsconfig.build.json b/packages/flyte-api/tsconfig.build.json index 5e19e1b12..1fe24a71b 100644 --- a/packages/flyte-api/tsconfig.build.json +++ b/packages/flyte-api/tsconfig.build.json @@ -1,10 +1,19 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + + "composite": true + }, "exclude": [ // files excluded from the build, we can not put it inro default tsconfig - // as it will interfere with VSCode IntelliSence + // as it will screw VSCode IntelliSence "node_modules", + "dist", + "lib", + "build", "**/test", "**/mocks", "**/__mocks__", @@ -13,5 +22,10 @@ "**/*.test.*", "**/*.mock.*", "**/*.stories.*" + ], + "references": [ + { + "path": "../common/tsconfig.build.json" + } ] } diff --git a/packages/flyte-api/tsconfig.json b/packages/flyte-api/tsconfig.json index e1bebf4ee..ba15882a3 100644 --- a/packages/flyte-api/tsconfig.json +++ b/packages/flyte-api/tsconfig.json @@ -1,16 +1,11 @@ { "extends": "../../tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist", - - "composite": true, - - "paths": {} - }, - "include": ["src/**/*"], - "references": [] + "references": [ + { + "path": "../common/tsconfig.json" + } + ] } diff --git a/packages/flyte-api/tsconfig.test.json b/packages/flyte-api/tsconfig.test.json deleted file mode 100644 index fc8520e73..000000000 --- a/packages/flyte-api/tsconfig.test.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.json" -} diff --git a/packages/flyteidl-types/LICENSE b/packages/flyteidl-types/LICENSE deleted file mode 100644 index bed437514..000000000 --- a/packages/flyteidl-types/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Lyft, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/packages/flyteidl-types/README.md b/packages/flyteidl-types/README.md deleted file mode 100644 index 47afc8905..000000000 --- a/packages/flyteidl-types/README.md +++ /dev/null @@ -1,3 +0,0 @@ - - -# @flyteorg/flyteidl-types · [![license](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/flyteorg/flyteconsole/blob/master/packages/flyteidl-types/LICENSE) [![npm](https://img.shields.io/npm/v/@flyteorg/flyteidl-types?color=blue)](https://www.npmjs.com/package/@flyteorg/flyteidl-types) [![npm bundle size](https://img.shields.io/bundlephobia/min/@flyteorg/flyteidl-types?color=green)](https://www.npmjs.com/package/@flyteorg/flyteidl-types) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/flyteorg/flyteconsole/blob/master/CONTRIBUTING.md) diff --git a/packages/flyteidl-types/package.json b/packages/flyteidl-types/package.json deleted file mode 100644 index d842d690c..000000000 --- a/packages/flyteidl-types/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "@flyteorg/flyteidl-types", - "version": "0.0.4", - "description": "Flyteconsole basics flyteidl types", - "main": "./dist/index.js", - "module": "./lib/index.js", - "types": "./lib/index.d.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "repository": { - "type": "git", - "url": "https://github.com/flyteorg/flyteconsole.git", - "directory": "packages/flyteidl-types" - }, - "files": [ - "LICENSE", - "README.md", - "dist", - "lib", - "node_modules" - ], - "keywords": [ - "flyteorg", - "flyteconsole", - "react", - "flyteidl-types" - ], - "installConfig": { - "hoistingLimits": "workspaces" - }, - "scripts": { - "clean": "rm -rf dist && rm -rf lib && rm -rf **.tsbuildinfo || true", - "build:watch": "run -T tsc-watch --noClear --signalEmittedFiles -p ./tsconfig.build.es.json --onSuccess \"yarn build:watch:success\"", - "build:watch:success": "yarn build:esm:alias && yalc push --force", - "build": "yarn clean && yarn build:esm && yarn build:cjs", - "build:esm": "run -T tsc --module esnext --project ./tsconfig.build.es.json && yarn build:esm:alias", - "build:esm:alias": "run -T tsc-alias -p ./tsconfig.build.es.json", - "build:cjs": "run -T tsc --project ./tsconfig.build.json && run -T tsc-alias -p ./tsconfig.build.json", - "build:types": "run -T tsc --module esnext --project ./tsconfig.build.es.json --emitDeclarationOnly && run -T tsc-alias -p ./tsconfig.build.es.json", - "test": "NODE_ENV=test jest" - }, - "peerDependencies": { - "protobufjs": "~6.11.3" - }, - "dependencies": { - "@flyteorg/flyteidl": "^1.5.21" - } -} diff --git a/packages/flyteidl-types/src/index.ts b/packages/flyteidl-types/src/index.ts deleted file mode 100644 index f47f04dbc..000000000 --- a/packages/flyteidl-types/src/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { flyteidl, google } from '@flyteorg/flyteidl/gen/pb-js/flyteidl'; - -/** Message classes for flyte entities */ -import admin = flyteidl.admin; -import core = flyteidl.core; -import service = flyteidl.service; -import event = flyteidl.event; - -/** Message classes for built-in Protobuf types */ -import protobuf = google.protobuf; - -export { - admin as Admin, - core as Core, - service as Service, - protobuf as Protobuf, - event as Event, -}; diff --git a/packages/flyteidl-types/tsconfig.build.es.json b/packages/flyteidl-types/tsconfig.build.es.json deleted file mode 100644 index 7695e5785..000000000 --- a/packages/flyteidl-types/tsconfig.build.es.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - - "compilerOptions": { - "outDir": "./lib" - } -} diff --git a/packages/flyteidl-types/tsconfig.json b/packages/flyteidl-types/tsconfig.json deleted file mode 100644 index e1bebf4ee..000000000 --- a/packages/flyteidl-types/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "../../tsconfig.json", - - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist", - - "composite": true, - - "paths": {} - }, - - "include": ["src/**/*"], - - "references": [] -} diff --git a/packages/flyteidl-types/tsconfig.test.json b/packages/flyteidl-types/tsconfig.test.json deleted file mode 100644 index fc8520e73..000000000 --- a/packages/flyteidl-types/tsconfig.test.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.json" -} diff --git a/packages/locale/LICENSE b/packages/locale/LICENSE deleted file mode 100644 index bed437514..000000000 --- a/packages/locale/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Lyft, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/packages/locale/README.md b/packages/locale/README.md deleted file mode 100644 index 79638fe7f..000000000 --- a/packages/locale/README.md +++ /dev/null @@ -1,3 +0,0 @@ - - -# @flyteorg/locale · [![license](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/flyteorg/flyteconsole/blob/master/packages/locale/LICENSE) [![version](https://img.shields.io/npm/v/@flyteorg/locale?color=blue)](https://www.npmjs.com/package/@flyteorg/locale) [![bundle size](https://img.shields.io/bundlephobia/min/@flyteorg/locale)](https://www.npmjs.com/package/@flyteorg/locale) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/flyteorg/flyteconsole/blob/master/CONTRIBUTING.md) diff --git a/packages/locale/jest.config.js b/packages/locale/jest.config.js index 947402942..a7bde03d6 100644 --- a/packages/locale/jest.config.js +++ b/packages/locale/jest.config.js @@ -1,7 +1,6 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -const sharedConfig = require('../../script/test/jest.base.js'); +/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */ +const sharedConfig = require('../../scripts/jest.base.js'); module.exports = { ...sharedConfig, - setupFilesAfterEnv: ['/../../script/test/jest-setup.ts'], }; diff --git a/packages/locale/package.json b/packages/locale/package.json index 9caa8602b..510b7993a 100644 --- a/packages/locale/package.json +++ b/packages/locale/package.json @@ -1,47 +1,18 @@ { - "name": "@flyteorg/locale", - "version": "0.0.2", - "description": "Flyteconsole basics locale setup", + "name": "@clients/locale", + "version": "0.1.0", + "description": "This package will provide string file support for now and full localization in future", "main": "./dist/index.js", "module": "./lib/index.js", "types": "./lib/index.d.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "repository": { - "type": "git", - "url": "https://github.com/flyteorg/flyteconsole.git", - "directory": "packages/locale" - }, - "files": [ - "LICENSE", - "README.md", - "dist", - "lib", - "node_modules" - ], - "keywords": [ - "flyteorg", - "flyteconsole", - "react", - "locale" - ], - "installConfig": { - "hoistingLimits": "workspaces" - }, "scripts": { - "clean": "rm -rf dist && rm -rf lib && rm -rf node_modules && rm -rf tsconfig.build.tsbuildinfo", - "build": "yarn clean && yarn build:esm && yarn build:cjs", - "build:esm": "run -T tsc --module esnext --project ./tsconfig.build.es.json && yarn build:esm:alias", - "build:esm:alias": "run -T tsc-alias -p ./tsconfig.build.es.json", - "build:cjs": "run -T tsc --project ./tsconfig.build.json && run -T tsc-alias -p ./tsconfig.build.json", - "build:types": "run -T tsc --module esnext --project ./tsconfig.build.es.json --emitDeclarationOnly && run -T tsc-alias -p ./tsconfig.build.es.json", - "test": "NODE_ENV=test jest" + "build": "yarn build:esm && yarn build:cjs", + "build:esm": "run -T tsc --module esnext --outDir lib --project ./tsconfig.build.json", + "build:types": "yarn build:cjs --emitDeclarationOnly && yarn build:esm --emitDeclarationOnly", + "build:cjs": "run -T tsc --project ./tsconfig.build.json", + "test": "NODE_ENV=test run -T jest" }, - "devDependencies": { - "@types/jest": "^29.2.1", - "@types/mocha": "^10.0.0" + "peerDependencies": { + "tslib": "^2.4.1" } } diff --git a/packages/locale/tsconfig.build.es.json b/packages/locale/tsconfig.build.es.json deleted file mode 100644 index 7695e5785..000000000 --- a/packages/locale/tsconfig.build.es.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - - "compilerOptions": { - "outDir": "./lib" - } -} diff --git a/packages/locale/tsconfig.build.json b/packages/locale/tsconfig.build.json index 5e19e1b12..554208974 100644 --- a/packages/locale/tsconfig.build.json +++ b/packages/locale/tsconfig.build.json @@ -1,10 +1,20 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + + "composite": true + }, + "exclude": [ // files excluded from the build, we can not put it inro default tsconfig - // as it will interfere with VSCode IntelliSence + // as it will screw VSCode IntelliSence "node_modules", + "dist", + "lib", + "build", "**/test", "**/mocks", "**/__mocks__", diff --git a/packages/locale/tsconfig.json b/packages/locale/tsconfig.json index 8d7eef9b8..cbfffafe5 100644 --- a/packages/locale/tsconfig.json +++ b/packages/locale/tsconfig.json @@ -1,16 +1,5 @@ { "extends": "../../tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist", - - "composite": true, - - "paths": {} - }, - - "references": [], - "include": ["src/**/*"] } diff --git a/packages/locale/tsconfig.test.json b/packages/locale/tsconfig.test.json deleted file mode 100644 index fc8520e73..000000000 --- a/packages/locale/tsconfig.test.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.json" -} diff --git a/packages/oss-console/jest.config.ts b/packages/oss-console/jest.config.ts new file mode 100644 index 000000000..ddfba49e8 --- /dev/null +++ b/packages/oss-console/jest.config.ts @@ -0,0 +1,10 @@ +import { JestConfigWithTsJest } from 'ts-jest'; + +const sharedConfig = require('../../scripts/jest.base.js'); + +const jestConfig: JestConfigWithTsJest = { + ...sharedConfig, + setupFilesAfterEnv: [...sharedConfig.setupFilesAfterEnv, '/src/test/setupTests.ts'], +}; + +export default jestConfig; diff --git a/packages/oss-console/package.json b/packages/oss-console/package.json new file mode 100644 index 000000000..df8d6a6d7 --- /dev/null +++ b/packages/oss-console/package.json @@ -0,0 +1,120 @@ +{ + "name": "@clients/oss-console", + "version": "0.1.0", + "description": "This package will provide string file support for now and full localization in future", + "main": "./dist/index.js", + "module": "./lib/index.js", + "types": "./lib/index.d.ts", + "scripts": { + "clean": "rm -rf dist && rm -rf lib && rm -rf **.tsbuildinfo || true", + "build:esm:alias": "run -T tsc-alias --outDir lib -p ./tsconfig.build.json", + "build:esm": "run -T tsc --module esnext --outDir lib --project ./tsconfig.build.json", + "build:cjs:alias": "run -T tsc-alias -p ./tsconfig.build.json", + "build:cjs": "run -T tsc --project ./tsconfig.build.json", + "build": "yarn clean && yarn build:esm && yarn build:esm:alias && yarn build:cjs && yarn build:cjs:alias", + "build:types": "yarn clean && yarn build:cjs --emitDeclarationOnly && yarn build:cjs:alias && yarn build:esm --emitDeclarationOnly && yarn build:esm:alias", + "test": "NODE_ENV=test run -T jest" + }, + "peerDependencies": { + "@mui/icons-material": "^5.11.16", + "@mui/material": "^5.9.2", + "@mui/styles": "^5.9.2", + "@types/chart.js": "^2.9.37", + "@types/lodash": "^4.14.191", + "@types/long": "^3.0.32", + "@types/node": "^18.11.9", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.4", + "@types/react-router": "^5.1.19", + "@types/react-router-dom": "^5.3.3", + "chart.js": "3.8.0", + "chartjs-plugin-datalabels": "2.0.0", + "classnames": "^2.3.2", + "lodash": "^4.17.21", + "long": "^5.2.1", + "moment": "^2.29.4", + "protobufjs": "~6.11.4", + "react": "^18.1.0", + "react-chartjs-2": "^4.3.1", + "react-dom": "^18.1.0", + "react-query": "3.3.0", + "react-query-devtools": "3.0.0-beta.1", + "react-router": "5.3.4", + "react-router-dom": "5.3.4", + "tslib": "^2.4.1", + "use-react-router": "^1.0.7" + }, + "dependencies": { + "@clients/common": "^0.1.0", + "@clients/flyte-api": "^0.1.0", + "@clients/locale": "^0.1.0", + "@clients/primitives": "^0.1.0", + "@clients/theme": "^0.1.0", + "@clients/ui-atoms": "^0.1.0", + "@date-io/moment": "1.3.9", + "@emotion/css": "^11.11.2", + "@mui/lab": "^5.0.0-alpha.139", + "@mui/x-date-pickers": "^6.11.1", + "@rjsf/core": "^5.15.1", + "@rjsf/mui": "^5.15.1", + "@rjsf/utils": "^5.15.1", + "@rjsf/validator-ajv8": "^5.15.1", + "@tanstack/react-table": "^8.10.1", + "@tanstack/react-virtual": "^3.0.0-alpha.0", + "@types/d3-shape": "^1.2.6", + "@xstate/react": "^1.0.0", + "axios": "^0.27.2", + "copy-to-clipboard": "^3.0.8", + "cronstrue": "^1.31.0", + "d3-dag": "^0.3.4", + "d3-shape": "^1.2.2", + "dagre": "0.8.5", + "dagre-d3": "^0.6.4", + "debug": "2.6.9", + "dom-helpers": "5.2.1", + "fuzzysort": "^2.0.4", + "intersection-observer": "^0.7.0", + "js-yaml": "^3.13.1", + "linkify-it": "^2.2.0", + "lossless-json": "^1.0.3", + "memoize-one": "^5.0.0", + "moment-timezone": "^0.5.28", + "msw": "^1.3.2", + "notistack": "^3.0.1", + "object-hash": "^1.3.1", + "prop-types": "15.6.0", + "react-dropzone": "^14.2.3", + "react-flow-renderer": "10.3.17", + "react-ga4": "^1.4.1", + "react-helmet": "^6.1.0", + "react-intersection-observer": "^9.5.3", + "react-json-view": "^1.21.3", + "react-loading-skeleton": "3.4.0", + "react-syntax-highlighter": "^15.5.0", + "reactflow": "^11.10.2", + "shallowequal": "^1.1.0", + "traverse": "^0.6.7", + "url-search-params": "^0.10.0", + "whatwg-fetch": "^3.6.19", + "xstate": "4.33.6" + }, + "devDependencies": { + "@testing-library/dom": "^9.3.3", + "@testing-library/user-event": "^14.5.1", + "@types/debug": "^0.0.30", + "@types/dom-helpers": "^5.0.1", + "@types/jest": "^29.5.5", + "@types/js-yaml": "^3.10.1", + "@types/linkify-it": "^2.1.0", + "@types/long": "^3.0.32", + "@types/lossless-json": "^1.0.0", + "@types/memoize-one": "^4.1.0", + "@types/memory-fs": "^0.3.0", + "@types/moment-timezone": "^0.5.13", + "@types/object-hash": "^1.2.0", + "@types/pure-render-decorator": "^0.2.27", + "@types/react-syntax-highlighter": "^15.5.11", + "@types/serve-static": "^1.7.31", + "@types/shallowequal": "^0.2.3" + } +} diff --git a/packages/oss-console/src/App/ApplicationRouter.tsx b/packages/oss-console/src/App/ApplicationRouter.tsx new file mode 100644 index 000000000..0ae0fd3de --- /dev/null +++ b/packages/oss-console/src/App/ApplicationRouter.tsx @@ -0,0 +1,112 @@ +import React, { Suspense, lazy, useEffect } from 'react'; +import { Redirect, Route, Switch, useLocation } from 'react-router-dom'; +import { makeRoute } from '@clients/common/routes'; +import { PageMeta } from '@clients/primitives/PageMeta'; +import { useUserIdentity } from '@clients/primitives/hooks/IdentityProvider/useUserIdentity'; +import { history } from '../routes/history'; +import { + getLocalStore, + LocalStorageProjectDomain, + LOCAL_PROJECT_DOMAIN, +} from '../components/common/LocalStoreDefaults'; +import { PrettyError } from '../components/Errors/PrettyError'; +import { useDomainPathUpgrade } from '../routes/useDomainPathUpgrade'; +import { Routes } from '../routes/routes'; +import AnimateRoute from '../routes/AnimateRoute'; + +const SelectProject = lazy( + () => import(/* webpackChunkName: "SelectProject" */ '../components/SelectProject'), +); +const ListProjectEntities = lazy( + () => import(/* webpackChunkName: "ListProjectEntities" */ '../components/ListProjectEntities'), +); + +const ExecutionDetails = lazy( + () => + import(/* webpackChunkName: "ExecutionDetails" */ '../components/Executions/ExecutionDetails'), +); + +const TaskDetails = lazy(() => import(/* webpackChunkName: "TaskDetails" */ '../components/Task')); +const WorkflowDetails = lazy( + () => import(/* webpackChunkName: "WorkflowDetails" */ '../components/Workflow/WorkflowDetails'), +); +const LaunchPlanDetails = lazy( + () => + import( + /* webpackChunkName: "LaunchPlanDetails" */ '../components/LaunchPlan/LaunchPlanDetails' + ), +); +const EntityVersionsDetailsContainer = lazy( + () => + import( + /* webpackChunkName: "EntityVersionsDetailsContainer" */ '../components/Entities/VersionDetails/EntityVersionDetailsContainer' + ), +); + +export const ApplicationRouter: React.FC = () => { + const localProjectDomain = getLocalStore(LOCAL_PROJECT_DOMAIN) as LocalStorageProjectDomain; + const { search, pathname } = useLocation(); + + useDomainPathUpgrade(localProjectDomain, pathname, search, history); + + const id = useUserIdentity(); + // @ts-ignore + const orgId = id?.profile?.data?.additional_claims?.userhandle ?? ''; + + // Temp ORG ID auth redirect fix + // Shouldn't be invoved if working correctly + useEffect(() => { + const orgRegex = /^\/org\/:orgid/i; + const brokenRedirect = orgRegex.test(pathname); + if (brokenRedirect && !!orgId) { + history.push(pathname.replace(orgRegex, `/org/${orgId}`)); + } + }, [orgId, pathname]); + + return ( + <> + + + + + + + + + + + { + /** + * If LocalStoreDefaults exists, we direct them to the project detail view + * for those values. + * + * TODO: the Routes.SelectProject.id check should be removed once we phase out the + * local storage bug that leads to 404 + */ + if (localProjectDomain && localProjectDomain.project !== Routes.SelectProject.id) { + return ( + + ); + } + + return ; + }} + /> + + + + + + ); +}; + +export default ApplicationRouter; diff --git a/packages/oss-console/src/App/index.tsx b/packages/oss-console/src/App/index.tsx new file mode 100644 index 000000000..b8b4fbee5 --- /dev/null +++ b/packages/oss-console/src/App/index.tsx @@ -0,0 +1,94 @@ +import '../common/setupProtobuf'; +import React, { PropsWithChildren } from 'react'; +import Collapse from '@mui/material/Collapse'; +import { FlyteApiProvider } from '@clients/flyte-api/ApiProvider'; +import { SnackbarProvider } from 'notistack'; +import { env } from '@clients/common/environment'; +import { SkeletonTheme } from 'react-loading-skeleton'; +import { + QueryClientProvider as QueryClientProviderImport, + QueryClientProviderProps, +} from 'react-query'; +import { ReactQueryDevtools } from 'react-query-devtools'; +import { Router } from 'react-router-dom'; +import * as CommonStylesConstants from '@clients/theme/CommonStyles/constants'; +import { FeatureFlagsProvider } from '../basics/FeatureFlags'; +import { debug, debugPrefix } from '../common/log'; +import { APIContext, useAPIState } from '../components/data/apiContext'; +import { QueryAuthorizationObserver } from '../components/data/QueryAuthorizationObserver'; +import { createQueryClient } from '../components/data/queryCache'; +import { SystemStatusBanner } from '../components/Notifications/SystemStatusBanner'; +import { history } from '../routes/history'; +import { LocalCacheProvider } from '../basics/LocalCache/ContextProvider'; +import GlobalStyles from '../components/utils/GlobalStyles'; +import { ColumnStyles, ExecutionTableStyles } from '../components/Executions/Tables/styles'; +import { WorkflowExecutionsColumnsStyles } from '../components/Executions/Tables/WorkflowExecutionTable/styles'; +import { LiteralStyles } from '../components/Literals/styles'; +import { LaunchFormStyles } from '../components/Launch/LaunchForm/styles'; +import TopLevelLayout from '../components/common/TopLevelLayout/TopLevelLayout'; +import TopLevelLayoutProvider from '../components/common/TopLevelLayout/TopLevelLayoutState'; +import ApplicationRouter from './ApplicationRouter'; +import { ErrorBoundary } from '../components/common/ErrorBoundary'; +import DownForMaintenance from '../components/Errors/DownForMaintenance'; + +const QueryClientProvider: React.FC> = + QueryClientProviderImport; + +const queryClient = createQueryClient(); + +export const AppComponent: React.FC = () => { + if (env.NODE_ENV === 'development') { + debug.enable(`${debugPrefix}*:*`); + } + const apiState = useAPIState(); + + const isSiteDown = !!env.MAINTENANCE_MODE?.length; + if (isSiteDown) return ; + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default AppComponent; diff --git a/packages/console/src/basics/FeatureFlags/FEATURE_FLAGS.md b/packages/oss-console/src/basics/FeatureFlags/FEATURE_FLAGS.md similarity index 87% rename from packages/console/src/basics/FeatureFlags/FEATURE_FLAGS.md rename to packages/oss-console/src/basics/FeatureFlags/FEATURE_FLAGS.md index 2599f9eaa..b66aab74e 100644 --- a/packages/console/src/basics/FeatureFlags/FEATURE_FLAGS.md +++ b/packages/oss-console/src/basics/FeatureFlags/FEATURE_FLAGS.md @@ -44,15 +44,15 @@ export function MyComponent(props: Props): React.ReactNode { During your local development you can either: -- temporarily switch flags value in runtimeConfig as: - ```javascript - let runtimeConfig = { - ...defaultFlagConfig, - 'add-new-page': true, - }; - ``` -- turn flag on/off from the devTools console in Chrome - ![SetFeatureFlagFromConsole](https://user-images.githubusercontent.com/55718143/150002962-f12bbe57-f221-4bbd-85e3-717aa0221e89.gif) +- temporarily switch flags value in runtimeConfig as: + ```javascript + let runtimeConfig = { + ...defaultFlagConfig, + 'add-new-page': true, + }; + ``` +- turn flag on/off from the devTools console in Chrome + ![SetFeatureFlagFromConsole](https://user-images.githubusercontent.com/55718143/150002962-f12bbe57-f221-4bbd-85e3-717aa0221e89.gif) #### Unit tests diff --git a/packages/oss-console/src/basics/FeatureFlags/FeatureFlags.test.tsx b/packages/oss-console/src/basics/FeatureFlags/FeatureFlags.test.tsx new file mode 100644 index 000000000..f3a16aac2 --- /dev/null +++ b/packages/oss-console/src/basics/FeatureFlags/FeatureFlags.test.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { render, screen, waitFor, act } from '@testing-library/react'; +import { FeatureFlagsProvider, useFeatureFlag } from '.'; +import { FeatureFlag } from './defaultConfig'; + +function TestContent() { + const enabledTestFlag = useFeatureFlag(FeatureFlag.TestFlagUndefined); + return ( + + + + ); +} + +function TestPage() { + return ( + + + + ); +} + +declare global { + interface Window { + setFeatureFlag: (flag: FeatureFlag, newValue: boolean) => void; + getFeatureFlag: (flag: FeatureFlag) => boolean; + clearRuntimeConfig: () => void; + } +} + +describe('FeatureFlags', () => { + beforeEach(() => { + render(); + }); + + afterEach(() => { + window.clearRuntimeConfig(); + }); + + it('Feature flags can be read/set from dev tools', async () => { + // flag defined and return proper value + expect(window.getFeatureFlag(FeatureFlag.TestFlagTrue)).toBeTruthy(); + // flag undefined and returns false + expect(window.getFeatureFlag(FeatureFlag.TestFlagUndefined)).toBeFalsy(); + + await act(() => window.setFeatureFlag(FeatureFlag.TestFlagUndefined, true)); + await waitFor(() => { + // check that flag cghanged value + expect(window.getFeatureFlag(FeatureFlag.TestFlagUndefined)).toBeTruthy(); + }); + }); + + it('useFeatureFlags returns proper live value', async () => { + // default value - flag is disabled + expect(screen.getByText(/Disabled/i)).toBeTruthy(); + + // Enable flag + await act(() => window.setFeatureFlag(FeatureFlag.TestFlagUndefined, true)); + await waitFor(() => { + // check that component was updated accordingly + expect(screen.getByText(/Enabled/i)).toBeTruthy(); + }); + }); +}); diff --git a/packages/console/src/basics/FeatureFlags/FeatureFlags.tsx b/packages/oss-console/src/basics/FeatureFlags/FeatureFlags.tsx similarity index 87% rename from packages/console/src/basics/FeatureFlags/FeatureFlags.tsx rename to packages/oss-console/src/basics/FeatureFlags/FeatureFlags.tsx index 5cd2d925a..14f4b3daa 100644 --- a/packages/console/src/basics/FeatureFlags/FeatureFlags.tsx +++ b/packages/oss-console/src/basics/FeatureFlags/FeatureFlags.tsx @@ -1,20 +1,8 @@ -/** - * Feature Flag provider - allows a multi-stage development. - */ +/* eslint-disable dot-notation */ import * as React from 'react'; -import { - createContext, - useCallback, - useContext, - useEffect, - useState, -} from 'react'; -import { isDevEnv, isTestEnv } from '@flyteorg/common'; -import { - defaultFlagConfig, - FeatureFlag, - FeatureFlagConfig, -} from './defaultConfig'; +import { createContext, useCallback, useContext, useEffect, useState } from 'react'; +import { isDevEnv, isTestEnv } from '@clients/common/environment'; +import { defaultFlagConfig, FeatureFlag, FeatureFlagConfig } from './defaultConfig'; export { FeatureFlag } from './defaultConfig'; @@ -26,6 +14,8 @@ export { FeatureFlag } from './defaultConfig'; const getSearchParamFlags = (search: string): FeatureFlagConfig => { const urlParams = new URLSearchParams(search); const flags: FeatureFlagConfig = {}; + + // eslint-disable-next-line no-restricted-syntax for (const [key, value] of urlParams.entries()) { if (value === 'true') { flags[key] = true; @@ -92,6 +82,7 @@ export const FeatureFlagsProvider = (props: FeatureFlagProviderProps) => { const getFeatureFlag = useCallback( (flag: FeatureFlag) => { if (isDevEnv() && flags[flag] === undefined) { + // eslint-disable-next-line no-throw-literal throw `Default config value is absent for ${flag}`; } return flags[flag] ?? false; @@ -116,9 +107,7 @@ export const FeatureFlagsProvider = (props: FeatureFlagProviderProps) => { }, [setFeatureFlag, getFeatureFlag, clearRuntimeConfig]); return ( - + {props.children} ); diff --git a/packages/oss-console/src/basics/FeatureFlags/defaultConfig.ts b/packages/oss-console/src/basics/FeatureFlags/defaultConfig.ts new file mode 100644 index 000000000..06a440fcb --- /dev/null +++ b/packages/oss-console/src/basics/FeatureFlags/defaultConfig.ts @@ -0,0 +1,32 @@ +/** + * Default Feature Flag config - used for features in developement. + */ + +export enum FeatureFlag { + // Test flag is created only for unit-tests + TestFlagUndefined = 'test-flag-undefined', + TestFlagTrue = 'test-flag-true', + + // Production flags + LaunchPlan = 'launch-plan', + + // Test Only Mine flag + OnlyMine = 'only-mine', +} + +export type FeatureFlagConfig = { [k: string]: boolean }; + +export const defaultFlagConfig: FeatureFlagConfig = { + // Test + 'test-flag-true': true, + + // Production - new code should be turned off by default + // If you need to turn it on locally -> update runtimeConfig in ./index.tsx file + 'launch-plan': false, + + 'horizontal-layout': false, + + breadcrumbs: false, + + 'only-mine': false, +}; diff --git a/packages/oss-console/src/basics/FeatureFlags/index.tsx b/packages/oss-console/src/basics/FeatureFlags/index.tsx new file mode 100644 index 000000000..29d09c0ef --- /dev/null +++ b/packages/oss-console/src/basics/FeatureFlags/index.tsx @@ -0,0 +1,2 @@ +export { FeatureFlag } from './defaultConfig'; +export { useFeatureFlag, useFeatureFlagContext, FeatureFlagsProvider } from './FeatureFlags'; diff --git a/packages/console/src/basics/LocalCache/ContextProvider.tsx b/packages/oss-console/src/basics/LocalCache/ContextProvider.tsx similarity index 85% rename from packages/console/src/basics/LocalCache/ContextProvider.tsx rename to packages/oss-console/src/basics/LocalCache/ContextProvider.tsx index 6a570cf8a..eaaea46bf 100644 --- a/packages/console/src/basics/LocalCache/ContextProvider.tsx +++ b/packages/oss-console/src/basics/LocalCache/ContextProvider.tsx @@ -1,7 +1,7 @@ // More info on Local storage: https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage -import { log } from 'common/log'; import * as React from 'react'; import { useState, createContext, useCallback } from 'react'; +import { log } from '../../common/log'; import { defaultLocalCacheConfig, LocalCacheItem } from './defaultConfig'; export { LocalCacheItem } from './defaultConfig'; @@ -41,12 +41,9 @@ export const LocalCacheContext = createContext({ export const LocalCacheProvider = (props: LocalCacheProviderProps) => { const [localCacheMap, setLocalCacheMap] = useState({ ...allStorage() }); - const setLocalCache = useCallback( - (localCacheItem: LocalCacheItem, newValue: any) => { - setLocalCacheMap(prev => ({ ...prev, [localCacheItem]: newValue })); - }, - [], - ); + const setLocalCache = useCallback((localCacheItem: LocalCacheItem, newValue: any) => { + setLocalCacheMap((prev) => ({ ...prev, [localCacheItem]: newValue })); + }, []); const getLocalCache = useCallback( (localCacheItem: LocalCacheItem) => { @@ -63,9 +60,7 @@ export const LocalCacheProvider = (props: LocalCacheProviderProps) => { ); return ( - + {props.children} ); diff --git a/packages/console/src/basics/LocalCache/defaultConfig.ts b/packages/oss-console/src/basics/LocalCache/defaultConfig.ts similarity index 89% rename from packages/console/src/basics/LocalCache/defaultConfig.ts rename to packages/oss-console/src/basics/LocalCache/defaultConfig.ts index f49569183..56a63785b 100644 --- a/packages/console/src/basics/LocalCache/defaultConfig.ts +++ b/packages/oss-console/src/basics/LocalCache/defaultConfig.ts @@ -8,7 +8,7 @@ export enum LocalCacheItem { // Production flags ShowWorkflowVersions = 'flyte.show-workflow-versions', - ShowDomainSettings = 'flyte.show-domain-settings', + ShowLaunchplanSchedules = 'flyte.show-launchplan-schedules', // Test Only Mine OnlyMineToggle = 'flyte.only-mine-toggle', @@ -28,7 +28,7 @@ export const defaultLocalCacheConfig: LocalCacheConfig = { // Production 'flyte.show-workflow-versions': 'true', - 'flyte.show-domain-settings': 'true', + 'flyte.show-launchplan-schedules': 'true', // Test Only Mine 'flyte.only-mine-toggle': 'true', diff --git a/packages/console/src/basics/LocalCache/index.tsx b/packages/oss-console/src/basics/LocalCache/index.tsx similarity index 89% rename from packages/console/src/basics/LocalCache/index.tsx rename to packages/oss-console/src/basics/LocalCache/index.tsx index f0bd91166..c60f1b5f9 100644 --- a/packages/console/src/basics/LocalCache/index.tsx +++ b/packages/oss-console/src/basics/LocalCache/index.tsx @@ -1,6 +1,6 @@ // More info on Local storage: https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage -import { log } from 'common/log'; import { useContext } from 'react'; +import { log } from '../../common/log'; import { defaultLocalCacheConfig, LocalCacheItem } from './defaultConfig'; import { LocalCacheContext } from './ContextProvider'; @@ -32,10 +32,7 @@ export function useLocalCache(setting: LocalCacheItem) { }; const clearState = () => { - localCache.setLocalCache( - setting, - JSON.parse(defaultLocalCacheConfig[setting]), - ); + localCache.setLocalCache(setting, JSON.parse(defaultLocalCacheConfig[setting])); localStorage.removeItem(setting); }; diff --git a/packages/console/src/basics/LocalCache/localCache.test.tsx b/packages/oss-console/src/basics/LocalCache/localCache.test.tsx similarity index 84% rename from packages/console/src/basics/LocalCache/localCache.test.tsx rename to packages/oss-console/src/basics/LocalCache/localCache.test.tsx index 9dfe50098..eb6b97b25 100644 --- a/packages/console/src/basics/LocalCache/localCache.test.tsx +++ b/packages/oss-console/src/basics/LocalCache/localCache.test.tsx @@ -1,26 +1,14 @@ +/* eslint-disable jsx-a11y/control-has-associated-label */ import * as React from 'react'; -import { - render, - screen, - act, - fireEvent, - getByTestId, -} from '@testing-library/react'; -import { - ClearLocalCache, - LocalCacheItem, - useLocalCache, - onlyForTesting, -} from '.'; +import { render, screen, act, fireEvent, getByTestId } from '@testing-library/react'; +import { ClearLocalCache, LocalCacheItem, useLocalCache, onlyForTesting } from '.'; import { LocalCacheProvider } from './ContextProvider'; const SHOW_TEXT = 'SHOWED'; const HIDDEN_TEXT = 'HIDDEN'; const TestFrame = () => { - const [show, setShow, clearShow] = useLocalCache( - LocalCacheItem.TestSettingBool, - ); + const [show, setShow, clearShow] = useLocalCache(LocalCacheItem.TestSettingBool); const toShow = () => setShow(true); const toClear = () => clearShow(); diff --git a/packages/console/src/basics/LocalCache/onlyMineDefaultConfig.ts b/packages/oss-console/src/basics/LocalCache/onlyMineDefaultConfig.ts similarity index 93% rename from packages/console/src/basics/LocalCache/onlyMineDefaultConfig.ts rename to packages/oss-console/src/basics/LocalCache/onlyMineDefaultConfig.ts index 6aceacb89..1b28f8ef9 100644 --- a/packages/console/src/basics/LocalCache/onlyMineDefaultConfig.ts +++ b/packages/oss-console/src/basics/LocalCache/onlyMineDefaultConfig.ts @@ -42,5 +42,5 @@ export const filterByDefault = [ export const defaultSelectedValues = Object.assign( {}, - ...filterByDefault.map(x => ({ [x.value]: x.data })), + ...filterByDefault.map((x) => ({ [x.value]: x.data })), ); diff --git a/packages/console/src/common/formatters.test.ts b/packages/oss-console/src/common/formatters.test.ts similarity index 90% rename from packages/console/src/common/formatters.test.ts rename to packages/oss-console/src/common/formatters.test.ts index 8d428e060..5e42f275e 100644 --- a/packages/console/src/common/formatters.test.ts +++ b/packages/oss-console/src/common/formatters.test.ts @@ -1,5 +1,5 @@ -import { millisecondsToHMS } from 'common/formatters'; -import { unknownValueString, zeroSecondsString } from './constants'; +import { unknownValueString, zeroSecondsString } from '@clients/common/constants'; +import { millisecondsToHMS } from './formatters'; describe('millisecondsToHMS', () => { it('should display unknown if the value is negative', () => { diff --git a/packages/console/src/common/formatters.ts b/packages/oss-console/src/common/formatters.ts similarity index 85% rename from packages/console/src/common/formatters.ts rename to packages/oss-console/src/common/formatters.ts index 7eed4aab8..ac8957535 100644 --- a/packages/console/src/common/formatters.ts +++ b/packages/oss-console/src/common/formatters.ts @@ -1,10 +1,13 @@ import cronstrue from 'cronstrue'; -import { Admin, Protobuf } from '@flyteorg/flyteidl-types'; +import Admin from '@clients/common/flyteidl/admin'; +import Protobuf from '@clients/common/flyteidl/protobuf'; import moment from 'moment-timezone'; -import { unknownValueString, zeroSecondsString } from './constants'; +import { unknownValueString, zeroSecondsString } from '@clients/common/constants'; import { timezone } from './timezone'; import { durationToMilliseconds, isValidDate } from './utils'; +const defaultUTCFormat = 'l LTS'; + /** Formats a date into a standard string with a moment-style "from now" hint * ex. 12/21/2017 8:19:36 PM (18 days ago) */ @@ -14,7 +17,7 @@ export function dateWithFromNow(input: Date) { } const date = moment.utc(input); - return `${date.format('l LTS')} UTC (${date.fromNow()})`; + return `${date.format(defaultUTCFormat)} UTC (${date.fromNow()})`; } /** Formats a date into a moment-style "from now" value */ @@ -30,28 +33,43 @@ export function dateFromNow(input: Date) { /** Formats a date into a standard format used throughout the UI * ex 12/21/2017 8:19:36 PM */ -export function formatDate(input: Date) { +export function formatDate(input: Date, formatString?: string) { return isValidDate(input) - ? moment(input).format('l LTS') + ? moment(input).format(formatString || defaultUTCFormat) : unknownValueString; } /** Formats a date into a standard UTC format used throughout the UI * ex 12/21/2017 8:19:36 PM UTC */ -export function formatDateUTC(input: Date) { +export function formatDateUTC(input: Date, formatString?: string) { return isValidDate(input) - ? `${moment.utc(input).format('l LTS')} UTC` + ? `${moment.utc(input).format(formatString || defaultUTCFormat)} UTC` : unknownValueString; } +/** + * Gets human-readable date relative to "now" + */ +export function formateDateRelative(input: Date, threshold = 24 * 60 * 60 * 1000) { + if (!isValidDate(input)) { + return unknownValueString; + } + + const diff = moment.utc().diff(moment.utc(input)); + + if (diff <= threshold) { + return moment.utc(input).fromNow(); + } + + return formatDate(input, 'MM/DD/YY HH:MM A'); +} + /** Formats a date into a standard local format used throughout the UI * ex 12/21/2017 8:19:36 PM PDT */ export function formatDateLocalTimezone(input: Date) { - return isValidDate(input) - ? moment(input).tz(timezone).format('l LTS z') - : unknownValueString; + return isValidDate(input) ? moment(input).tz(timezone).format('l LTS z') : unknownValueString; } /** Outputs a value in milliseconds in (H M S) format (ex. 2h 3m 30s) */ @@ -189,17 +207,10 @@ export function getScheduleFrequencyString(schedule?: Admin.ISchedule) { if (schedule == null) { return ''; } - if (schedule.cronExpression) { - // Need to add a leading 0 to get a valid CRON expression, because - // ISchedule is using AWS-style expressions, which don't allow a `seconds` position - return cronstrue.toString(`0 ${schedule.cronExpression}`, { - dayOfWeekStartIndexZero: false, - }); - } if (schedule.rate) { return fixedRateToString(schedule.rate); } - if (schedule.cronSchedule && schedule.cronSchedule.schedule) { + if (schedule.cronSchedule?.schedule) { return ( getScheduleFrequencyStringFromAlias(schedule.cronSchedule.schedule) || cronstrue.toString(schedule.cronSchedule.schedule) diff --git a/packages/console/src/common/layout.ts b/packages/oss-console/src/common/layout.ts similarity index 85% rename from packages/console/src/common/layout.ts rename to packages/oss-console/src/common/layout.ts index 7ea7f131b..684d52ee4 100644 --- a/packages/console/src/common/layout.ts +++ b/packages/oss-console/src/common/layout.ts @@ -2,5 +2,4 @@ // for use with `theme.spacing()` export const sideNavGridWidth = 34; export const maxContainerGridWidth = 153; -export const navbarGridHeight = 8; export const contentMarginGridUnits = 2; diff --git a/packages/console/src/common/linkify.ts b/packages/oss-console/src/common/linkify.ts similarity index 97% rename from packages/console/src/common/linkify.ts rename to packages/oss-console/src/common/linkify.ts index fbe9509a6..375095ea6 100644 --- a/packages/console/src/common/linkify.ts +++ b/packages/oss-console/src/common/linkify.ts @@ -21,7 +21,7 @@ export function getLinkifiedTextChunks(text: string): LinkifiedTextChunk[] { const chunks: LinkifiedTextChunk[] = []; let lastMatchEndIndex = 0; - matches.forEach(match => { + matches.forEach((match) => { if (lastMatchEndIndex !== match.index) { chunks.push({ text: text.substring(lastMatchEndIndex, match.index), diff --git a/packages/console/src/common/log.ts b/packages/oss-console/src/common/log.ts similarity index 63% rename from packages/console/src/common/log.ts rename to packages/oss-console/src/common/log.ts index e7bab82fc..edecc24d1 100644 --- a/packages/console/src/common/log.ts +++ b/packages/oss-console/src/common/log.ts @@ -4,6 +4,5 @@ import debug from 'debug'; export const log = window.console; export const debugPrefix = 'flyte'; -export const createDebugLogger = (namespace: string) => - debug(`${debugPrefix}:${namespace}`); +export const createDebugLogger = (namespace: string) => debug(`${debugPrefix}:${namespace}`); export { debug }; diff --git a/packages/oss-console/src/common/promiseUtils.ts b/packages/oss-console/src/common/promiseUtils.ts new file mode 100644 index 000000000..66aeb8313 --- /dev/null +++ b/packages/oss-console/src/common/promiseUtils.ts @@ -0,0 +1,5 @@ +export function resolveAfter(waitMs: number, value: T): Promise { + return new Promise((resolve) => { + setTimeout(() => resolve(value), waitMs); + }); +} diff --git a/packages/console/src/common/setupProtobuf.ts b/packages/oss-console/src/common/setupProtobuf.ts similarity index 100% rename from packages/console/src/common/setupProtobuf.ts rename to packages/oss-console/src/common/setupProtobuf.ts diff --git a/packages/oss-console/src/common/stringifyIsEqual.ts b/packages/oss-console/src/common/stringifyIsEqual.ts new file mode 100644 index 000000000..1ffb3fe61 --- /dev/null +++ b/packages/oss-console/src/common/stringifyIsEqual.ts @@ -0,0 +1,15 @@ +export const mapStringifyReplacer = (key: string, value: any) => { + if (value instanceof Map) { + return { + dataType: 'Map', + value: Array.from(value.entries()), // or with spread: value: [...value] + }; + } + return value; +}; + +export const stringifyIsEqual = (a: any, b: any) => { + const aValue = JSON.stringify(a, mapStringifyReplacer); + const bValue = JSON.stringify(b, mapStringifyReplacer); + return aValue === bValue; +}; diff --git a/packages/console/src/common/test/formatters.spec.ts b/packages/oss-console/src/common/test/formatters.spec.ts similarity index 90% rename from packages/console/src/common/test/formatters.spec.ts rename to packages/oss-console/src/common/test/formatters.spec.ts index 488dd4970..f977dba86 100644 --- a/packages/console/src/common/test/formatters.spec.ts +++ b/packages/oss-console/src/common/test/formatters.spec.ts @@ -1,7 +1,7 @@ -import { millisecondsToDuration } from 'common/utils'; -import { Admin } from '@flyteorg/flyteidl-types'; +import Admin from '@clients/common/flyteidl/admin'; import moment from 'moment-timezone'; -import { unknownValueString, zeroSecondsString } from '../constants'; +import { unknownValueString, zeroSecondsString } from '@clients/common/constants'; +import { millisecondsToDuration } from '../utils'; import { dateDiffString, dateFromNow, @@ -24,15 +24,14 @@ jest.mock('../timezone.ts', () => ({ const invalidDates = ['abc', -200, 0]; // Matches strings in the form 01/01/2000 01:01:00 PM (5 minutes ago) -const dateWithAgoRegex = - /^[\w/:\s]+ (AM|PM)\s+UTC\s+\([a\d] (minute|hour|day|second)s? ago\)$/; +const dateWithAgoRegex = /^[\w/:\s]+ (AM|PM)\s+UTC\s+\([a\d] (minute|hour|day|second)s? ago\)$/; const dateFromNowRegex = /^[a\d] (minute|hour|day|second)s? ago$/; const dateRegex = /^[\w/:\s]+ (AM|PM)/; const utcDateRegex = /^[\w/:\s]+ (AM|PM) UTC/; const localDateRegex = /^[\w/:\s]+ (AM|PM) (PDT|PST)/; describe('dateWithFromNow', () => { - invalidDates.forEach(v => + invalidDates.forEach((v) => it(`returns a constant string for invalid date: ${v}`, () => { expect(dateWithFromNow(new Date(v))).toEqual(unknownValueString); }), @@ -41,14 +40,12 @@ describe('dateWithFromNow', () => { // Not testing this extensively because it's relying on moment, which is well-tested it('Returns a reasonable date string with (ago) text for valid inputs', () => { const date = new Date(); - expect(dateWithFromNow(new Date(date.getTime() - 65000))).toMatch( - dateWithAgoRegex, - ); + expect(dateWithFromNow(new Date(date.getTime() - 65000))).toMatch(dateWithAgoRegex); }); }); describe('dateFromNow', () => { - invalidDates.forEach(v => + invalidDates.forEach((v) => it(`returns a constant string for invalid date: ${v}`, () => { expect(dateFromNow(new Date(v))).toEqual(unknownValueString); }), @@ -57,14 +54,12 @@ describe('dateFromNow', () => { // Not testing this extensively because it's relying on moment, which is well-tested it('Returns a reasonable string for valid inputs', () => { const date = new Date(); - expect(dateFromNow(new Date(date.getTime() - 125000))).toMatch( - dateFromNowRegex, - ); + expect(dateFromNow(new Date(date.getTime() - 125000))).toMatch(dateFromNowRegex); }); }); describe('formatDate', () => { - invalidDates.forEach(v => + invalidDates.forEach((v) => it(`returns a constant string for invalid date: ${v}`, () => { expect(formatDate(new Date(v))).toEqual(unknownValueString); }), @@ -76,7 +71,7 @@ describe('formatDate', () => { }); describe('formatDateUTC', () => { - invalidDates.forEach(v => + invalidDates.forEach((v) => it(`returns a constant string for invalid date: ${v}`, () => { expect(formatDateUTC(new Date(v))).toEqual(unknownValueString); }), @@ -88,7 +83,7 @@ describe('formatDateUTC', () => { }); describe('formatDateLocalTimezone', () => { - invalidDates.forEach(v => + invalidDates.forEach((v) => it(`returns a constant string for invalid date: ${v}`, () => { expect(formatDateLocalTimezone(new Date(v))).toEqual(unknownValueString); }), @@ -117,19 +112,15 @@ const millisecondToHMSTestCases: [number, string][] = [ ]; describe('dateDiffString', () => { - invalidDates.forEach(v => + invalidDates.forEach((v) => it(`returns a constant string for invalid date on left side: ${v}`, () => { - expect(dateDiffString(new Date(v), new Date())).toEqual( - unknownValueString, - ); + expect(dateDiffString(new Date(v), new Date())).toEqual(unknownValueString); }), ); - invalidDates.forEach(v => + invalidDates.forEach((v) => it(`returns a constant string for invalid date on right side: ${v}`, () => { - expect(dateDiffString(new Date(), new Date(v))).toEqual( - unknownValueString, - ); + expect(dateDiffString(new Date(), new Date(v))).toEqual(unknownValueString); }), ); @@ -193,10 +184,7 @@ describe('getScheduleFrequencyString', () => { const cases: [Admin.ISchedule, string][] = [ [{ cronExpression: '* * * * *' }, 'Every minute'], [{ cronExpression: '0 20 ? * 3 *' }, 'At 08:00 PM, only on Tuesday'], - [ - { rate: { value: 1, unit: Admin.FixedRateUnit.MINUTE } }, - 'Every 1 minutes', - ], + [{ rate: { value: 1, unit: Admin.FixedRateUnit.MINUTE } }, 'Every 1 minutes'], [{ cronSchedule: { schedule: '* * * * *' } }, 'Every minute'], [{ cronSchedule: { schedule: '@hourly' } }, 'Every hour'], [{ cronSchedule: { schedule: 'hourly' } }, 'Every hour'], diff --git a/packages/console/src/common/test/linkify.test.ts b/packages/oss-console/src/common/test/linkify.test.ts similarity index 79% rename from packages/console/src/common/test/linkify.test.ts rename to packages/oss-console/src/common/test/linkify.test.ts index 4607d8360..57178992f 100644 --- a/packages/console/src/common/test/linkify.test.ts +++ b/packages/oss-console/src/common/test/linkify.test.ts @@ -1,4 +1,4 @@ -import { getLinkifiedTextChunks, LinkifiedTextChunk } from 'common/linkify'; +import { getLinkifiedTextChunks, LinkifiedTextChunk } from '../linkify'; function text(text: string): LinkifiedTextChunk { return { text, type: 'text' }; @@ -11,21 +11,14 @@ function link(text: string): LinkifiedTextChunk { describe('linkify/getLinkifiedTextChunks', () => { const testCases: [string, LinkifiedTextChunk[]][] = [ ['No match expected', [text('No match expected')]], - [ - 'Points to http://example.com', - [text('Points to '), link('http://example.com')], - ], + ['Points to http://example.com', [text('Points to '), link('http://example.com')]], [ 'https://example.com link is at beginning', [link('https://example.com'), text(' link is at beginning')], ], [ 'A link to http://example.com is in the middle', - [ - text('A link to '), - link('http://example.com'), - text(' is in the middle'), - ], + [text('A link to '), link('http://example.com'), text(' is in the middle')], ], [ 'A link at the end to http://example.com', diff --git a/packages/console/src/common/test/utils.spec.ts b/packages/oss-console/src/common/test/utils.spec.ts similarity index 93% rename from packages/console/src/common/test/utils.spec.ts rename to packages/oss-console/src/common/test/utils.spec.ts index 797217041..98872e078 100644 --- a/packages/console/src/common/test/utils.spec.ts +++ b/packages/oss-console/src/common/test/utils.spec.ts @@ -1,5 +1,5 @@ -import { long, obj } from 'test/utils'; -import { Protobuf } from '@flyteorg/flyteidl-types'; +import Protobuf from '@clients/common/flyteidl/protobuf'; +import { long, obj } from '../../test/utils'; import { compareTimestampsAscending, createLocalURL, @@ -11,8 +11,8 @@ import { timestampToDate, } from '../utils'; -jest.mock('@flyteorg/common', () => ({ - env: jest.requireActual('@flyteorg/common').env, +jest.mock('@clients/common', () => ({ + env: jest.requireActual('@clients/common').env, })); describe('isValidDate', () => { @@ -26,8 +26,7 @@ describe('isValidDate', () => { ]; cases.forEach(([value, expected]) => - it(`should return ${expected} for ${value}`, () => - expect(isValidDate(value)).toBe(expected)), + it(`should return ${expected} for ${value}`, () => expect(isValidDate(value)).toBe(expected)), ); }); @@ -93,9 +92,7 @@ describe('compareTimestampsAscending', () => { ]; cases.forEach(([left, right, expected]) => - it(`should return ${expected} when comparing ${obj(left)}, to ${obj( - right, - )}`, () => + it(`should return ${expected} when comparing ${obj(left)}, to ${obj(right)}`, () => expect(compareTimestampsAscending(left, right)).toEqual(expected)), ); }); diff --git a/packages/console/src/common/timezone.ts b/packages/oss-console/src/common/timezone.ts similarity index 100% rename from packages/console/src/common/timezone.ts rename to packages/oss-console/src/common/timezone.ts diff --git a/packages/console/src/common/typeCheckers.ts b/packages/oss-console/src/common/typeCheckers.ts similarity index 100% rename from packages/console/src/common/typeCheckers.ts rename to packages/oss-console/src/common/typeCheckers.ts diff --git a/packages/console/src/common/types.ts b/packages/oss-console/src/common/types.ts similarity index 100% rename from packages/console/src/common/types.ts rename to packages/oss-console/src/common/types.ts diff --git a/packages/console/src/common/utils.ts b/packages/oss-console/src/common/utils.ts similarity index 68% rename from packages/console/src/common/utils.ts rename to packages/oss-console/src/common/utils.ts index 20e72adfd..ee02b185b 100644 --- a/packages/console/src/common/utils.ts +++ b/packages/oss-console/src/common/utils.ts @@ -1,8 +1,8 @@ -import { Protobuf } from '@flyteorg/flyteidl-types'; +import Protobuf from '@clients/common/flyteidl/protobuf'; import Long from 'long'; -import { WorkflowExecutionPhase } from 'models/Execution/enums'; -import { WorkflowExecutionIdentifier } from 'models/Execution/types'; -import { Routes } from 'routes/routes'; +import { WorkflowExecutionPhase } from '../models/Execution/enums'; +import { WorkflowExecutionIdentifier } from '../models/Execution/types'; +import { Routes } from '../routes/routes'; /** Determines if a given date string or object is a valid, usable date. This will detect * JS Date objects which have been initialized with invalid values as well as strings which @@ -14,27 +14,32 @@ export function isValidDate(input: string | Date): boolean { return !Number.isNaN(time) && time > 0; } -/** Converts a Protobuf Timestamp object to a JS Date */ -export function timestampToDate(timestamp: Protobuf.ITimestamp): Date { +export function timestampToMilliseconds(timestamp?: Protobuf.ITimestamp): number { + if (!timestamp) return 0; + const nanos = timestamp.nanos || 0; - const milliseconds = - Long.fromValue(timestamp?.seconds!).toNumber() * 1000 + nanos / 1e6; + const milliseconds = Long.fromValue(timestamp?.seconds!).toNumber() * 1000 + nanos / 1e6; + + return milliseconds; +} +/** Converts a Protobuf Timestamp object to a JS Date */ +export function timestampToDate(timestamp?: Protobuf.ITimestamp): Date { + if (!timestamp) return new Date(); + + const milliseconds = timestampToMilliseconds(timestamp); return new Date(milliseconds); } /** A sort comparison function for ordering timestamps in ascending progression */ -export function compareTimestampsAscending( - a: Protobuf.ITimestamp, - b: Protobuf.ITimestamp, -) { +export function compareTimestampsAscending(a: Protobuf.ITimestamp, b: Protobuf.ITimestamp) { const leftSeconds: Long = - (typeof a.seconds === 'number' ? Long.fromNumber(a.seconds) : a.seconds) || + (typeof a.seconds === 'number' ? Long.fromNumber(a.seconds) : (a.seconds as Long)) || Long.fromNumber(0); const leftNanos: number = a.nanos || 0; // i was here const rightSeconds: Long = - (typeof b.seconds === 'number' ? Long.fromNumber(b.seconds) : b.seconds) || + (typeof b.seconds === 'number' ? Long.fromNumber(b.seconds) : (b.seconds as Long)) || Long.fromNumber(0); const rightNanos: number = b.nanos || 0; if (leftSeconds.eq(rightSeconds)) { @@ -55,16 +60,12 @@ export function dateToTimestamp(date: Date): Protobuf.Timestamp { export function durationToMilliseconds(duration: Protobuf.IDuration): number { const nanos = duration.nanos || 0; const seconds = - typeof duration.seconds === 'number' - ? duration.seconds - : (duration.seconds as Long).toNumber(); + typeof duration.seconds === 'number' ? duration.seconds : (duration.seconds as Long).toNumber(); return seconds * 1000 + nanos / 1e6; } /** Converts a (possibly fractional) value in milliseconds to a Protobuf Duration object */ -export function millisecondsToDuration( - milliseconds: number, -): Protobuf.Duration { +export function millisecondsToDuration(milliseconds: number): Protobuf.Duration { return new Protobuf.Duration({ seconds: Long.fromNumber(Math.floor(milliseconds / 1000)), // Nanosecond resolution is more than enough, this is to prevent precision errors @@ -83,16 +84,12 @@ export function createLocalURL(path: string) { } /** Returns entires for an object, sorted lexicographically */ -export function sortedObjectEntries(object: { - [s: string]: T; -}): [string, T][] { +export function sortedObjectEntries(object: { [s: string]: T }): [string, T][] { return Object.entries(object).sort((a, b) => a[0].localeCompare(b[0])); } /** Returns keys for an objext, sorted lexicographically */ -export function sortedObjectKeys( - object: Record, -): ReturnType { +export function sortedObjectKeys(object: Record): ReturnType { return Object.keys(object).sort((a, b) => a.localeCompare(b)); } @@ -100,27 +97,12 @@ export function sortedObjectKeys( * Helper function for exhaustive checks of discriminated unions. * https://basarat.gitbooks.io/typescript/docs/types/discriminated-unions.html */ -export function assertNever( - value: never, - { noThrow }: { noThrow?: boolean } = {}, -): never { +export function assertNever(value: never, { noThrow }: { noThrow?: boolean } = {}): never { if (noThrow) { return value; } - throw new Error( - `Unhandled discriminated union member: ${JSON.stringify(value)}`, - ); -} - -/** - * Function that returns boolean value for the string or number representation - */ -export function toBoolean(value?: string): boolean { - if (value == null) { - return false; - } - return ['true', 'True', 'TRUE', '1'].includes(value); + throw new Error(`Unhandled discriminated union member: ${JSON.stringify(value)}`); } /** Simple shared stringify function to ensure consistency in formatting with @@ -134,9 +116,7 @@ export const padExecutions = (items: WorkflowExecutionPhase[]) => { if (items.length >= 10) { return items.slice(0, 10).reverse(); } - const emptyExecutions = new Array(10 - items.length).fill( - WorkflowExecutionPhase.QUEUED, - ); + const emptyExecutions = new Array(10 - items.length).fill(undefined); return [...items, ...emptyExecutions].reverse(); }; @@ -144,12 +124,9 @@ export const padExecutionPaths = (items: WorkflowExecutionIdentifier[]) => { if (items.length >= 10) { return items .slice(0, 10) - .map(id => Routes.ExecutionDetails.makeUrl(id)) + .map((id) => Routes.ExecutionDetails.makeUrl(id)) .reverse(); } const emptyExecutions = new Array(10 - items.length).fill(null); - return [ - ...items.map(id => Routes.ExecutionDetails.makeUrl(id)), - ...emptyExecutions, - ].reverse(); + return [...items.map((id) => Routes.ExecutionDetails.makeUrl(id)), ...emptyExecutions].reverse(); }; diff --git a/packages/console/src/components/Breadcrumbs/async/executionContext.ts b/packages/oss-console/src/components/Breadcrumbs/async/executionContext.ts similarity index 58% rename from packages/console/src/components/Breadcrumbs/async/executionContext.ts rename to packages/oss-console/src/components/Breadcrumbs/async/executionContext.ts index d2cdc3a62..3e27034d2 100644 --- a/packages/console/src/components/Breadcrumbs/async/executionContext.ts +++ b/packages/oss-console/src/components/Breadcrumbs/async/executionContext.ts @@ -1,10 +1,10 @@ -import { Execution, ResourceType, SortDirection, limits } from 'models'; -import { getExecution, listExecutions } from 'models/Execution/api'; -import { Routes } from 'routes'; -import { timestampToDate } from 'common'; -import { formatDateUTC } from 'common/formatters'; -import { executionFilterGenerator } from 'components/Entities/generators'; -import { executionSortFields } from 'models/Execution/constants'; +import { SimpleCacheCallbackManager } from '@clients/primitives/SimpleCache/SimpleCacheCallbackManager'; +import { SortDirection } from '@clients/common/types/adminEntityTypes'; +import { Routes } from '../../../routes/routes'; +import { getExecution, listExecutions } from '../../../models/Execution/api'; +import { formatDateUTC } from '../../../common/formatters'; +import { executionFilterGenerator } from '../../Entities/generators'; +import { executionSortFields } from '../../../models/Execution/constants'; import { BreadcrumbAsyncPopOverData, BreadcrumbAsyncValue, @@ -14,21 +14,38 @@ import { BreadcrumbFormControlInterface, } from '../types'; import { fetchVersions } from './fn'; - -const getExecutionData = async ( - projectId: string, - domainId: string, - executionId: string, -) => { +import { getExecutionSpecProjectDomain } from './utils'; +import { Execution } from '../../../models/Execution/types'; +import { Identifier, ResourceType } from '../../../models/Common/types'; +import { timestampToDate } from '../../../common/utils'; + +const executionCache = new SimpleCacheCallbackManager({ + size: 25, + duration: 5 * 1000, // 5 seconds +}); + +const executionListCache = new SimpleCacheCallbackManager({ + size: 25, + duration: 5 * 1000, // 5 seconds +}); + +const getExecutionData = async (projectId: string, domainId: string, executionId: string) => { const resourceId = { project: projectId, domain: domainId, name: executionId, }; - if (!executionId) - throw Error('No id found for execution, cannot fetch execution'); + if (!executionId) throw Error('No id found for execution, cannot fetch execution'); + + const options = {}; + + const cacheKey = `${JSON.stringify(Object.entries(resourceId).sort())}__${JSON.stringify( + options, + )}`; + const executionData = await executionCache.getCachedOrFetch(cacheKey, () => + getExecution(resourceId, options), + ); - const executionData = await getExecution(resourceId, {}); return executionData; }; @@ -48,9 +65,7 @@ const getTaskOrWorkflowVersion = (executionData: Execution): string => { const getExecutionValue = (location: Location) => { const segments = decodeURIComponent(location.pathname).split('/'); - const executionSegmentName = segments.findIndex(s => - ['execution', 'executions'].includes(s), - ); + const executionSegmentName = segments.findIndex((s) => ['execution', 'executions'].includes(s)); const executionValue = segments[executionSegmentName + 1] || ''; return executionValue; @@ -58,16 +73,13 @@ const getExecutionValue = (location: Location) => { const getVersionValue = (location: Location) => { const segments = decodeURIComponent(location.pathname).split('/'); - const versionSegmentName = segments.findIndex(s => s === 'version'); + const versionSegmentName = segments.findIndex((s) => s === 'version'); const versionValue = segments[versionSegmentName + 1] || ''; return versionValue; }; -export const executonNamedEntityAsyncValue: BreadcrumbAsyncValue = async ( - location, - breadcrumb, -) => { +export const executonNamedEntityAsyncValue: BreadcrumbAsyncValue = async (location, breadcrumb) => { const executionValue = getExecutionValue(location); if (!executionValue) return typeof breadcrumb.defaultValue === 'string' @@ -100,31 +112,31 @@ export const executonTaskWorkFlowNameAsyncValue: BreadcrumbAsyncValue = async ( return getTaskOrWorkflowName(executionData); }; -export const executonTaskWorkFlowNameAsyncSelfLink: BreadcrumbEntitySelfLinkAsync = - async (location, breadcrumb) => { - const executionValue = getExecutionValue(location); - const executionData = await getExecutionData( - breadcrumb.projectId, - breadcrumb.domainId, - executionValue, - ); - - const resourceName = getTaskOrWorkflowName(executionData); - const resourceType = isExecutionTaskOrWorkflow(executionData); - - if (resourceType === ResourceType.TASK) { - return Routes.TaskDetails.makeUrl( - breadcrumb.projectId, - breadcrumb.domainId, - resourceName, - ); - } - return Routes.WorkflowDetails.makeUrl( - breadcrumb.projectId, - breadcrumb.domainId, - resourceName, - ); - }; +export const executonTaskWorkFlowNameAsyncSelfLink: BreadcrumbEntitySelfLinkAsync = async ( + location, + breadcrumb, +) => { + const executionValue = getExecutionValue(location); + const executionData = await getExecutionData( + breadcrumb.projectId, + breadcrumb.domainId, + executionValue, + ); + + const resourceName = getTaskOrWorkflowName(executionData); + const resourceType = isExecutionTaskOrWorkflow(executionData); + + const { project: desinationProject, domain: desinationDomain } = getExecutionSpecProjectDomain( + executionData.spec.launchPlan, + breadcrumb, + ); + + // return Routes.EntityDetails.makeUrl() + if (resourceType === ResourceType.TASK) { + return Routes.TaskDetails.makeUrl(desinationProject, desinationDomain, resourceName); + } + return Routes.WorkflowDetails.makeUrl(desinationProject, desinationDomain, resourceName); +}; export const executionTaskWorkflowVersions: BreadcrumbAsyncPopOverData = async ( location, @@ -141,6 +153,11 @@ export const executionTaskWorkflowVersions: BreadcrumbAsyncPopOverData = async ( const entityResourceName = getTaskOrWorkflowName(executionData); const entityResourceVersion = getTaskOrWorkflowVersion(executionData); + const { project: desinationProject, domain: desinationDomain } = getExecutionSpecProjectDomain( + executionData.spec.launchPlan, + breadcrumb, + ); + const resourceId = { project: breadcrumb.projectId, domain: breadcrumb.domainId, @@ -150,39 +167,32 @@ export const executionTaskWorkflowVersions: BreadcrumbAsyncPopOverData = async ( const entityVersions = await fetchVersions(resourceId); - const popOverData: BreadcrumbEntity[] = entityVersions.entities.map( - entityVersion => { - const title = entityVersion?.id?.version || ''; - const url = Routes.EntityVersionDetails.makeUrl( - breadcrumb.projectId, - breadcrumb.domainId, - entityResourceName, - executionType === ResourceType.TASK ? 'task' : 'workflow', - title, - ); - const createdAt = formatDateUTC( - timestampToDate(entityVersion?.closure?.createdAt), - ); - const active = - entityResourceVersion.trim().toLocaleLowerCase() === - title.trim().toLocaleLowerCase(); + const popOverData: BreadcrumbEntity[] = entityVersions.entities.map((entityVersion: any) => { + const title = entityVersion?.id?.version || ''; + const id: Identifier = { + project: desinationProject, + domain: desinationDomain, + name: entityResourceName, + resourceType: executionType, + version: title, + }; + const url = Routes.EntityVersionDetails.makeUrl(id); + const createdAt = formatDateUTC(timestampToDate(entityVersion?.closure?.createdAt)); + const active = + entityResourceVersion.trim().toLocaleLowerCase() === title.trim().toLocaleLowerCase(); - return { - title, - url, - createdAt, - active, - }; - }, - ); + return { + title, + url, + createdAt, + active, + }; + }); return popOverData; }; -export const taskVersions: BreadcrumbAsyncPopOverData = async ( - location, - breadcrumb, -) => { +export const taskVersions: BreadcrumbAsyncPopOverData = async (location, breadcrumb) => { const resourceId = { project: breadcrumb.projectId, domain: breadcrumb.domainId, @@ -194,18 +204,18 @@ export const taskVersions: BreadcrumbAsyncPopOverData = async ( const entityVersions = await fetchVersions(resourceId); const popOverData: BreadcrumbEntity[] = entityVersions.entities.map( - (entityVersion, index) => { + (entityVersion: any, index: number) => { const title = entityVersion?.id?.version || ''; - const url = Routes.EntityVersionDetails.makeUrl( - breadcrumb.projectId, - breadcrumb.domainId, - breadcrumb.value, - 'task', - title, - ); - const createdAt = formatDateUTC( - timestampToDate(entityVersion?.closure?.createdAt), - ); + const id: Identifier = { + project: breadcrumb.projectId, + domain: breadcrumb.domainId, + name: breadcrumb.value, + resourceType: ResourceType.TASK, + version: title, + }; + + const url = Routes.EntityVersionDetails.makeUrl(id); + const createdAt = formatDateUTC(timestampToDate(entityVersion?.closure?.createdAt)); // UI only shows last version const active = versionValue ? versionValue === title : index === 0; @@ -222,10 +232,7 @@ export const taskVersions: BreadcrumbAsyncPopOverData = async ( return popOverData; }; -export const workflowVersions: BreadcrumbAsyncPopOverData = async ( - location, - breadcrumb, -) => { +export const workflowVersions: BreadcrumbAsyncPopOverData = async (location, breadcrumb) => { const resourceId = { project: breadcrumb.projectId, domain: breadcrumb.domainId, @@ -237,18 +244,18 @@ export const workflowVersions: BreadcrumbAsyncPopOverData = async ( const entityVersions = await fetchVersions(resourceId); const popOverData: BreadcrumbEntity[] = entityVersions.entities.map( - (entityVersion, index) => { + (entityVersion: any, index: number) => { const title = entityVersion?.id?.version || ''; - const url = Routes.EntityVersionDetails.makeUrl( - breadcrumb.projectId, - breadcrumb.domainId, - breadcrumb.value, - 'workflow', - title, - ); - const createdAt = formatDateUTC( - timestampToDate(entityVersion?.closure?.createdAt), - ); + const id: Identifier = { + project: breadcrumb.projectId, + domain: breadcrumb.domainId, + name: breadcrumb.value, + resourceType: ResourceType.WORKFLOW, + version: title, + }; + + const url = Routes.EntityVersionDetails.makeUrl(id); + const createdAt = formatDateUTC(timestampToDate(entityVersion?.closure?.createdAt)); // UI only shows last version const active = versionValue ? versionValue === title : index === 0; @@ -265,10 +272,7 @@ export const workflowVersions: BreadcrumbAsyncPopOverData = async ( return popOverData; }; -export const launchPlanVersions: BreadcrumbAsyncPopOverData = async ( - location, - breadcrumb, -) => { +export const launchPlanVersions: BreadcrumbAsyncPopOverData = async (location, breadcrumb) => { const resourceId = { project: breadcrumb.projectId, domain: breadcrumb.domainId, @@ -280,18 +284,17 @@ export const launchPlanVersions: BreadcrumbAsyncPopOverData = async ( const entityVersions = await fetchVersions(resourceId); const popOverData: BreadcrumbEntity[] = entityVersions.entities.map( - (entityVersion, index) => { + (entityVersion: any, index: number) => { const title = entityVersion?.id?.version || ''; - const url = Routes.EntityVersionDetails.makeUrl( - breadcrumb.projectId, - breadcrumb.domainId, - breadcrumb.value, - 'launch_plan', - title, - ); - const createdAt = formatDateUTC( - timestampToDate(entityVersion?.closure?.createdAt), - ); + const id: Identifier = { + project: breadcrumb.projectId, + domain: breadcrumb.domainId, + name: breadcrumb.value, + resourceType: ResourceType.LAUNCH_PLAN, + version: title, + }; + const url = Routes.EntityVersionDetails.makeUrl(id); + const createdAt = formatDateUTC(timestampToDate(entityVersion?.closure?.createdAt)); // UI only shows last version const active = versionValue ? versionValue === title : index === 0; @@ -308,26 +311,17 @@ export const launchPlanVersions: BreadcrumbAsyncPopOverData = async ( return popOverData; }; -export const taskVersionsLink: BreadcrumbAsyncViewAllLink = async ( - location, - breadcrumb, -) => { +export const taskVersionsLink: BreadcrumbAsyncViewAllLink = async (location, breadcrumb) => { const data = await taskVersions(location, breadcrumb); return data[0].url; }; -export const workflowVersionsLink: BreadcrumbAsyncViewAllLink = async ( - location, - breadcrumb, -) => { +export const workflowVersionsLink: BreadcrumbAsyncViewAllLink = async (location, breadcrumb) => { const data = await workflowVersions(location, breadcrumb); return data[0].url; }; -export const launchPlanVersionsLink: BreadcrumbAsyncViewAllLink = async ( - location, - breadcrumb, -) => { +export const launchPlanVersionsLink: BreadcrumbAsyncViewAllLink = async (location, breadcrumb) => { const data = await launchPlanVersions(location, breadcrumb); return data[0].url; }; @@ -346,18 +340,15 @@ export const executionTaskWorkflowViewAll: BreadcrumbAsyncViewAllLink = async ( const executionType = isExecutionTaskOrWorkflow(executionData); const entityResourceName = getTaskOrWorkflowName(executionData); + const { project: desinationProject, domain: desinationDomain } = getExecutionSpecProjectDomain( + executionData.spec.launchPlan, + breadcrumb, + ); + if (executionType === ResourceType.TASK) { - return Routes.TaskDetails.makeUrl( - breadcrumb.projectId, - breadcrumb.domainId, - entityResourceName, - ); + return Routes.TaskDetails.makeUrl(desinationProject, desinationDomain, entityResourceName); } - return Routes.WorkflowDetails.makeUrl( - breadcrumb.projectId, - breadcrumb.domainId, - entityResourceName, - ); + return Routes.WorkflowDetails.makeUrl(desinationProject, desinationDomain, entityResourceName); }; export const executionsPeerExecutionList: BreadcrumbAsyncPopOverData = async ( @@ -365,6 +356,7 @@ export const executionsPeerExecutionList: BreadcrumbAsyncPopOverData = async ( breadcrumb, ) => { const executionValue = getExecutionValue(location); + const executionData = await getExecutionData( breadcrumb.projectId, breadcrumb.domainId, @@ -391,13 +383,21 @@ export const executionsPeerExecutionList: BreadcrumbAsyncPopOverData = async ( direction: SortDirection.DESCENDING, }; - const executions = await listExecutions(resourceId, { + const executionsListOptions = { sort, filter: executionFilterGenerator[executionType](filterId), - limit: limits.NONE, - }); + limit: 5, + }; + + const executionsListCacheKey = `${JSON.stringify( + Object.entries(resourceId).sort(), + )}__${JSON.stringify(executionsListOptions)}`; + + const executions = await executionListCache.getCachedOrFetch(executionsListCacheKey, () => + listExecutions(resourceId, executionsListOptions), + ); - const popOverData: BreadcrumbEntity[] = executions.entities.map(entity => { + const popOverData: BreadcrumbEntity[] = executions.entities.map((entity: any) => { const title = entity.id.name; const url = Routes.ExecutionDetails.makeUrl({ project: breadcrumb.projectId, diff --git a/packages/console/src/components/Breadcrumbs/async/fn.ts b/packages/oss-console/src/components/Breadcrumbs/async/fn.ts similarity index 51% rename from packages/console/src/components/Breadcrumbs/async/fn.ts rename to packages/oss-console/src/components/Breadcrumbs/async/fn.ts index 70ff38191..5f513be0e 100644 --- a/packages/console/src/components/Breadcrumbs/async/fn.ts +++ b/packages/oss-console/src/components/Breadcrumbs/async/fn.ts @@ -1,18 +1,27 @@ -import { listWorkflows } from 'models/Workflow/api'; -import { listNamedEntities } from 'models/Common/api'; -import { ResourceType, SortDirection, defaultPaginationConfig } from 'models'; -import { listProjects } from 'models/Project/api'; -import { executionFilterGenerator } from 'components/Entities/generators'; -import { entityFunctions } from 'components/hooks/Entity/constants'; -import { executionSortFields } from 'models/Execution/constants'; +import { SimpleCacheCallbackManager } from '@clients/primitives/SimpleCache/SimpleCacheCallbackManager'; +import { SortDirection } from '@clients/common/types/adminEntityTypes'; +import { listWorkflows } from '../../../models/Workflow/api'; +import { listNamedEntities } from '../../../models/Common/api'; +import { listProjects } from '../../../models/Project/api'; +import { executionFilterGenerator } from '../../Entities/generators'; +import { entityFunctions } from '../../hooks/Entity/constants'; +import { executionSortFields } from '../../../models/Execution/constants'; +import { Project } from '../../../models/Project/types'; import { formatEntities, - formatProjectEntities, formatProjectEntitiesAsDomains, + formatProjectEntitiesURLAware, formatVersions, } from './utils'; import { namedEntitiesList } from '../defaultValue'; import { BreadcrumbAsyncPopOverData, BreadcrumbEntity } from '../types'; +import { ResourceType } from '../../../models/Common/types'; +import { defaultPaginationConfig } from '../../../models/AdminEntity/constants'; + +const versionCache = new SimpleCacheCallbackManager({ + size: 25, + duration: 5 * 1000, // 5 seconds +}); /** * Default async data function, returns an empty array @@ -21,23 +30,33 @@ import { BreadcrumbAsyncPopOverData, BreadcrumbEntity } from '../types'; * @param _domainId * @returns */ -export const defaultVoid: BreadcrumbAsyncPopOverData = async ( - _location, - _breadcrumb, -) => []; +export const defaultVoid: BreadcrumbAsyncPopOverData = async (_location, _breadcrumb) => []; + +/** + * This data should not change often, so we cache it for 5 minutes + */ +const projectCache = new SimpleCacheCallbackManager({ + size: 2, + duration: 5 * 1000 * 60, // 5 mins +}); + +export const getProjects = async () => { + const request = listProjects; + const cacheKey = `projects`; + const response = await projectCache.getCachedOrFetch(cacheKey, request); + return response as Promise; +}; /** * Fetch a list of projects and format them for the breadcrumb - * @param _projectId - * @param _domainId + * @param _location + * @param breadcrumb * @returns */ -export const projects: BreadcrumbAsyncPopOverData = async ( - _location, - breadcrumb, -) => { - return listProjects().then(data => - formatProjectEntities(data, breadcrumb.domainId), +export const projects: BreadcrumbAsyncPopOverData = async (location, breadcrumb) => { + const { pathname } = location; + return getProjects().then((data) => + formatProjectEntitiesURLAware(pathname, breadcrumb.domainId, data), ); }; @@ -47,12 +66,10 @@ export const projects: BreadcrumbAsyncPopOverData = async ( * @param domainId * @returns */ -export const domains: BreadcrumbAsyncPopOverData = async ( - _location, - breadcrumb, -) => { - return listProjects().then(data => - formatProjectEntitiesAsDomains(data, breadcrumb.projectId), +export const domains: BreadcrumbAsyncPopOverData = async (location, breadcrumb) => { + const { pathname } = location; + return getProjects().then((data) => + formatProjectEntitiesAsDomains(pathname, breadcrumb.projectId, data), ); }; @@ -62,14 +79,11 @@ export const domains: BreadcrumbAsyncPopOverData = async ( * @param domainId * @returns */ -export const workflows: BreadcrumbAsyncPopOverData = async ( - _location, - breadcrumb, -) => { +export const workflows: BreadcrumbAsyncPopOverData = async (_location, breadcrumb) => { return listWorkflows({ project: breadcrumb.projectId, domain: breadcrumb.domainId, - }).then(data => formatEntities(data)); + }).then((data) => formatEntities(data)); }; /** @@ -78,10 +92,7 @@ export const workflows: BreadcrumbAsyncPopOverData = async ( * @param domainId * @returns */ -export const tasks: BreadcrumbAsyncPopOverData = async ( - _location, - breadcrumb, -) => { +export const tasks: BreadcrumbAsyncPopOverData = async (_location, breadcrumb) => { return listNamedEntities( { project: breadcrumb.projectId, @@ -89,7 +100,7 @@ export const tasks: BreadcrumbAsyncPopOverData = async ( resourceType: ResourceType.TASK, }, defaultPaginationConfig, - ).then(data => formatEntities(data)); + ).then((data) => formatEntities(data)); }; /** @@ -98,10 +109,7 @@ export const tasks: BreadcrumbAsyncPopOverData = async ( * @param domainId * @returns */ -export const launchPlans: BreadcrumbAsyncPopOverData = async ( - _location, - breadcrumb, -) => { +export const launchPlans: BreadcrumbAsyncPopOverData = async (_location, breadcrumb) => { return listNamedEntities( { project: breadcrumb.projectId, @@ -109,7 +117,7 @@ export const launchPlans: BreadcrumbAsyncPopOverData = async ( resourceType: ResourceType.LAUNCH_PLAN, }, defaultPaginationConfig, - ).then(data => formatEntities(data)); + ).then((data) => formatEntities(data)); }; /** @@ -119,10 +127,7 @@ export const launchPlans: BreadcrumbAsyncPopOverData = async ( * @param domainId * @returns */ -export const namedEntities: BreadcrumbAsyncPopOverData = async ( - _location, - breadcrumb, -) => { +export const namedEntities: BreadcrumbAsyncPopOverData = async (_location, breadcrumb) => { return namedEntitiesList(breadcrumb.projectId, breadcrumb.domainId); }; @@ -132,17 +137,26 @@ export const namedEntities: BreadcrumbAsyncPopOverData = async ( * @param entityName * @returns */ -export const fetchVersions = async resourceId => { +export const fetchVersions = async (resourceId) => { const filter = executionFilterGenerator[resourceId.resourceType](resourceId); const sort = { key: executionSortFields.createdAt, direction: SortDirection.DESCENDING, }; - const data = await entityFunctions[resourceId.resourceType].listEntity( - resourceId, - { sort, filter }, - ); - return data; + const options = { + sort, + filter, + }; + + const request = async () => + entityFunctions[resourceId.resourceType].listEntity(resourceId, options); + + const cacheKey = `${JSON.stringify(Object.entries(resourceId).sort())}__${JSON.stringify( + options, + )}`; + const response = await versionCache.getCachedOrFetch(cacheKey, request); + + return response; }; /** @@ -151,12 +165,9 @@ export const fetchVersions = async resourceId => { * @param domainId * @returns */ -export const namedEntitiesVersions: BreadcrumbAsyncPopOverData = async ( - _location, - breadcrumb, -) => { +export const namedEntitiesVersions: BreadcrumbAsyncPopOverData = async (_location, breadcrumb) => { const segments = decodeURI(window.location.pathname).split('/'); - const versionIndex = segments.findIndex(segment => segment === 'version'); + const versionIndex = segments.findIndex((segment) => segment === 'version'); const entityNameIndex = versionIndex - 2; const entityName = segments[entityNameIndex]; const entityIdIndex = versionIndex - 1; @@ -171,7 +182,8 @@ export const namedEntitiesVersions: BreadcrumbAsyncPopOverData = async ( if (!entityName) { return []; - } else if (entityName.startsWith('task')) { + } + if (entityName.startsWith('task')) { resourceId.resourceType = ResourceType.TASK; } else if (entityName.startsWith('workflow')) { resourceId.resourceType = ResourceType.WORKFLOW; diff --git a/packages/oss-console/src/components/Breadcrumbs/async/utils/breadcrumQueryOptions.ts b/packages/oss-console/src/components/Breadcrumbs/async/utils/breadcrumQueryOptions.ts new file mode 100644 index 000000000..078818f79 --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/async/utils/breadcrumQueryOptions.ts @@ -0,0 +1,6 @@ +// https://tanstack.com/query/v3/docs/react/reference/useQuery + +export default { + refetchOnMount: false, + refetchOnWindowFocus: false, +}; diff --git a/packages/oss-console/src/components/Breadcrumbs/async/utils/domainIdFromURL.ts b/packages/oss-console/src/components/Breadcrumbs/async/utils/domainIdFromURL.ts new file mode 100644 index 000000000..a69912fc6 --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/async/utils/domainIdFromURL.ts @@ -0,0 +1,12 @@ +export const domainIdfromUrl = (location: Location) => { + const path = location.pathname.split('/'); + if (path.indexOf('domains') > -1) { + return path[path.indexOf('domains') + 1] || ''; + } + if (location.search.includes('domain')) { + const searchParams = new URLSearchParams(location.search); + return searchParams.get('domain') || ''; + } + + return ''; +}; diff --git a/packages/oss-console/src/components/Breadcrumbs/async/utils/formatProjectEntities.ts b/packages/oss-console/src/components/Breadcrumbs/async/utils/formatProjectEntities.ts new file mode 100644 index 000000000..573169fea --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/async/utils/formatProjectEntities.ts @@ -0,0 +1,46 @@ +import { Project } from '../../../../models/Project/types'; +import { Routes } from '../../../../routes/routes'; + +export const formatProjectEntitiesURLAware = ( + pathname: string, + domainId: string, + data: Project[] = [], +) => { + if (!data.length) return []; + + // maintain the current app context + // bring to "app" root on domain/project switch + let urlBuilder = Routes.ProjectDetails.sections.dashboard.makeUrl; + if ( + pathname.includes('/workflow/') || // versions + pathname.endsWith('/workflows') || // list page + pathname.includes('/workflows/') // details + ) { + urlBuilder = Routes.ProjectDetails.sections.workflows.makeUrl; + } else if ( + pathname.includes('/task/') || // versions + pathname.endsWith('/tasks') || // list page + pathname.includes('/tasks/') // details + ) { + urlBuilder = Routes.ProjectDetails.sections.tasks.makeUrl; + } else if ( + pathname.includes('/launch_plan/') || // versions + pathname.endsWith('/launchPlans') || // list page + pathname.includes('/launchPlans/') // details + ) { + urlBuilder = Routes.ProjectDetails.sections.launchPlans.makeUrl; + } + + return data.map((project) => { + const isDomainSelected = project.domains.some((domain) => domain.id === domainId); + const domainIdToUse = isDomainSelected ? domainId : project.domains[0].id; + const url = urlBuilder(project.id, domainIdToUse); + + return { + title: project.name, + id: project.id, + createdAt: '', + url, + }; + }); +}; diff --git a/packages/oss-console/src/components/Breadcrumbs/async/utils/formatProjectEntitiesAsDomains.ts b/packages/oss-console/src/components/Breadcrumbs/async/utils/formatProjectEntitiesAsDomains.ts new file mode 100644 index 000000000..184ae1684 --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/async/utils/formatProjectEntitiesAsDomains.ts @@ -0,0 +1,46 @@ +import { Project } from '../../../../models/Project/types'; +import { Routes } from '../../../../routes/routes'; + +export const formatProjectEntitiesAsDomains = ( + pathname: string, + projectId: string, + data: Project[] = [], +) => { + if (!data.length) return []; + + const project = data.find((p) => p.id === projectId) || data[0]; + + // maintain the current app context + // bring to "app" root on domain/project switch + let urlBuilder = Routes.ProjectDetails.sections.dashboard.makeUrl; + if ( + pathname.includes('/workflow/') || // versions + pathname.endsWith('/workflows') || // list page + pathname.includes('/workflows/') // details + ) { + urlBuilder = Routes.ProjectDetails.sections.workflows.makeUrl; + } else if ( + pathname.includes('/task/') || // versions + pathname.endsWith('/tasks') || // list page + pathname.includes('/tasks/') // details + ) { + urlBuilder = Routes.ProjectDetails.sections.tasks.makeUrl; + } else if ( + pathname.includes('/launch_plan/') || // versions + pathname.endsWith('/launchPlans') || // list page + pathname.includes('/launchPlans/') // details + ) { + urlBuilder = Routes.ProjectDetails.sections.launchPlans.makeUrl; + } + + return project.domains.map((domain) => { + const url = urlBuilder(project.id, domain.id); + + return { + title: domain.name, + id: domain.id, + createdAt: '', + url, + }; + }); +}; diff --git a/packages/oss-console/src/components/Breadcrumbs/async/utils/index.ts b/packages/oss-console/src/components/Breadcrumbs/async/utils/index.ts new file mode 100644 index 000000000..ecfc8aee1 --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/async/utils/index.ts @@ -0,0 +1,77 @@ +import { Routes } from '../../../../routes/routes'; +import { BreadcrumbEntity, BreadcrumbFormControlInterface } from '../../types'; +import { formatProjectEntitiesAsDomains } from './formatProjectEntitiesAsDomains'; +import { projectIdfromUrl } from './projectIdFromURL'; +import { domainIdfromUrl } from './domainIdFromURL'; +import { formatProjectEntitiesURLAware } from './formatProjectEntities'; +import breadcrumQueryOptions from './breadcrumQueryOptions'; +import { DomainIdentifierScope, Identifier } from '../../../../models/Common/types'; +import { formatDateUTC } from '../../../../common/formatters'; +import { timestampToDate } from '../../../../common/utils'; + +export { + formatProjectEntitiesAsDomains, + projectIdfromUrl, + domainIdfromUrl, + formatProjectEntitiesURLAware, +}; + +export const formatEntities = (data) => { + return data.entities.map((entity) => { + return { + title: entity.id.name, + createdAt: entity?.closure?.createdAt + ? formatDateUTC(timestampToDate(entity.closure.createdAt)) + : '', + url: Routes.WorkflowDetails.makeUrl(entity.id.project, entity.id.domain, entity.id.name), + }; + }); +}; + +export const formatVersions = (data: any, resourceUrl: string) => { + return data.entities.map((entity: any) => { + const { id: entityId } = entity; + const id: Identifier = { + project: entityId.project, + domain: entityId.domain, + name: entityId.name, + resourceType: resourceUrl as any, + version: entityId.version, + }; + const url = Routes.EntityVersionDetails.makeUrl(id); + + return { + title: entity.id.version, + createdAt: entity?.closure?.createdAt + ? formatDateUTC(timestampToDate(entity.closure.createdAt)) + : '', + url, + }; + }) as BreadcrumbEntity[]; +}; + +/** + * Determine if the execution is from the same project and domain as the current page. + * + * @param executionSpecIdentifier + * @param breadcrumb + * @see https://docs.flyte.org/projects/flytectl/en/latest/gen/flytectl_create_execution.html + * @returns + */ +export const getExecutionSpecProjectDomain = ( + executionSpecIdentifier: DomainIdentifierScope, + breadcrumb: BreadcrumbFormControlInterface, +) => { + const project = + breadcrumb.projectId === executionSpecIdentifier.project + ? breadcrumb.projectId + : executionSpecIdentifier.project; + const domain = + breadcrumb.projectId === executionSpecIdentifier.domain + ? breadcrumb.domainId + : executionSpecIdentifier.domain; + + return { project, domain }; +}; + +export { breadcrumQueryOptions }; diff --git a/packages/oss-console/src/components/Breadcrumbs/async/utils/projectIdFromURL.ts b/packages/oss-console/src/components/Breadcrumbs/async/utils/projectIdFromURL.ts new file mode 100644 index 000000000..1287e078d --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/async/utils/projectIdFromURL.ts @@ -0,0 +1,5 @@ +export const projectIdfromUrl = () => { + const path = window.location.pathname.split('/'); + const projectIdIndex = path.indexOf('projects') + 1; + return path[projectIdIndex]; +}; diff --git a/packages/console/src/components/Breadcrumbs/async/utils.test.ts b/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/domainIdFromURL.test.ts similarity index 50% rename from packages/console/src/components/Breadcrumbs/async/utils.test.ts rename to packages/oss-console/src/components/Breadcrumbs/async/utils/tests/domainIdFromURL.test.ts index 5cf536a1d..27f428a2c 100644 --- a/packages/console/src/components/Breadcrumbs/async/utils.test.ts +++ b/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/domainIdFromURL.test.ts @@ -1,45 +1,4 @@ -import { domainIdfromUrl, projectIdfromUrl } from './utils'; - -describe('projectIdfromUrl', () => { - it('returns the correct project ID from the URL', () => { - const value = 'projectId'; - const location = new URL( - `https://example.com/console/projects/${value}/details/abc`, - ); - - Object.defineProperty(window, 'location', { - value: location as unknown as Location, - writable: true, - }); - - jest - .spyOn(window.location, 'pathname', 'get') - .mockReturnValue(location.pathname); - - const result = projectIdfromUrl(); - - expect(result).toBe(value); - }); - - it('returns an empty string if no id is in the URL', () => { - const location = new URL( - `https://example.com/console/someotherlink/value/`, - ); - - Object.defineProperty(window, 'location', { - value: location as unknown as Location, - writable: true, - }); - - jest - .spyOn(window.location, 'pathname', 'get') - .mockReturnValue(location.pathname); - - const result = projectIdfromUrl(); - - expect(result).toBe(''); - }); -}); +import { domainIdfromUrl } from '../domainIdFromURL'; describe('domainIdfromUrl', () => { it('returns the correct domain ID from the URL', () => { @@ -76,9 +35,7 @@ describe('domainIdfromUrl', () => { }); it('returns an empty string if no id is in the URL', () => { - const location = new URL( - `https://example.com/console/someotherlink/value/`, - ); + const location = new URL(`https://example.com/console/someotherlink/value/`); const result = domainIdfromUrl(location as unknown as Location); diff --git a/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/formatProjectEntities.test.ts b/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/formatProjectEntities.test.ts new file mode 100644 index 000000000..cce8eabf9 --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/formatProjectEntities.test.ts @@ -0,0 +1,103 @@ +import { Project } from '../../../../../models/Project/types'; +import { formatProjectEntitiesURLAware } from '../formatProjectEntities'; + +jest.mock('@clients/common/environment', () => ({ + ...jest.requireActual('@clients/common/environment'), + env: { + BASE_URL: '/console', + }, + makeRoute: (path: string) => `/console${path}`.replace(/\/+$/, ''), +})); + +describe('formatProjectEntitiesAsDomains', () => { + Object.defineProperty(window, 'location', { + value: { + pathname: '/console', + }, + writable: true, // possibility to override + }); + + const mockData: Project[] = [ + { + id: 'project1', + name: 'Project 1', + domains: [ + { id: 'domain1', name: 'Domain 1' }, + { id: 'domain2', name: 'Domain 2' }, + ], + }, + { + id: 'project2', + name: 'Project 2', + domains: [ + { id: 'domain3', name: 'Domain 3' }, + { id: 'domain4', name: 'Domain 4' }, + ], + }, + ]; + + it('should format project/domain as execution links generally', () => { + const result = formatProjectEntitiesURLAware('/dashboard/some/random/url', 'domain4', mockData); + + expect(result).toEqual([ + { + title: 'Project 1', + id: 'project1', + createdAt: '', + url: '/console/projects/project1/domains/domain1/executions', + }, + { + title: 'Project 2', + id: 'project2', + createdAt: '', + url: '/console/projects/project2/domains/domain4/executions', + }, + ]); + }); + + it('should keep flyte app scrope (workflows)', () => { + const result = formatProjectEntitiesURLAware( + '/console/projects/project1/domains/domain2/workflows/some/sub/page', + 'domain1', + mockData, + ); + + expect(result).toEqual([ + { + title: 'Project 1', + id: 'project1', + createdAt: '', + url: '/console/projects/project1/domains/domain1/workflows', + }, + { + title: 'Project 2', + id: 'project2', + createdAt: '', + url: '/console/projects/project2/domains/domain3/workflows', + }, + ]); + }); + + it('fallback if not in list, first domain is used per project', () => { + const result = formatProjectEntitiesURLAware( + '/console/projects/project1/domains/domain2/workflows/some/sub/page', + 'not a real domain', + mockData, + ); + + expect(result).toEqual([ + { + title: 'Project 1', + id: 'project1', + createdAt: '', + url: '/console/projects/project1/domains/domain1/workflows', + }, + { + title: 'Project 2', + id: 'project2', + createdAt: '', + url: '/console/projects/project2/domains/domain3/workflows', + }, + ]); + }); +}); diff --git a/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/formatProjectEntitiesAsDomains.test.ts b/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/formatProjectEntitiesAsDomains.test.ts new file mode 100644 index 000000000..fca638f98 --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/formatProjectEntitiesAsDomains.test.ts @@ -0,0 +1,84 @@ +import { Project } from '../../../../../models/Project/types'; +import { formatProjectEntitiesAsDomains } from '../formatProjectEntitiesAsDomains'; + +jest.mock('@clients/common/environment', () => ({ + ...jest.requireActual('@clients/common/environment'), + env: { + BASE_URL: '/console', + }, + makeRoute: (path: string) => `${path}`.replace(/\/+$/, ''), +})); + +Object.defineProperty(window, 'location', { + value: { + pathname: '/console', + }, + writable: true, // possibility to override +}); + +describe('formatProjectEntitiesAsDomains', () => { + const mockData: Project[] = [ + { + id: 'project1', + name: 'project1', + domains: [ + { id: 'domain1', name: 'Domain 1' }, + { id: 'domain2', name: 'Domain 2' }, + ], + }, + { + id: 'project2', + name: 'project2', + domains: [ + { id: 'domain3', name: 'Domain 3' }, + { id: 'domain4', name: 'Domain 4' }, + ], + }, + ]; + + it('should format project/domain as execution links generally', () => { + const result = formatProjectEntitiesAsDomains( + '/dashboard/some/random/url', + 'project1', + mockData, + ); + + expect(result).toEqual([ + { + title: 'Domain 1', + id: 'domain1', + createdAt: '', + url: '/console/projects/project1/domains/domain1/executions', + }, + { + title: 'Domain 2', + id: 'domain2', + createdAt: '', + url: '/console/projects/project1/domains/domain2/executions', + }, + ]); + }); + + it('should keep flyte app scrope (workflows)', () => { + const result = formatProjectEntitiesAsDomains( + 'console/projects/project1/domains/domain2/workflows/some/sub/page', + 'project1', + mockData, + ); + + expect(result).toEqual([ + { + title: 'Domain 1', + id: 'domain1', + createdAt: '', + url: '/console/projects/project1/domains/domain1/workflows', + }, + { + title: 'Domain 2', + id: 'domain2', + createdAt: '', + url: '/console/projects/project1/domains/domain2/workflows', + }, + ]); + }); +}); diff --git a/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/projectIdFromURL.test.ts b/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/projectIdFromURL.test.ts new file mode 100644 index 000000000..023b32521 --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/async/utils/tests/projectIdFromURL.test.ts @@ -0,0 +1,34 @@ +import { projectIdfromUrl } from '../projectIdFromURL'; + +describe('projectIdfromUrl', () => { + it('returns the correct project ID from the URL', () => { + const value = 'projectId'; + const location = new URL(`https://example.com/console/projects/${value}/details/abc`); + + Object.defineProperty(window, 'location', { + value: location as unknown as Location, + writable: true, + }); + + jest.spyOn(window.location, 'pathname', 'get').mockReturnValue(location.pathname); + + const result = projectIdfromUrl(); + + expect(result).toBe(value); + }); + + it('returns an empty string if no id is in the URL', () => { + const location = new URL(`https://example.com/console/someotherlink/value/`); + + Object.defineProperty(window, 'location', { + value: location as unknown as Location, + writable: true, + }); + + jest.spyOn(window.location, 'pathname', 'get').mockReturnValue(location.pathname); + + const result = projectIdfromUrl(); + + expect(result).toBe(''); + }); +}); diff --git a/packages/oss-console/src/components/Breadcrumbs/components/BreadcrumbFormControl.tsx b/packages/oss-console/src/components/Breadcrumbs/components/BreadcrumbFormControl.tsx new file mode 100644 index 000000000..3459375fb --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/components/BreadcrumbFormControl.tsx @@ -0,0 +1,295 @@ +import React, { forwardRef, useMemo, useState } from 'react'; +import Button from '@mui/material/Button'; +import Grid from '@mui/material/Grid'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import Typography from '@mui/material/Typography'; +import ArrowDropDown from '@mui/icons-material/ArrowDropDown'; +import { useHistory } from 'react-router'; +import isEmpty from 'lodash/isEmpty'; +import { useQuery } from 'react-query'; +import styled from '@mui/system/styled'; +import { Link } from 'react-router-dom'; +import { useCommonStyles } from '@clients/theme/CommonStyles/CommonStyles'; +import { Instance } from '@popperjs/core'; +import { Shimmer } from '@clients/primitives/Shimmer'; +import { + LOCAL_PROJECT_DOMAIN, + LocalStorageProjectDomain, + setLocalStore, +} from '../../common/LocalStoreDefaults'; +import { BreadcrumbFormControlInterfaceUI } from '../types'; +import BreadcrumbPopOver from './BreadcrumbPopover'; +import { breadcrumQueryOptions } from '../async/utils'; + +interface StyledBreadcrumbFormControlInterfaceUI extends BreadcrumbFormControlInterfaceUI { + className?: string; +} + +const StyledWrapper = styled('div')( + ({ theme, asyncSelfLink, selfLink }) => ({ + width: '100%', + '& .breadcrumb-form-control-input': { + cursor: selfLink || asyncSelfLink ? 'pointer' : 'default', + color: theme.palette.text.primary, + '& *': { + cursor: selfLink || asyncSelfLink ? 'pointer' : 'default', + }, + }, + '& button': { + fontWeight: 500, + }, + '& h1': { + margin: 0, + fontSize: 24, + }, + '& .noWrap': { + flexWrap: 'nowrap', + }, + }), +) as React.ComponentType; + +/** + * This component is a wrapper to facilitate user interaction using MUI components. + * It is used to render a breadcrumb with a popover. + * + * These are used in the Breadcrumbs component. + */ +const BreadcrumbFormControlDefault = (props: BreadcrumbFormControlInterfaceUI) => { + const history = useHistory(); + const htmlLabel = `breadcrumb-${props.id}`; + const [anchorEl, setAnchorEl] = useState(null); + const handlePopoverClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handlePopoverClose = () => { + setAnchorEl(null); + }; + + const commonStyles = useCommonStyles(); + + const { data: queryAsyncValueData } = useQuery( + `breadcrumb-selfasync-${props.id}-${props.value}`, + async () => { + if (!props.asyncValue) return ''; + return props.asyncValue(window.location, props); + }, + breadcrumQueryOptions, + ); + const asyncValueData: string = useMemo(() => { + if (isEmpty(queryAsyncValueData) || queryAsyncValueData === undefined) return ''; + return queryAsyncValueData; + }, [queryAsyncValueData]); + + const { data: queryAsyncSelfLinkData } = useQuery( + `breadcrumb-selflinkasync-${props.id}-${props.value}`, + async () => { + if (!props.asyncSelfLink) return ''; + return props.asyncSelfLink(window.location, props); + }, + breadcrumQueryOptions, + ); + const asyncSelfLinkData: string = useMemo(() => { + if (isEmpty(queryAsyncSelfLinkData) && queryAsyncSelfLinkData === undefined) return ''; + return `${queryAsyncSelfLinkData}`; + }, [queryAsyncSelfLinkData]); + + const handleValueClick = (e) => { + const isDisabled = !(props.selfLink || props.asyncSelfLink); + if (isDisabled || !e?.nativeEvent?.metaKey) { + e.preventDefault(); + } + e.stopPropagation(); + + // project/domain values comes from the url segment + const projectValue = props.id.startsWith('project') ? props.value : props.projectId; + const domainValue = props.id.startsWith('domain') ? props.value : props.domainId; + + const projectDomain: LocalStorageProjectDomain = { + project: projectValue, + domain: domainValue, + }; + + setLocalStore(LOCAL_PROJECT_DOMAIN, projectDomain); + + if (!e?.nativeEvent?.metaKey) { + if (props.selfLink || props.asyncSelfLink) { + if (asyncSelfLinkData?.length) { + history.push(asyncSelfLinkData); + } else if (typeof props.selfLink === 'function') { + history.push(props.selfLink(window.location, props)); + } else { + history.push(props.selfLink); + } + } + } + }; + + const isMoreButtonHidden = !props.asyncData && props.viewAllLink === ''; + + const value = useMemo( + () => (!props.asyncValue ? ((props.value || props.defaultValue) as string) : asyncValueData), + [props.asyncValue, props.value, props.defaultValue, asyncValueData], + ); + + const selfLinkHref = useMemo(() => { + if (props.asyncData || asyncSelfLinkData) { + return asyncSelfLinkData; + } + if (typeof props.selfLink === 'function') { + return props.selfLink(window.location, props); + } + return props.selfLink; + }, [props.selfLink, props.projectId, props.domainId, props.asyncData, asyncSelfLinkData]); + + const areaRef = React.useRef(null); + const positionRef = React.useRef<{ x: number; y: number }>({ + x: 0, + y: 0, + }); + const popperRef = React.useRef(null); + const handleMouseMove = (event: React.MouseEvent) => { + positionRef.current = { x: event.clientX, y: event.clientY }; + + if (popperRef.current != null) { + popperRef.current.update(); + } + }; + + return ( + + + + { + return new DOMRect( + positionRef.current.x, + areaRef.current!.getBoundingClientRect().y + 20, + 0, + 0, + ); + }, + }, + }} + > + {props.variant !== 'title' ? ( + + ) : ( + { + if (e.key === 'Enter') { + handleValueClick(e); + } + }} + > + {value} + + )} + + + + {!isMoreButtonHidden ? ( + + + + ) : ( + + + + )} + + + + {!!anchorEl && ( + + )} + + ); +}; + +/** + * This component is a wrapper to facilitate user interaction using MUI components. + * It is used to render a breadcrumb with a popover. + * + * These are used in the Breadcrumbs component. + */ +const BreadcrumbFormControl = (props: BreadcrumbFormControlInterfaceUI) => { + const { customComponent: CustomComponent } = props; + if (CustomComponent) { + return ( + + + + ); + } + return ; +}; + +export default BreadcrumbFormControl; diff --git a/packages/console/src/components/Breadcrumbs/components/BreadcrumbPopover.tsx b/packages/oss-console/src/components/Breadcrumbs/components/BreadcrumbPopover.tsx similarity index 60% rename from packages/console/src/components/Breadcrumbs/components/BreadcrumbPopover.tsx rename to packages/oss-console/src/components/Breadcrumbs/components/BreadcrumbPopover.tsx index b4400a92d..6a217bc91 100644 --- a/packages/console/src/components/Breadcrumbs/components/BreadcrumbPopover.tsx +++ b/packages/oss-console/src/components/Breadcrumbs/components/BreadcrumbPopover.tsx @@ -1,27 +1,45 @@ -import React, { useMemo } from 'react'; +import React, { forwardRef, useMemo } from 'react'; import { useQuery, useQueryClient } from 'react-query'; import isEmpty from 'lodash/isEmpty'; -import { - Box, - Button, - Grid, - Icon, - List, - ListItem, - Popover, - Typography, - makeStyles, -} from '@material-ui/core'; +import Box from '@mui/material/Box'; +import Grid from '@mui/material/Grid'; +import Icon from '@mui/material/Icon'; +import List from '@mui/material/List'; +import ListItemButton from '@mui/material/ListItemButton'; +import Popover from '@mui/material/Popover'; +import Typography from '@mui/material/Typography'; +import { useHistory } from 'react-router'; +import Check from '@mui/icons-material/Check'; +import InsertLinkOutlined from '@mui/icons-material/InsertLinkOutlined'; +import styled from '@mui/system/styled'; +import { Link } from 'react-router-dom'; +import { LoadingSpinner } from '@clients/primitives/LoadingSpinner'; import { LOCAL_PROJECT_DOMAIN, - LoadingSpinner, LocalStorageProjectDomain, setLocalStore, -} from 'components/common'; -import { useHistory } from 'react-router'; -import { Check, InsertLinkOutlined } from '@material-ui/icons'; +} from '../../common/LocalStoreDefaults'; import { BreadcrumbEntity, BreadcrumbPopoverInterface } from '../types'; import { defaultVoid } from '../async/fn'; +import { breadcrumQueryOptions } from '../async/utils'; + +const StyledPopover = styled(Popover)(({ theme }) => ({ + '& a': { + color: theme.palette.text.primary, + fontWeight: 500, + // no text line break css + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }, + '& button': { + color: theme.palette.text.primary, + fontWeight: 500, + }, + '.noWrap': { + flexWrap: 'nowrap', + }, +})); const BreadcrumbPopOver = (props: BreadcrumbPopoverInterface) => { const history = useHistory(); @@ -31,17 +49,12 @@ const BreadcrumbPopOver = (props: BreadcrumbPopoverInterface) => { isLoading, error, data: popoverQueryData, - } = useQuery( - `breadcrumb-list-${props.id}-${props.value}`, - () => { - return !props.asyncData - ? defaultVoid(window.location, props) - : props.asyncData(window.location, props); - }, - { - refetchOnMount: true, - }, - ); + } = useQuery(`breadcrumb-list-${props.id}-${props.value}`, () => { + return !props.asyncData + ? defaultVoid(window.location, props) + : props.asyncData(window.location, props); + }); + const popoverData: BreadcrumbEntity[] = useMemo(() => { if (isEmpty(popoverQueryData) || popoverQueryData === undefined) return []; return popoverQueryData; @@ -57,9 +70,7 @@ const BreadcrumbPopOver = (props: BreadcrumbPopoverInterface) => { if (!props.asyncViewAllLink) return ''; return props.asyncViewAllLink(window.location, props); }, - { - refetchOnMount: true, - }, + breadcrumQueryOptions, ); const viewAllLinkData: string = useMemo(() => { if (isEmpty(viewAllQueryData) || viewAllQueryData === undefined) return ''; @@ -75,13 +86,7 @@ const BreadcrumbPopOver = (props: BreadcrumbPopoverInterface) => { : props.viewAllLink(props.projectId, props.domainId, window.location); } return viewAllLinkData; - }, [ - props.viewAllLink, - props.projectId, - props.domainId, - window.location, - viewAllLinkData, - ]); + }, [props.viewAllLink, props.projectId, props.domainId, window.location, viewAllLinkData]); const dataToShow = useMemo(() => { const shouldFilter = popoverData.length > 5; @@ -91,19 +96,18 @@ const BreadcrumbPopOver = (props: BreadcrumbPopoverInterface) => { /** * Handle the callback to close the popover and navigate to the url */ - const handleLink = (e, url: string, title: string, isActive = false) => { - e.preventDefault(); + const handleLink = (e, url: string, title: string, id?: string, isActive = false) => { + if (!e?.nativeEvent?.metaKey) { + e.preventDefault(); + } e.stopPropagation(); // view all link has no title prop - if (title) { - const projectValue = props.id.startsWith('project') - ? title - : props.projectId; + // only project and domain have id + if (title && id !== undefined) { + const projectValue = props.id.startsWith('project') && id ? id : props.projectId; - const domainValue = props.id.startsWith('domain') - ? title - : props.domainId; + const domainValue = props.id.startsWith('domain') && id ? id : props.domainId; const projectDomain: LocalStorageProjectDomain = { project: projectValue, @@ -113,37 +117,17 @@ const BreadcrumbPopOver = (props: BreadcrumbPopoverInterface) => { } if (!isActive) { - history.push(url); - props.onClose(); - queryClient.invalidateQueries(['breadcrumb-view-all']); - return; + if (!e?.nativeEvent?.metaKey) { + history.push(url); + props.onClose(); + queryClient.invalidateQueries(['breadcrumb-view-all']); + } } }; - const styles = makeStyles(theme => ({ - wrapper: { - '& a': { - color: theme.palette.text.primary, - fontWeight: 500, - // no text line break css - whiteSpace: 'nowrap', - overflow: 'hidden', - textOverflow: 'ellipsis', - }, - '& button': { - color: theme.palette.text.primary, - fontWeight: 500, - }, - }, - - noWrap: { - flexWrap: 'nowrap', - }, - }))(); - return ( - { )} - {error && {error}} + {error ? ( + {`Data unavailible, please try again. ${error}`} + ) : null} {!isLoading && !!dataToShow?.length && ( {dataToShow.length && - dataToShow.map(data => { + dataToShow.map((data) => { const activeBasedOnTitle = data.active === undefined && data.title.trim().toLocaleLowerCase() === props.value.trim().toLocaleLowerCase(); - const activeBasedOnAsyncData = - data?.active !== undefined && data.active; + const activeBasedOnAsyncData = data?.active !== undefined && data.active; return ( - { + onClick={(e) => { handleLink( e, data.url, data.title, + data.id, activeBasedOnTitle || activeBasedOnAsyncData, ); }} + href={data.url} + LinkComponent={forwardRef((props, ref) => { + return ; + })} className={`breadcrumb-form-control-popover-list-item ${ - activeBasedOnTitle || activeBasedOnAsyncData - ? 'active' - : '' + activeBasedOnTitle || activeBasedOnAsyncData ? 'active' : '' }`} > - + {data.active === undefined && ( <> @@ -240,7 +222,7 @@ const BreadcrumbPopOver = (props: BreadcrumbPopoverInterface) => { )} - + ); })} @@ -248,46 +230,50 @@ const BreadcrumbPopOver = (props: BreadcrumbPopoverInterface) => { {viewAllLink && !props.asyncViewAllLink && ( - - - + + )} {!!props.asyncViewAllLink && ( - {viewAllQueryIsLoading && ( - - - - )} - {viewAllQueryError && ( - {error} - )} - {!viewAllQueryIsLoading && viewAllLink.length && ( - - - - )} + + )} + )} - + ); }; diff --git a/packages/console/src/components/Breadcrumbs/components/BreadcrumbTitleActions.tsx b/packages/oss-console/src/components/Breadcrumbs/components/BreadcrumbTitleActions.tsx similarity index 81% rename from packages/console/src/components/Breadcrumbs/components/BreadcrumbTitleActions.tsx rename to packages/oss-console/src/components/Breadcrumbs/components/BreadcrumbTitleActions.tsx index c030ce95f..12c27ffdc 100644 --- a/packages/console/src/components/Breadcrumbs/components/BreadcrumbTitleActions.tsx +++ b/packages/oss-console/src/components/Breadcrumbs/components/BreadcrumbTitleActions.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react'; -import { Grid } from '@material-ui/core'; +import Grid from '@mui/material/Grid'; import { createPortal } from 'react-dom'; -import { FeatureFlag, useFeatureFlag } from 'basics/FeatureFlags'; /** * This component is used to render a portal for the breadcrumb title actions. @@ -12,7 +11,7 @@ import { FeatureFlag, useFeatureFlag } from 'basics/FeatureFlags'; */ const BreadcrumbTitleActionsPortal = () => { return ( - + @@ -38,10 +37,6 @@ const BreadcrumbTitleActions = ({ children = <> }) => { } }, [portalRef]); - const isBreadcrumbFlag = useFeatureFlag(FeatureFlag.breadcrumbs); - - if (!isBreadcrumbFlag) return <>{children}; - if (!portalRef) return <>; return <>{createPortal(<>{children}, portalRef)}; }; diff --git a/packages/console/src/components/Breadcrumbs/components/Breadcrumbs.tsx b/packages/oss-console/src/components/Breadcrumbs/components/Breadcrumbs.tsx similarity index 60% rename from packages/console/src/components/Breadcrumbs/components/Breadcrumbs.tsx rename to packages/oss-console/src/components/Breadcrumbs/components/Breadcrumbs.tsx index 40561afed..91321b4d6 100644 --- a/packages/console/src/components/Breadcrumbs/components/Breadcrumbs.tsx +++ b/packages/oss-console/src/components/Breadcrumbs/components/Breadcrumbs.tsx @@ -1,69 +1,58 @@ import React, { useEffect, useMemo, useState } from 'react'; -import { listProjects } from 'models/Project/api'; -import { useQuery } from 'react-query'; import { useLocation, useParams } from 'react-router-dom'; -import { Grid, makeStyles } from '@material-ui/core'; -import { useExternalConfigurationContext } from 'basics/ExternalConfigurationProvider'; +import Grid from '@mui/material/Grid'; import get from 'lodash/get'; +import styled from '@mui/system/styled'; import { LOCAL_PROJECT_DOMAIN, LocalStorageProjectDomain, getLocalStore, -} from 'components/common'; +} from '../../common/LocalStoreDefaults'; import { Breadcrumb, BreadcrumbFormControlInterface } from '../types'; import { breadcrumbRegistry } from '../registry'; import BreadcrumbFormControl from './BreadcrumbFormControl'; import { domainIdfromUrl, projectIdfromUrl } from '../async/utils'; import { BreadcrumbTitleActionsPortal } from './BreadcrumbTitleActions'; +import { useProjects } from '../../hooks/useProjects'; + +const BreadcrumbContainer = styled(Grid)(({ theme }) => ({ + padding: theme.spacing(1, 2, 2, 2), +})); /** * Top level Breadcumb component used to kick off the breadcrumb rendering. * The system will look for a registry and compare it to the URL to see if there are any custom breadcrumbs. * * The project and domain ids are pulled from the URL as well as the window.location object. - * - * Depends on useExternalConfigurationContext for external configuration. - * See `flyteBreadcrumbRegistryList` for example usage. */ const BreadCrumbs = () => { const routerLocation = useLocation(); - const routerParams = useParams(); - const projectDomain = getLocalStore( - LOCAL_PROJECT_DOMAIN, - ) as LocalStorageProjectDomain; - + // TODO: fix typing + const routerParams = useParams(); + const projectDomain = getLocalStore(LOCAL_PROJECT_DOMAIN) as LocalStorageProjectDomain; + // rebuild when page changes + const [breadcrumbs, setBreadcrumbs] = useState([]); + const [breadcrumbsHash, setBreadcrumbsHash] = useState(''); const currentProjectId = - routerParams['projectId']?.trim() || - projectIdfromUrl() || - projectDomain?.project || - ''; + routerParams.projectId?.trim() || projectIdfromUrl() || projectDomain?.project || ''; - const projectQuery = useQuery('projects', () => listProjects()); - const projectData = useMemo(() => { - return !projectQuery.isLoading && projectQuery.data - ? projectQuery.data - : []; - }, [projectQuery.data, projectQuery.isLoading]); + const { data: projectData } = useProjects(); const currentDomainId = useMemo(() => { - const id = - routerParams['domainId'] || - domainIdfromUrl(window.location) || - projectDomain?.domain; + const id = routerParams.domainId || domainIdfromUrl(window.location) || projectDomain?.domain; if (id) return id; // get the first domain id from the project if (projectData?.length) { - const currentProject = projectData.find(p => p.id === currentProjectId); + const currentProject = projectData.find((p) => p.id === currentProjectId); if (currentProject) { return `${get(currentProject, 'domains[0].id')}` || ''; - } else { - return ''; } + return ''; } return ''; }, [ - routerParams['domainId'], + routerParams.domainId, routerLocation.search, projectData, projectData?.length, @@ -71,26 +60,14 @@ const BreadCrumbs = () => { projectDomain?.domain, ]); - // load from user provided registry for custom breadcrumb handling - const { registry } = useExternalConfigurationContext(); - useEffect(() => { - const breadcrumbs: Breadcrumb[] = registry?.breadcrumbs || []; - if (breadcrumbs?.length) { - for (let i = 0; i < breadcrumbs.length; i++) { - const breadcrumb = breadcrumbs[i]; - breadcrumbRegistry.addBreadcrumbSeed(breadcrumb); - } - } - }, [registry?.breadcrumbs]); - // respond to custom event hook useEffect(() => { - const listener = e => { + const listener = (e) => { if (e.detail?.breadcrumb) { const breadcrumb = e.detail?.breadcrumb as Breadcrumb; breadcrumbRegistry.addBreadcrumbSeed(breadcrumb); const val = breadcrumbRegistry.breadcrumbBuilder({ - location, + location: window.location, projectId: currentProjectId, domainId: currentDomainId, }); @@ -102,12 +79,6 @@ const BreadCrumbs = () => { return () => window.removeEventListener('__FLYTE__BREADCRUMB__', listener); }, []); - // rebuild when page changes - const [breadcrumbs, setBreadcrumbs] = useState< - BreadcrumbFormControlInterface[] - >([]); - const [breadcrumbsHash, setBreadcrumbsHash] = useState(''); - useEffect(() => { const location = { ...window.location }; location.pathname = routerLocation.pathname; @@ -131,16 +102,7 @@ const BreadCrumbs = () => { breadcrumbRegistry.renderHash, ]); - const lastBreadcrumb = useMemo( - () => breadcrumbs[breadcrumbs.length - 1], - [breadcrumbsHash], - ); - - const styles = makeStyles(theme => ({ - breadcrumbContainer: { - padding: theme.spacing(1, 2, 2, 2), - }, - }))(); + const lastBreadcrumb = useMemo(() => breadcrumbs[breadcrumbs.length - 1], [breadcrumbsHash]); if (!breadcrumbs?.length) { return <>; @@ -150,7 +112,7 @@ const BreadCrumbs = () => { } return ( - + {breadcrumbs.map((breadcrumbValue, index) => { @@ -165,26 +127,22 @@ const BreadCrumbs = () => { {/* Current page content */} - - + + {lastBreadcrumb?.key && ( - + )} - + - + ); }; diff --git a/packages/oss-console/src/components/Breadcrumbs/components/breadcrumbGlobalStyles.tsx b/packages/oss-console/src/components/Breadcrumbs/components/breadcrumbGlobalStyles.tsx new file mode 100644 index 000000000..c4c2a6038 --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/components/breadcrumbGlobalStyles.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import GlobalStyles from '@mui/material/GlobalStyles'; +import { COLOR_SPECTRUM as ColorSpectrum } from '@clients/theme/CommonStyles/colorSpectrum'; + +export const BreadcrumbGlobalStyles = () => { + return ( + ({ + '.breadcrumbs': { + '& *': { + fontFamily: 'Mulish, Helvetica, Arial, sans-serif !important', + }, + '& h1': { + fontStyle: 'normal', + fontWeight: 500, + }, + '& .breadcrumbs-current-page-container .breadcrumb-form-control-more-button': { + marginLeft: '4px', + }, + '& .breadcrumb-form-control-more-button': { + width: '20px', + height: '20px', + borderRadius: '5px', + color: ColorSpectrum.indigo80.color, + '&:hover': { + border: `${ColorSpectrum.indigo80.color} 2px solid`, + '&:active': { + color: 'white', + background: ColorSpectrum.indigo80.color, + }, + }, + }, + '& .c--MuiTouchRipple-root': { + display: 'none', + }, + '& button': { + minWidth: '0', + }, + '& button.hidden': { + display: 'none', + }, + }, + // Global to accomidate targeting popover + '.breadcrumb-form-control-popover': { + '& .breadcrumb-form-control-popover-list-item': { + paddingTop: 0, + paddingBottom: 0, + '& .c--MuiTouchRipple-root': { + display: 'none', + }, + }, + '& a': { + fontFamily: 'Mulish, Helvetica, Arial, sans-serif !important', + fontWeight: '400 !important', + }, + '& button': { + fontFamily: 'Mulish, Helvetica, Arial, sans-serif !important', + fontWeight: '400 !important', + }, + }, + })} + /> + ); +}; diff --git a/packages/oss-console/src/components/Breadcrumbs/components/tlmAsyncFns.tsx b/packages/oss-console/src/components/Breadcrumbs/components/tlmAsyncFns.tsx new file mode 100644 index 000000000..4da53959a --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/components/tlmAsyncFns.tsx @@ -0,0 +1,11 @@ +export const tlmAttemptSelfValue = (location: Location) => { + const segments = location.pathname.split('/'); + const attemptIndex = segments.findIndex((segment) => segment === 'attempt'); + + if (attemptIndex === -1) { + return ''; + } + + const attempt = segments[attemptIndex + 1]; + return `${(parseInt(attempt || '0', 10) || 0) + 1}`.padStart(2, '0'); +}; diff --git a/packages/console/src/components/Breadcrumbs/defaultValue/default.ts b/packages/oss-console/src/components/Breadcrumbs/defaultValue/default.ts similarity index 100% rename from packages/console/src/components/Breadcrumbs/defaultValue/default.ts rename to packages/oss-console/src/components/Breadcrumbs/defaultValue/default.ts diff --git a/packages/console/src/components/Breadcrumbs/defaultValue/index.ts b/packages/oss-console/src/components/Breadcrumbs/defaultValue/index.ts similarity index 100% rename from packages/console/src/components/Breadcrumbs/defaultValue/index.ts rename to packages/oss-console/src/components/Breadcrumbs/defaultValue/index.ts diff --git a/packages/console/src/components/Breadcrumbs/defaultValue/namedEntities.test.ts b/packages/oss-console/src/components/Breadcrumbs/defaultValue/namedEntities.test.ts similarity index 91% rename from packages/console/src/components/Breadcrumbs/defaultValue/namedEntities.test.ts rename to packages/oss-console/src/components/Breadcrumbs/defaultValue/namedEntities.test.ts index b58378e56..79148b69a 100644 --- a/packages/console/src/components/Breadcrumbs/defaultValue/namedEntities.test.ts +++ b/packages/oss-console/src/components/Breadcrumbs/defaultValue/namedEntities.test.ts @@ -4,8 +4,7 @@ import { namedEntitiesDefaultValue } from './namedEntities'; describe('namedEntitiesDefaultValue', () => { it('returns the correct default value launch plan', () => { const location = { - pathname: - 'project/projectId/domain/domainId/launch_plan/entityId/versions/versionId', + pathname: 'project/projectId/domain/domainId/launch_plan/entityId/versions/versionId', } as Location; const breadcrumb = {} as Breadcrumb; diff --git a/packages/console/src/components/Breadcrumbs/defaultValue/namedEntities.ts b/packages/oss-console/src/components/Breadcrumbs/defaultValue/namedEntities.ts similarity index 70% rename from packages/console/src/components/Breadcrumbs/defaultValue/namedEntities.ts rename to packages/oss-console/src/components/Breadcrumbs/defaultValue/namedEntities.ts index 33adc1325..5c2cff974 100644 --- a/packages/console/src/components/Breadcrumbs/defaultValue/namedEntities.ts +++ b/packages/oss-console/src/components/Breadcrumbs/defaultValue/namedEntities.ts @@ -1,6 +1,6 @@ import camelCase from 'lodash/camelCase'; import startCase from 'lodash/startCase'; -import { Routes } from 'routes'; +import { Routes } from '../../../routes/routes'; import { Breadcrumb, BreadcrumbEntity } from '../types'; import { namedEntitiesUrlSegments } from '../validators'; @@ -29,10 +29,7 @@ export const namedEntitiesList = (projectId = '', domainId = '') => { const launchPlans = { title: 'Launch Plans', createdAt: '', - url: Routes.ProjectDetails.sections.launchPlans.makeUrl( - projectId, - domainId, - ), + url: Routes.ProjectDetails.sections.launchPlans.makeUrl(projectId, domainId), }; return [executions, workflow, task, launchPlans]; @@ -48,24 +45,17 @@ export const namedEntitiesList = (projectId = '', domainId = '') => { * @example * /launch_plan/ => Launch Plans */ -export const namedEntitiesDefaultValue = ( - location: Location, - _breadcrumb: Breadcrumb, -) => { +export const namedEntitiesDefaultValue = (location: Location, _breadcrumb: Breadcrumb) => { const segments = location.pathname.split('/'); const namedEntitySegment = - namedEntitiesUrlSegments.find(e => segments.find(s => s === e)) || ''; + namedEntitiesUrlSegments.find((e) => segments.find((s) => s === e)) || ''; const normalizedNamedEntitySegment = namedEntitySegment.endsWith('s') ? camelCase(namedEntitySegment) : `${camelCase(namedEntitySegment)}s`; - const namedEntitiesBreadcumbPopOverList: BreadcrumbEntity[] = - namedEntitiesList('', ''); - const titles = namedEntitiesBreadcumbPopOverList.map(entity => - camelCase(entity.title), - ); - const entity = - titles.find(title => title === normalizedNamedEntitySegment) || ''; + const namedEntitiesBreadcumbPopOverList: BreadcrumbEntity[] = namedEntitiesList('', ''); + const titles = namedEntitiesBreadcumbPopOverList.map((entity) => camelCase(entity.title)); + const entity = titles.find((title) => title === normalizedNamedEntitySegment) || ''; return startCase(entity); }; diff --git a/packages/oss-console/src/components/Breadcrumbs/hooks/index.tsx b/packages/oss-console/src/components/Breadcrumbs/hooks/index.tsx new file mode 100644 index 000000000..e9668d104 --- /dev/null +++ b/packages/oss-console/src/components/Breadcrumbs/hooks/index.tsx @@ -0,0 +1,33 @@ +import { useEffect, useState } from 'react'; + +/** + * Turns the breadcrumb into the title bar variant. + * @param customStyles + */ +export const useBreadCrumbsGreyStyle = () => { + const breadcrumbBackground = `.breadcrumbs { + transition: background-color 0.2s ease-in-out; + background-color: #F2F3F3; + border-bottom: 1px solid lightgrey; + }`; + + const [id] = useState(`data-breadcrumb-temp-${Date.now().toString()}`); + + useEffect(() => { + // make a new style tag in the head with js + const style = document.createElement('style'); + style.innerHTML = breadcrumbBackground; + style.setAttribute('type', 'text/css'); + style.setAttribute(id, 'true'); + document.head.appendChild(style); + + return () => { + // remove global css sheet with matching comment text + [...document.querySelectorAll('style')] + .filter((s) => s.outerHTML.includes(id)) + .forEach((s) => { + s.remove(); + }); + }; + }, [window.location.pathname, id]); +}; diff --git a/packages/console/src/components/Breadcrumbs/registry/contextualDefaults.ts b/packages/oss-console/src/components/Breadcrumbs/registry/contextualDefaults.ts similarity index 95% rename from packages/console/src/components/Breadcrumbs/registry/contextualDefaults.ts rename to packages/oss-console/src/components/Breadcrumbs/registry/contextualDefaults.ts index 6db19de7b..197c38468 100644 --- a/packages/console/src/components/Breadcrumbs/registry/contextualDefaults.ts +++ b/packages/oss-console/src/components/Breadcrumbs/registry/contextualDefaults.ts @@ -1,4 +1,4 @@ -import { Routes } from 'routes'; +import { Routes } from '../../../routes/routes'; import { domains, namedEntities, projects } from '../async/fn'; import { launchPlanSelfLink, @@ -11,10 +11,7 @@ import { import { Breadcrumb } from '../types'; import { makeBreadcrumb } from './utils'; import { namedEntitiesDefaultValue } from '../defaultValue'; -import { - executionsValidatorEmpty, - namedEntitiesValidatorExecutionsEmpty, -} from '../validators'; +import { executionsValidatorEmpty, namedEntitiesValidatorExecutionsEmpty } from '../validators'; import { executionTaskWorkflowVersions, executionTaskWorkflowViewAll, diff --git a/packages/console/src/components/Breadcrumbs/registry/default.ts b/packages/oss-console/src/components/Breadcrumbs/registry/default.ts similarity index 100% rename from packages/console/src/components/Breadcrumbs/registry/default.ts rename to packages/oss-console/src/components/Breadcrumbs/registry/default.ts diff --git a/packages/console/src/components/Breadcrumbs/registry/index.ts b/packages/oss-console/src/components/Breadcrumbs/registry/index.ts similarity index 80% rename from packages/console/src/components/Breadcrumbs/registry/index.ts rename to packages/oss-console/src/components/Breadcrumbs/registry/index.ts index 19fffb954..386a3e07c 100644 --- a/packages/console/src/components/Breadcrumbs/registry/index.ts +++ b/packages/oss-console/src/components/Breadcrumbs/registry/index.ts @@ -1,10 +1,7 @@ -import { isEmpty, mergeWith } from 'lodash'; +import isEmpty from 'lodash/isEmpty'; +import mergeWith from 'lodash/mergeWith'; import startCase from 'lodash/startCase'; -import { - Breadcrumb, - BreadcrumbFormControlInterface, - BreadcrumbValidatorInterface, -} from '../types'; +import { Breadcrumb, BreadcrumbFormControlInterface, BreadcrumbValidatorInterface } from '../types'; import { flyteBreadcrumbRegistryList } from './default'; import { defaultVoid } from '../async/fn'; import { makeBreadcrumb } from './utils'; @@ -44,23 +41,21 @@ export class BreadcrumbRegistry { /** * Hash of breadcrumb ids to be used as a key for rendering */ + // eslint-disable-next-line no-underscore-dangle private _makeRenderHash() { - this.renderHash = - this.breadcrumbs - .map(b => { - return Object.keys(b) - .map(k => b[k]) - .join(','); - }) - .join(',') + - '|' + - this.breadcrumbSeeds - .map(b => { - return Object.keys(b) - .map(k => b[k]) - .join(','); - }) - .join(','); + this.renderHash = `${this.breadcrumbs + .map((b) => { + return Object.keys(b) + .map((k) => b[k]) + .join(','); + }) + .join(',')}|${this.breadcrumbSeeds + .map((b) => { + return Object.keys(b) + .map((k) => b[k]) + .join(','); + }) + .join(',')}`; } /** @@ -73,26 +68,20 @@ export class BreadcrumbRegistry { */ public addBreadcrumbSeed(breadcrumb: Partial) { const breadcrumbData = makeBreadcrumb(breadcrumb); - const existingBreadcrumbIndex = this.breadcrumbSeeds.findIndex( - b => b.id === breadcrumb.id, - ); + const existingBreadcrumbIndex = this.breadcrumbSeeds.findIndex((b) => b.id === breadcrumb.id); if (existingBreadcrumbIndex > -1) { const existingBreadcrumb = this.breadcrumbSeeds[existingBreadcrumbIndex]; - const newBreadcrumb = mergeWith( - existingBreadcrumb, - breadcrumbData, - (exVal, newVal) => { - if (typeof newVal === 'function') { - return newVal.name !== defaultVoid.name ? newVal : exVal; - } - if (isEmpty(newVal)) { - return exVal; - } - return newVal; - }, - ); + const newBreadcrumb = mergeWith(existingBreadcrumb, breadcrumbData, (exVal, newVal) => { + if (typeof newVal === 'function') { + return newVal.name !== defaultVoid.name ? newVal : exVal; + } + if (isEmpty(newVal)) { + return exVal; + } + return newVal; + }); this.breadcrumbSeeds[existingBreadcrumbIndex] = newBreadcrumb; this._makeRenderHash(); @@ -105,7 +94,7 @@ export class BreadcrumbRegistry { } public addBreadcrumbController(breadcrumb: BreadcrumbFormControlInterface) { - const knownIndex = this.breadcrumbs.findIndex(b => b.id === breadcrumb.id); + const knownIndex = this.breadcrumbs.findIndex((b) => b.id === breadcrumb.id); if (knownIndex > -1) { this.breadcrumbs[knownIndex] = breadcrumb; } else { @@ -121,7 +110,7 @@ export class BreadcrumbRegistry { // Remove first occurence of base path const pathNameWithoutBasePath = pathName.replace(basePath, ''); - const pathFragments = pathNameWithoutBasePath.split('/').filter(f => !!f); + const pathFragments = pathNameWithoutBasePath.split('/').filter((f) => !!f); // These must always be visible // Core routing UX depends on them @@ -137,7 +126,7 @@ export class BreadcrumbRegistry { const values: Record = {}; - for (let i = 0; i < pathFragments.length; i = i + 2) { + for (let i = 0; i < pathFragments.length; i += 2) { const key = decodeURIComponent(pathFragments[i] || ''); const value = decodeURIComponent(pathFragments[i + 1] || ''); values[key] = value || startCase(key); @@ -145,13 +134,11 @@ export class BreadcrumbRegistry { // required segments, always visible breadcrumbRegistry.breadcrumbSeeds - .filter(b => b.required) - .forEach(b => { + .filter((b) => b.required) + .forEach((b) => { if (!values[b.id]) { const value = - typeof b.defaultValue === 'function' - ? b.defaultValue(location, b) - : b.defaultValue; + typeof b.defaultValue === 'function' ? b.defaultValue(location, b) : b.defaultValue; values[b.id] = value || ''; } }); @@ -201,13 +188,13 @@ export class BreadcrumbRegistry { const nextPathSegment = pathFragments[i + 2] || ''; const currentPathValue = pathEntries[pathFragment] || ''; - const seeds = this.breadcrumbSeeds.filter(seed => { + const seeds = this.breadcrumbSeeds.filter((seed) => { const targetBreadcrumbId = seed.id; const validator: BreadcrumbValidatorInterface = { targetBreadcrumbId, currentPathSegment: pathFragment, - currentPathValue: currentPathValue, + currentPathValue, prevPathSegment, nextPathSegment, url, @@ -239,9 +226,7 @@ export class BreadcrumbRegistry { const controller: BreadcrumbFormControlInterface = { ...breadcrumb, value, - key: `breadcrumb-controller-${breadcrumb.id}-${ - value || breadcrumb.defaultValue - }`, + key: `breadcrumb-controller-${breadcrumb.id}-${value || breadcrumb.defaultValue}`, projectId, domainId, }; diff --git a/packages/console/src/components/Breadcrumbs/registry/semanticDefaults.ts b/packages/oss-console/src/components/Breadcrumbs/registry/semanticDefaults.ts similarity index 94% rename from packages/console/src/components/Breadcrumbs/registry/semanticDefaults.ts rename to packages/oss-console/src/components/Breadcrumbs/registry/semanticDefaults.ts index 696c108a1..29d78c8ce 100644 --- a/packages/console/src/components/Breadcrumbs/registry/semanticDefaults.ts +++ b/packages/oss-console/src/components/Breadcrumbs/registry/semanticDefaults.ts @@ -1,4 +1,4 @@ -import { Routes } from 'routes'; +import { Routes } from '../../../routes/routes'; import { domains, launchPlans, @@ -8,12 +8,7 @@ import { tasks, workflows, } from '../async/fn'; -import { - launchPlanSelfLink, - projectSelfLink, - taskSelfLink, - workflowSelfLink, -} from '../selfLinks'; +import { launchPlanSelfLink, projectSelfLink, taskSelfLink, workflowSelfLink } from '../selfLinks'; import { Breadcrumb } from '../types'; import { makeBreadcrumb } from './utils'; import { namedEntitiesDefaultValue } from '../defaultValue'; diff --git a/packages/console/src/components/Breadcrumbs/registry/utils.ts b/packages/oss-console/src/components/Breadcrumbs/registry/utils.ts similarity index 94% rename from packages/console/src/components/Breadcrumbs/registry/utils.ts rename to packages/oss-console/src/components/Breadcrumbs/registry/utils.ts index acb95d8e4..817d80174 100644 --- a/packages/console/src/components/Breadcrumbs/registry/utils.ts +++ b/packages/oss-console/src/components/Breadcrumbs/registry/utils.ts @@ -5,7 +5,7 @@ import { breadcrumbDefaultvalidator } from '../validators'; const defaultBreadcrumb: Breadcrumb = { id: 'default', label: '', - defaultValue: defaultValue, + defaultValue, selfLink: '', asyncData: undefined, validator: breadcrumbDefaultvalidator, diff --git a/packages/console/src/components/Breadcrumbs/selfLinks/index.ts b/packages/oss-console/src/components/Breadcrumbs/selfLinks/index.ts similarity index 81% rename from packages/console/src/components/Breadcrumbs/selfLinks/index.ts rename to packages/oss-console/src/components/Breadcrumbs/selfLinks/index.ts index a9dd5fb94..e4901f07c 100644 --- a/packages/console/src/components/Breadcrumbs/selfLinks/index.ts +++ b/packages/oss-console/src/components/Breadcrumbs/selfLinks/index.ts @@ -1,5 +1,5 @@ import camelCase from 'lodash/camelCase'; -import { Routes } from 'routes'; +import { Routes } from '../../../routes/routes'; import { BreadcrumbFormControlInterface } from '../types'; import { namedEntitiesDefaultValue, namedEntitiesList } from '../defaultValue'; import { executonNamedEntityAsyncValue } from '../async/executionContext'; @@ -28,10 +28,7 @@ export const launchPlanSelfLink = ( return Routes.LaunchPlanDetails.makeUrl(projectId, domainId, value); }; -export const taskSelfLink = ( - _location: Location, - breadcrumb: BreadcrumbFormControlInterface, -) => { +export const taskSelfLink = (_location: Location, breadcrumb: BreadcrumbFormControlInterface) => { const { projectId, domainId, value } = breadcrumb; return Routes.TaskDetails.makeUrl(projectId, domainId, value); }; @@ -43,9 +40,7 @@ export const namedEntitiesSelfLink = async ( const { projectId, domainId } = breadcrumb; const key = camelCase(namedEntitiesDefaultValue(location, breadcrumb)); const namedEntities = namedEntitiesList(projectId, domainId); - const entity = namedEntities.find(entity => - camelCase(entity.title).includes(key), - ); + const entity = namedEntities.find((entity) => camelCase(entity.title).includes(key)); return entity?.url || ''; }; @@ -55,15 +50,10 @@ export const namedEntitiesSelfLinkExecutions = async ( ) => { const { projectId, domainId } = breadcrumb; if (!breadcrumb.value || breadcrumb.value.toLowerCase() === 'executions') { - return Routes.ProjectDetails.sections.dashboard.makeUrl( - projectId, - domainId, - ); + return Routes.ProjectDetails.sections.dashboard.makeUrl(projectId, domainId); } const key = await executonNamedEntityAsyncValue(location, breadcrumb); const namedEntities = namedEntitiesList(projectId, domainId); - const entity = namedEntities.find(entity => - camelCase(entity.title).includes(key), - ); + const entity = namedEntities.find((entity) => camelCase(entity.title).includes(key)); return entity?.url || ''; }; diff --git a/packages/console/src/components/Breadcrumbs/types.ts b/packages/oss-console/src/components/Breadcrumbs/types.ts similarity index 89% rename from packages/console/src/components/Breadcrumbs/types.ts rename to packages/oss-console/src/components/Breadcrumbs/types.ts index 2a592bc37..4c77422c2 100644 --- a/packages/console/src/components/Breadcrumbs/types.ts +++ b/packages/oss-console/src/components/Breadcrumbs/types.ts @@ -1,3 +1,6 @@ +/* eslint-disable no-use-before-define */ +import React from 'react'; + /** * Used for defining the breadcrumbs. * This is used for the breadcrumb registry. @@ -68,9 +71,7 @@ export interface Breadcrumb { /** * The function used for controlling if a breadcrumb should be rednered or not. */ -export type BreadcrumbValidator = ( - validator: BreadcrumbValidatorInterface, -) => boolean; +export type BreadcrumbValidator = (validator: BreadcrumbValidatorInterface) => boolean; /** * The props used for controlling if a breadcrumb should be rednered or not. @@ -87,10 +88,7 @@ export interface BreadcrumbValidatorInterface { /** * The function used for defining the default value of a breadcrumb at runtime. */ -export type BreadcrumbCustomDefaultValue = ( - location: Location, - breadcrumb: Breadcrumb, -) => string; +export type BreadcrumbCustomDefaultValue = (location: Location, breadcrumb: Breadcrumb) => string; /** * The function used for fetching the value of a breadcrumb at runtime. @@ -115,6 +113,7 @@ export interface BreadcrumbEntity { url: string; title: string; createdAt: string; + id?: string; // used where entity name and id are different active?: boolean; } @@ -147,18 +146,14 @@ export type BreadcrumbAsyncViewAllLink = ( */ export type BreadcrumbEntitySelfLink = | string - | (( - location: Location, - breadcrumb: BreadcrumbFormControlInterface, - ) => string); + | ((location: Location, breadcrumb: BreadcrumbFormControlInterface) => string); export type BreadcrumbEntitySelfLinkAsync = ( location: Location, breadcrumb: BreadcrumbFormControlInterface, ) => Promise; -export interface BreadcrumbPopoverInterface - extends BreadcrumbFormControlInterface { +export interface BreadcrumbPopoverInterface extends BreadcrumbFormControlInterface { open: boolean; anchorEl: HTMLElement | null; onClose: () => void; @@ -178,8 +173,7 @@ export interface BreadcrumbFormControlInterface extends Breadcrumb { * The props used for rendering the breadcrumb list UI components. * Contains extra props for internal React rendering. */ -export interface BreadcrumbFormControlInterfaceUI - extends BreadcrumbFormControlInterface { +export interface BreadcrumbFormControlInterfaceUI extends BreadcrumbFormControlInterface { children?: any; variant?: 'title' | 'inline'; } diff --git a/packages/console/src/components/Breadcrumbs/validators/default.test.ts b/packages/oss-console/src/components/Breadcrumbs/validators/default.test.ts similarity index 100% rename from packages/console/src/components/Breadcrumbs/validators/default.test.ts rename to packages/oss-console/src/components/Breadcrumbs/validators/default.test.ts diff --git a/packages/console/src/components/Breadcrumbs/validators/default.ts b/packages/oss-console/src/components/Breadcrumbs/validators/default.ts similarity index 100% rename from packages/console/src/components/Breadcrumbs/validators/default.ts rename to packages/oss-console/src/components/Breadcrumbs/validators/default.ts diff --git a/packages/console/src/components/Breadcrumbs/validators/fn.ts b/packages/oss-console/src/components/Breadcrumbs/validators/fn.ts similarity index 83% rename from packages/console/src/components/Breadcrumbs/validators/fn.ts rename to packages/oss-console/src/components/Breadcrumbs/validators/fn.ts index f2359d463..0ee5d8f63 100644 --- a/packages/console/src/components/Breadcrumbs/validators/fn.ts +++ b/packages/oss-console/src/components/Breadcrumbs/validators/fn.ts @@ -4,13 +4,8 @@ import { BreadcrumbValidator, BreadcrumbValidatorInterface } from '../types'; /** * Single and plural variants of named entities */ -export const namedEntitiesUrlSegments = [ - 'workflow', - 'task', - 'launch_plan', - 'execution', -] - .map(s => [s, `${camelCase(s)}s`]) +export const namedEntitiesUrlSegments = ['workflow', 'task', 'launch_plan', 'execution'] + .map((s) => [s, `${camelCase(s)}s`]) .flat(); /** @@ -26,7 +21,7 @@ export const namedEntitiesValidator: BreadcrumbValidator = ( validator: BreadcrumbValidatorInterface, ) => { const segmentSingle = ['workflow', 'task', 'launch_plan']; - const segmentsPlural = segmentSingle.map(s => `${camelCase(s)}s`); + const segmentsPlural = segmentSingle.map((s) => `${camelCase(s)}s`); const segments = [...segmentSingle, ...segmentsPlural]; const prevSegment = ['projects', 'domains']; return ( @@ -38,9 +33,7 @@ export const namedEntitiesValidator: BreadcrumbValidator = ( export const namedEntitiesValidatorExecutionsEmpty: BreadcrumbValidator = ( validator: BreadcrumbValidatorInterface, ) => { - return ( - namedEntitiesValidator(validator) && !executionsValidatorEmpty(validator) - ); + return namedEntitiesValidator(validator) && !executionsValidatorEmpty(validator); }; export const executionsValidator: BreadcrumbValidator = ( diff --git a/packages/console/src/components/Breadcrumbs/validators/index.ts b/packages/oss-console/src/components/Breadcrumbs/validators/index.ts similarity index 100% rename from packages/console/src/components/Breadcrumbs/validators/index.ts rename to packages/oss-console/src/components/Breadcrumbs/validators/index.ts diff --git a/packages/console/src/components/Breadcrumbs/validators/namedEntitiesValidator.test.ts b/packages/oss-console/src/components/Breadcrumbs/validators/namedEntitiesValidator.test.ts similarity index 97% rename from packages/console/src/components/Breadcrumbs/validators/namedEntitiesValidator.test.ts rename to packages/oss-console/src/components/Breadcrumbs/validators/namedEntitiesValidator.test.ts index faff9c7b2..ec0e430db 100644 --- a/packages/console/src/components/Breadcrumbs/validators/namedEntitiesValidator.test.ts +++ b/packages/oss-console/src/components/Breadcrumbs/validators/namedEntitiesValidator.test.ts @@ -1,8 +1,5 @@ import { BreadcrumbValidatorInterface } from '../types'; -import { - executionsValidatorEmpty, - namedEntitiesValidatorExecutionsEmpty, -} from './fn'; +import { executionsValidatorEmpty, namedEntitiesValidatorExecutionsEmpty } from './fn'; describe('namedEntitiesValidator', () => { it('Matches on version page', () => { diff --git a/packages/console/src/components/Cache/CacheContext.ts b/packages/oss-console/src/components/Cache/CacheContext.ts similarity index 100% rename from packages/console/src/components/Cache/CacheContext.ts rename to packages/oss-console/src/components/Cache/CacheContext.ts diff --git a/packages/console/src/components/Cache/createCache.ts b/packages/oss-console/src/components/Cache/createCache.ts similarity index 96% rename from packages/console/src/components/Cache/createCache.ts rename to packages/oss-console/src/components/Cache/createCache.ts index 21bd8ea0e..c87ade120 100644 --- a/packages/console/src/components/Cache/createCache.ts +++ b/packages/oss-console/src/components/Cache/createCache.ts @@ -63,7 +63,7 @@ export function createCache(): ValueCache { return value; } - const merged = Object.assign({}, existing, value); + const merged = { ...existing, ...value }; entities.set(key, merged); return merged; }; @@ -71,7 +71,7 @@ export function createCache(): ValueCache { const mergeArray = (values: T[]) => { return values.map((item: T) => { const id = hasId(item) ? item.id : item; - return mergeValue(id, item) as T; + return mergeValue(id, item) as unknown as T; }); }; diff --git a/packages/console/src/components/Cache/utils.ts b/packages/oss-console/src/components/Cache/utils.ts similarity index 100% rename from packages/console/src/components/Cache/utils.ts rename to packages/oss-console/src/components/Cache/utils.ts diff --git a/packages/oss-console/src/components/Entities/EntityDescription.tsx b/packages/oss-console/src/components/Entities/EntityDescription.tsx new file mode 100644 index 000000000..bb2d361ca --- /dev/null +++ b/packages/oss-console/src/components/Entities/EntityDescription.tsx @@ -0,0 +1,185 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Grid from '@mui/material/Grid'; +import IconButton from '@mui/material/IconButton'; +import Typography from '@mui/material/Typography'; +import ExpandLess from '@mui/icons-material/ExpandLess'; +import ExpandMore from '@mui/icons-material/ExpandMore'; +import { SortDirection } from '@clients/common/types/adminEntityTypes'; +import { useCommonStyles } from '../common/styles'; +import { WaitForData } from '../common/WaitForData'; +import { IdentifierScope, ResourceIdentifier, Variable } from '../../models/Common/types'; +import { useEntityVersions } from '../hooks/Entity/useEntityVersions'; +import { executionSortFields } from '../../models/Execution/constants'; +import { TaskClosure } from '../../models/Task/types'; +import { VariablesList } from '../Task/SimpleTaskInterface'; +import { executionFilterGenerator } from './generators'; +import { Row } from './Row'; +import t, { patternKey } from './strings'; +import { entityStrings, entitySections } from './constants'; +import { useDescriptionEntityList } from '../hooks/useDescription'; + +const InputsAndOuputs: React.FC<{ + id: ResourceIdentifier; +}> = ({ id }) => { + const sort = { + key: executionSortFields.createdAt, + direction: SortDirection.DESCENDING, + }; + + const baseFilters = executionFilterGenerator[id.resourceType](id); + + // to render the input and output, + // need to fetch the latest version and get the input and ouptut data + const versions = useEntityVersions({ ...id, version: '' } as IdentifierScope, { + sort, + filter: baseFilters, + limit: 1, + }); + + let inputs: Record | undefined; + let outputs: Record | undefined; + + if ((versions?.value?.[0]?.closure as TaskClosure)?.compiledTask?.template) { + const template = (versions?.value?.[0]?.closure as TaskClosure)?.compiledTask?.template; + inputs = template?.interface?.inputs?.variables; + outputs = template?.interface?.outputs?.variables; + } + + const [showVariables, setShowVariables] = React.useState(false); + + return ( + + setShowVariables(!showVariables)} + onMouseDown={(e) => e.preventDefault()} + > + `1px solid ${theme.palette.divider}` }} + > + + + {showVariables ? : } + + + + Inputs & Outputs + + + + {showVariables && ( + + + {inputs && ( + + {/* !field?.name} /> */} + theme.palette.secondary.main, + }, + width: '100%', + wordBreak: 'break-word', + }} + > + + + + )} + {outputs && ( + + theme.palette.secondary.main, + }, + }} + > + + + + )} + + + )} + + ); +}; + +/** Fetches and renders the description for a given Entity (LaunchPlan,Workflow,Task) ID */ +export const EntityDescription: React.FC<{ + id: ResourceIdentifier; +}> = ({ id }) => { + const commonStyles = useCommonStyles(); + + const { resourceType } = id; + const sort = { + key: executionSortFields.createdAt, + direction: SortDirection.DESCENDING, + }; + + const baseFilters = React.useMemo( + () => executionFilterGenerator[resourceType](id), + [id, resourceType], + ); + + const descriptionEntities = useDescriptionEntityList( + { ...id, version: '' }, + { + sort, + filter: baseFilters, + limit: 1, + }, + ); + + const descriptionEntity = descriptionEntities?.value?.[0]; + const hasDescription = descriptionEntity?.longDescription.value.length !== 0; + const hasLink = !!descriptionEntity?.sourceCode?.link; + const sections = entitySections[id.resourceType]; + + return ( + + theme.spacing(2) }}> + + + {hasDescription + ? descriptionEntity?.longDescription?.value + : t(patternKey('noDescription', entityStrings[id.resourceType]))} + + + {hasLink && ( + + {hasLink ? ( + + ) : ( + t(patternKey('noGithubLink', entityStrings[id.resourceType])) + )} + + )} + + + + {sections?.descriptionInputsAndOutputs && } + + + ); +}; diff --git a/packages/oss-console/src/components/Entities/EntityDetails.tsx b/packages/oss-console/src/components/Entities/EntityDetails.tsx new file mode 100644 index 000000000..b914ba23b --- /dev/null +++ b/packages/oss-console/src/components/Entities/EntityDetails.tsx @@ -0,0 +1,178 @@ +import React, { useMemo } from 'react'; +import styled from '@mui/system/styled'; +import Box from '@mui/material/Box'; +import Grid from '@mui/material/Grid'; +import compact from 'lodash/compact'; + +import PageMeta from '@clients/primitives/PageMeta'; +import { LoadingSpinner } from '@clients/primitives/LoadingSpinner'; +import { RequestConfig, SortDirection } from '@clients/common/types/adminEntityTypes'; +import { EntityDescription } from './EntityDescription'; +import { useProject } from '../hooks/useProjects'; +import { useChartState } from '../hooks/useChartState'; +import { ResourceIdentifier, ResourceType } from '../../models/Common/types'; +import { ExecutionsBarChartSection } from '../common/ExecutionsBarChartSection'; +import { useExecutionShowArchivedState } from '../Executions/filters/useExecutionArchiveState'; +import { useWorkflowExecutionFiltersState } from '../Executions/filters/useExecutionFiltersState'; +import { useOnlyMyExecutionsFilterState } from '../Executions/filters/useOnlyMyExecutionsFilterState'; +import { BarChartData } from '../common/BarChart'; +import { entitySections } from './constants'; +import { EntityDetailsHeader } from './EntityDetailsHeader'; +import { EntityInputs } from './EntityInputs'; +import { EntityExecutions } from './EntityExecutions'; +import { EntityVersions } from './EntityVersions'; +import { executionFilterGenerator } from './generators'; +import { executionSortFields } from '../../models/Execution/constants'; + +const EntityDetailsContainer = styled(Grid)(({ theme }) => ({ + minHeight: '100vh', + '.ui-section': { + padding: theme.spacing(2), + }, + '& .last-100-executions-section': { + padding: 0, + }, +})); + +interface EntityDetailsProps { + id: ResourceIdentifier; +} + +const EXECUTIONS_LIMIT = 100; + +const DEFAULT_SORT = { + key: executionSortFields.createdAt, + direction: SortDirection.DESCENDING, +}; + +export const REQUEST_CONFIG = { + sort: DEFAULT_SORT, + limit: EXECUTIONS_LIMIT, +}; + +/** + * A view which optionally renders description, schedules, executions, and a + * launch button/form for a given entity. Note: not all components are suitable + * for use with all entities (not all entities have schedules, for example). + * @param id + */ +export const EntityDetails: React.FC = ({ id }) => { + const sections = entitySections[id.resourceType]; + const { data: project } = useProject(id.project); + const { chartIds, onToggle, clearCharts } = useChartState(); + + const baseFilters = useMemo( + () => executionFilterGenerator[id.resourceType](id), + [id, id.resourceType], + ); + + const filtersState = useWorkflowExecutionFiltersState(); + const archivedFilter = useExecutionShowArchivedState(); + const onlyMyExecutionsFilterState = useOnlyMyExecutionsFilterState({}); + + const allFilters = compact([ + ...baseFilters, + ...filtersState.appliedFilters, + archivedFilter.getFilter(), + onlyMyExecutionsFilterState.getFilter(), + ]); + + const requestConfig: RequestConfig = useMemo( + () => ({ + ...REQUEST_CONFIG, + filter: allFilters, + }), + [allFilters], + ); + + const ResourceIdentifierText = useMemo(() => { + switch (id.resourceType) { + case ResourceType.TASK: + return 'Task'; + case ResourceType.WORKFLOW: + return 'Workflow'; + case ResourceType.LAUNCH_PLAN: + return 'Launch Plan'; + default: + return 'Entity'; + } + }, [id.resourceType]); + + const headerText = `All executions in the ${ResourceIdentifierText}`; + + const handleBarChartItemClick = React.useCallback((item: BarChartData) => { + onToggle(item.metadata.name); + }, []); + + return ( + <> + + + {!project?.id && } + {project?.id && ( + + {/* Portal into breadcrumbs */} + + + + theme.spacing(2), + paddingRight: (theme) => theme.spacing(2), + }} + > + {sections.description && ( + + + + )} + + {!!sections.inputs && ( + + + + )} + + {!!sections.versions && ( + + + + )} + + + + + + + + + {sections.executions ? ( + + ) : ( + + )} + + + + )} + + + ); +}; diff --git a/packages/oss-console/src/components/Entities/EntityDetailsHeader.tsx b/packages/oss-console/src/components/Entities/EntityDetailsHeader.tsx new file mode 100644 index 000000000..f22e7b472 --- /dev/null +++ b/packages/oss-console/src/components/Entities/EntityDetailsHeader.tsx @@ -0,0 +1,124 @@ +import React, { useState } from 'react'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import styled from '@mui/system/styled'; +import isNil from 'lodash/isNil'; +import { Identifier, ResourceIdentifier, ResourceType } from '../../models/Common/types'; +import { LaunchForm } from '../Launch/LaunchForm/LaunchForm'; +import { useEscapeKey } from '../hooks/useKeyListener'; +import { LaunchTaskFormProps, LaunchWorkflowFormProps } from '../Launch/LaunchForm/types'; +import t, { patternKey } from './strings'; +import { entityStrings } from './constants'; +import BreadcrumbTitleActions from '../Breadcrumbs/components/BreadcrumbTitleActions'; + +const EntityDetailsHeaderContainer = styled('div')(({ theme }) => ({ + '.headerContainer': { + alignItems: 'center', + display: 'flex', + height: theme.spacing(5), + justifyContent: 'space-between', + marginTop: theme.spacing(2), + width: '100%', + }, + '.headerText': { + margin: theme.spacing(0, 1), + }, + '.headerTextContainer': { + display: 'flex', + flex: '1 0 auto', + }, +})); + +interface EntityDetailsHeaderProps { + id: ResourceIdentifier; + launchable?: boolean; +} + +const isTaskIdentifier = (id: any): id is Identifier => { + return id?.resourceType === ResourceType.TASK; +}; + +const isVersionedId = (id: any): id is Identifier => { + return !isNil(id?.version); +}; + +function getLaunchProps( + id: ResourceIdentifier, +): LaunchWorkflowFormProps | Pick { + if (isTaskIdentifier(id)) { + return { + taskId: id, + ...(isVersionedId(id) + ? { + initialParameters: { taskId: id }, + } + : {}), + }; + } + + return { + workflowId: id, + ...(isVersionedId(id) + ? { + initialParameters: { workflowId: id }, + } + : {}), + } as any as LaunchWorkflowFormProps; +} + +/** + * Renders the entity name and any applicable actions. + * @param id + * @param project + * @param launchable - controls if we show launch button + * @param backToWorkflow - if true breadcrumb navigates to main workflow details view. + * @constructor + */ +export const EntityDetailsHeader: React.FC = ({ + id, + launchable = false, +}) => { + const [showLaunchForm, setShowLaunchForm] = useState(false); + const onCancelLaunch = (_?: any) => { + setShowLaunchForm(false); + }; + + // Close modal on escape key press + useEscapeKey(() => { + onCancelLaunch(); + }); + + return ( + +
    + + {launchable ? ( + + ) : ( + <> + )} + +
    + {launchable ? ( + + + + ) : null} +
    + ); +}; diff --git a/packages/oss-console/src/components/Entities/EntityExecutions.tsx b/packages/oss-console/src/components/Entities/EntityExecutions.tsx new file mode 100644 index 000000000..ed4730d8d --- /dev/null +++ b/packages/oss-console/src/components/Entities/EntityExecutions.tsx @@ -0,0 +1,69 @@ +import React, { useMemo } from 'react'; +import Grid from '@mui/material/Grid'; +import { RequestConfig } from '@clients/common/types/adminEntityTypes'; +import { ExecutionFilters, OnlyMyExecutionsFilterState } from '../Executions/ExecutionFilters'; +import { useWorkflowExecutionFiltersState } from '../Executions/filters/useExecutionFiltersState'; +import { WorkflowExecutionsTable } from '../Executions/Tables/WorkflowExecutionsTable'; +import { ResourceIdentifier } from '../../models/Common/types'; +import { getCacheKey } from '../Cache/utils'; +import { ArchiveFilterState } from '../Executions/filters/useExecutionArchiveState'; + +export interface EntityExecutionsProps { + id: ResourceIdentifier; + chartIds: string[]; + requestConfig: RequestConfig; + clearCharts: () => void; + onlyMyExecutionsFilterState?: OnlyMyExecutionsFilterState; + archiveFilterState?: ArchiveFilterState; +} + +/** The tab/page content for viewing a workflow's executions */ +export const EntityExecutions: React.FC = ({ + id, + chartIds, + clearCharts, + requestConfig, + onlyMyExecutionsFilterState, + archiveFilterState, +}) => { + const { domain, project } = id; + const filtersState = useWorkflowExecutionFiltersState(); + + // Remount the table whenever we change project/domain/filters to ensure + // things are virtualized correctly. + const tableKey = useMemo( + () => + getCacheKey({ + domain, + project, + requestConfig, + }), + [domain, project, requestConfig], + ); + + return ( + + + + + + + + + ); +}; diff --git a/packages/oss-console/src/components/Entities/EntityExecutionsBarChart.tsx b/packages/oss-console/src/components/Entities/EntityExecutionsBarChart.tsx new file mode 100644 index 000000000..a28379ae7 --- /dev/null +++ b/packages/oss-console/src/components/Entities/EntityExecutionsBarChart.tsx @@ -0,0 +1,59 @@ +import * as React from 'react'; +import { formatDateUTC, millisecondsToHMS } from '../../common/formatters'; +import { timestampToDate } from '../../common/utils'; +import { Execution } from '../../models/Execution/types'; +import { getPhaseConstants } from '../Executions/ExecutionStatusBadge'; +import { getWorkflowExecutionTimingMS } from '../Executions/utils'; +import { getExecutionStatusClassName } from '../utils/classes'; + +export const getExecutionTimeData = ( + executions: Execution[], + resourceType: 'node' | 'workflow' | 'task', +) => { + const fillSize = 100; + const newExecutions = [...executions].reverse().map((execution) => { + const duration = getWorkflowExecutionTimingMS(execution)?.duration || 1; + const statusText = getPhaseConstants(resourceType, execution.closure.phase).text; + return { + value: duration, + className: getExecutionStatusClassName('background', execution.closure.phase), + metadata: execution.id, + tooltip: ( +
    + + Execution Id: {execution.id.name} + + Status: {statusText} + Running time: {millisecondsToHMS(duration)} + + Started at: + {execution?.closure?.startedAt && + formatDateUTC(timestampToDate(execution.closure.startedAt))} + +
    + ), + }; + }); + if (newExecutions.length >= fillSize) { + return newExecutions.slice(0, fillSize); + } + return new Array(fillSize - newExecutions.length) + .fill(0) + .map(() => ({ + value: 1, + // gets the default color for the status + className: getExecutionStatusClassName('background'), + })) + .concat(newExecutions); +}; + +export const getStartExecutionTime = (executions: Execution[]) => { + if (executions.length === 0) { + return ''; + } + const lastExecution = executions[executions.length - 1]; + if (!lastExecution?.closure?.startedAt) { + return ''; + } + return formatDateUTC(timestampToDate(lastExecution?.closure?.startedAt)); +}; diff --git a/packages/oss-console/src/components/Entities/EntityInputs.tsx b/packages/oss-console/src/components/Entities/EntityInputs.tsx new file mode 100644 index 000000000..8eab842de --- /dev/null +++ b/packages/oss-console/src/components/Entities/EntityInputs.tsx @@ -0,0 +1,209 @@ +import React, { useMemo } from 'react'; +import Divider from '@mui/material/Divider'; +import Grid from '@mui/material/Grid'; +import IconButton from '@mui/material/IconButton'; +import Paper from '@mui/material/Paper'; +import Table from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell from '@mui/material/TableCell'; +import TableContainer from '@mui/material/TableContainer'; +import TableHead from '@mui/material/TableHead'; +import TableRow from '@mui/material/TableRow'; +import Typography from '@mui/material/Typography'; +import styled from '@mui/system/styled'; +import CheckIcon from '@mui/icons-material/Check'; +import ExpandLess from '@mui/icons-material/ExpandLess'; +import ExpandMore from '@mui/icons-material/ExpandMore'; +import { FilterOperationName } from '@clients/common/types/adminEntityTypes'; +import { useLaunchPlans } from '../hooks/useLaunchPlans'; +import { formatType, getInputDefintionForLiteralType } from '../Launch/LaunchForm/utils'; +import { ResourceIdentifier } from '../../models/Common/types'; +import { LaunchPlanClosure, LaunchPlanSpec } from '../../models/Launch/types'; +import t from './strings'; +import { transformLiterals } from '../Literals/helpers'; + +const coerceDefaultValue = (value: string | object | undefined): string | undefined => { + if (typeof value === 'object') { + return JSON.stringify(value); + } + return value; +}; + +const EntityInputsContainer = styled(Grid)(({ theme }) => ({ + marginBottom: theme.spacing(1), + '& .MuiTableHead-root .MuiTableCell-root': { + borderTop: 'none', + }, + '& .MuiTableCell-root:first-of-type': { + paddingLeft: 0, + }, + '& .configs': { + listStyleType: 'none', + paddingInlineStart: 0, + }, + '& .config': { + display: 'flex', + }, + '& .configName': { + color: theme.palette.grey[400], + marginRight: theme.spacing(2), + minWidth: '95px', + }, + '& .configValue': { + color: '#333', + fontSize: '14px', + }, + '& .noInputs': { + color: theme.palette.grey[400], + }, +})); + +interface Input { + name: string; + type?: string; + required?: boolean; + defaultValue?: string; +} + +/** Fetches and renders the expected & fixed inputs for a given Entity (LaunchPlan) ID */ +export const EntityInputs: React.FC<{ + id: ResourceIdentifier; +}> = ({ id }) => { + const launchPlanState = useLaunchPlans( + { project: id.project, domain: id.domain }, + { + limit: 1, + filter: [ + { + key: 'launch_plan.name', + operation: FilterOperationName.EQ, + value: id.name, + }, + ], + }, + ); + + const closure = launchPlanState?.value?.length + ? launchPlanState.value[0].closure + : ({} as LaunchPlanClosure); + + const spec = launchPlanState?.value?.length + ? launchPlanState.value[0].spec + : ({} as LaunchPlanSpec); + + const expectedInputs = useMemo(() => { + const results: Input[] = []; + Object.keys(closure?.expectedInputs?.parameters ?? {}).forEach((name) => { + const parameter = closure?.expectedInputs.parameters[name]; + if (parameter?.var?.type) { + const typeDefinition = getInputDefintionForLiteralType(parameter.var.type); + results.push({ + name, + type: formatType(typeDefinition), + required: !!parameter.required, + defaultValue: parameter.default?.value, + }); + } + }); + return results; + }, [closure]); + + const fixedInputs = useMemo(() => { + const inputsMap = transformLiterals(spec?.fixedInputs?.literals ?? {}); + return Object.keys(inputsMap).map((name) => ({ + name, + defaultValue: inputsMap[name], + })); + }, [spec]); + + const [showChart, setShowChart] = React.useState(true); + + return ( + + setShowChart(!showChart)} className="pointer"> + + + + {showChart ? : } + + + + {t('launchPlanLatest')} + + + + + {showChart && ( + + + + + {t('expectedInputs')} + + {expectedInputs.length ? ( + + + + + {t('inputsName')} + {t('inputsType')} + {t('inputsRequired')} + {t('inputsDefault')} + + + + {expectedInputs.map(({ name, type, required, defaultValue }) => ( + + {name} + {type} + + {required ? : ''} + + {coerceDefaultValue(defaultValue) || '-'} + + ))} + +
    +
    + ) : ( +

    {t('noExpectedInputs')}

    + )} +
    + + + {t('fixedInputs')} + + {fixedInputs.length ? ( + + + + + {t('inputsName')} + {t('inputsDefault')} + + + + {fixedInputs.map(({ name, defaultValue }) => ( + + {name} + {coerceDefaultValue(defaultValue) || '-'} + + ))} + +
    +
    + ) : ( +

    {t('noFixedInputs')}

    + )} +
    +
    +
    + )} +
    + ); +}; diff --git a/packages/oss-console/src/components/Entities/EntitySchedules.tsx b/packages/oss-console/src/components/Entities/EntitySchedules.tsx new file mode 100644 index 000000000..7f1129cb4 --- /dev/null +++ b/packages/oss-console/src/components/Entities/EntitySchedules.tsx @@ -0,0 +1,226 @@ +import React, { useMemo } from 'react'; +import ExpandLess from '@mui/icons-material/ExpandLess'; +import ExpandMore from '@mui/icons-material/ExpandMore'; +import Typography from '@mui/material/Typography'; +import Table from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell from '@mui/material/TableCell'; +import TableHead from '@mui/material/TableHead'; +import TableRow from '@mui/material/TableRow'; +import styled from '@mui/system/styled'; +import Divider from '@mui/material/Divider'; +import Grid from '@mui/material/Grid'; +import IconButton from '@mui/material/IconButton'; +import { SortDirection } from '@clients/common/types/adminEntityTypes'; +import { useQueryClient } from 'react-query'; +import { makeListDescriptionEntitiesQuery } from '@clients/oss-console/queries/descriptionEntitiesQuery'; +import { executionSortFields } from '../../models/Execution/constants'; +import { makeListLaunchPlansQuery } from '../../queries/launchPlanQueries'; +import { LocalCacheItem, useLocalCache } from '../../basics/LocalCache'; +import { + getScheduleFrequencyString, + getScheduleOffsetString, + formatDateUTC, +} from '../../common/formatters'; +import { timestampToDate } from '../../common/utils'; +import { useCommonStyles } from '../common/styles'; +import { ResourceIdentifier, ResourceType } from '../../models/Common/types'; +import { LaunchPlan } from '../../models/Launch/types'; +import { entityStrings } from './constants'; +import t, { patternKey } from './strings'; + +import { LaunchPlanLastNExecutions } from '../LaunchPlan/components/LaunchPlanLastNExecutions'; +import { LaunchPlanNextPotentialExecution } from '../LaunchPlan/components/LaunchPlanNextPotentialExecution'; +import { ScheduleDisplayValue, ScheduleStatus } from '../LaunchPlan/components/LaunchPlanCells'; +import { useConditionalQuery } from '../hooks/useConditionalQuery'; +import { WaitForQuery } from '../common/WaitForQuery'; +import { executionFilterGenerator } from './generators'; + +const EntitySchedulesContainer = styled('div')(({ theme }) => ({ + '.header': { + marginBottom: theme.spacing(1), + }, + '.schedulesContainer': { + marginTop: theme.spacing(1), + }, + '.divider': { + borderBottom: `1px solid ${theme.palette.divider}`, + marginBottom: theme.spacing(1), + }, + '.rowCell': { + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', + }, +})); + +export const getScheduleStringFromLaunchPlan = (launchPlan: LaunchPlan) => { + const { schedule } = launchPlan.spec.entityMetadata; + const frequencyString = getScheduleFrequencyString(schedule); + const offsetString = getScheduleOffsetString(schedule); + const scheduleString = offsetString + ? `${frequencyString} (offset by ${offsetString})` + : frequencyString; + + return scheduleString; +}; + +const RenderSchedules: React.FC<{ + launchPlans: LaunchPlan[]; + refetch: () => void; +}> = ({ launchPlans, refetch }) => { + return ( + + + + + {t(patternKey('launchPlan', 'status'))} + + + {t(patternKey('launchPlan', 'schedule'))} + + + {t(patternKey('launchPlan', 'lastExecution'))} + + + + {t(patternKey('launchPlan', 'nextPotentialExecution'))} + + + + {t(patternKey('launchPlan', 'createdAt'))} + + + {t(patternKey('launchPlan', 'scheduledVersion'))} + + + + + {launchPlans.map((launchPlan) => { + const createdAt = launchPlan?.closure?.createdAt!; + const createdAtTime = formatDateUTC(timestampToDate(createdAt)); + + return ( + + + + + + + + + + + + + + {createdAtTime} + {launchPlan.id.version} + + ); + })} + +
    + ); +}; + +const sort = { + key: executionSortFields.createdAt, + direction: SortDirection.DESCENDING, +}; +export const EntitySchedules: React.FC<{ + id: ResourceIdentifier; +}> = ({ id }) => { + const queryClient = useQueryClient(); + const commonStyles = useCommonStyles(); + const [showTable, setShowTable] = useLocalCache(LocalCacheItem.ShowLaunchplanSchedules); + + const { domain, project } = id || {}; + + // capture if we are on a launch plan details page page + const isLaunchPlan = id.resourceType === ResourceType.LAUNCH_PLAN; + + // if not on a launch plan details page, get the latest version of the entity(workflow) + const workflowEntityDescriptionQuery = useConditionalQuery( + { + enabled: !isLaunchPlan, + ...makeListDescriptionEntitiesQuery(queryClient, { ...id, version: '' }, { sort, limit: 1 }), + }, + (prev) => !prev && !!showTable, + ); + + // get the latest version of the workflow + const latestVersionId = workflowEntityDescriptionQuery.data?.entities?.[0]?.id; + + // get the filters for the latestVersionId + const filter = latestVersionId + ? executionFilterGenerator[latestVersionId.resourceType!]( + latestVersionId as any, + latestVersionId?.version, + ) + : undefined; + + // if the ID is a launchPlan, use the original ID, otherwise use the workflow latest version ID + const launchPlanRequestId = isLaunchPlan ? id : latestVersionId && { domain, project }; + const launchPlanQuery = useConditionalQuery( + { + enabled: !!launchPlanRequestId, + ...makeListLaunchPlansQuery(queryClient, launchPlanRequestId!, { + sort, + limit: 1, + ...(isLaunchPlan ? {} : { filter }), + }), + }, + (prev) => !prev && !!showTable, + ); + + return ( + + {(data) => { + const launchPlans = data.entities; + const isSchedulePresent = launchPlans?.[0]?.spec?.entityMetadata?.schedule != null; + return isSchedulePresent ? ( + + + + setShowTable(!showTable)} + onMouseDown={(e) => e.preventDefault()} + className="pointer" + > + + + {showTable ? : } + + + + {t('schedulesHeader')} + + + + + {showTable ? ( +
    + {launchPlans.length > 0 ? ( + + ) : ( + + {t(patternKey('noSchedules', entityStrings[id.resourceType]))} + + )} +
    + ) : ( + + )} +
    + ) : null; + }} +
    + ); +}; diff --git a/packages/oss-console/src/components/Entities/EntityVersions.tsx b/packages/oss-console/src/components/Entities/EntityVersions.tsx new file mode 100644 index 000000000..39f14531c --- /dev/null +++ b/packages/oss-console/src/components/Entities/EntityVersions.tsx @@ -0,0 +1,134 @@ +import React from 'react'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; +import IconButton from '@mui/material/IconButton'; +import Grid from '@mui/material/Grid'; +import Divider from '@mui/material/Divider'; +import styled from '@mui/system/styled'; +import * as CommonStylesConstants from '@clients/theme/CommonStyles/constants'; +import ExpandLess from '@mui/icons-material/ExpandLess'; +import ExpandMore from '@mui/icons-material/ExpandMore'; +import { SortDirection } from '@clients/common/types/adminEntityTypes'; +import { history } from '../../routes/history'; +import { LocalCacheItem, useLocalCache } from '../../basics/LocalCache'; +import { WaitForData } from '../common/WaitForData'; +import { EntityVersionsTable } from '../Executions/Tables/EntityVersionsTable'; +import { isLoadingState } from '../hooks/fetchMachine'; +import { useEntityVersions } from '../hooks/Entity/useEntityVersions'; +import { Identifier, ResourceIdentifier, ResourceType } from '../../models/Common/types'; +import { executionSortFields } from '../../models/Execution/constants'; +import { executionFilterGenerator, versionDetailsUrlGenerator } from './generators'; +import { WorkflowVersionsTablePageSize, entityStrings } from './constants'; +import t, { patternKey } from './strings'; + +const EntityVersionsContainer = styled('div')(() => ({ + '& .MuiTableCell-root:first-of-type': { + paddingLeft: 0, + }, + '.viewAll': { + color: CommonStylesConstants.interactiveTextColor, + cursor: 'pointer', + }, +})); + +export interface EntityVersionsProps { + id: ResourceIdentifier; + showAll?: boolean; +} + +/** + * The tab/page content for viewing a workflow's versions. + * @param id + * @param showAll - shows all available entity versions + */ +export const EntityVersions: React.FC = ({ id, showAll = false }) => { + const { domain, project, resourceType, name } = id; + const [showTable, setShowTable] = useLocalCache(LocalCacheItem.ShowWorkflowVersions); + const sort = { + key: executionSortFields.createdAt, + direction: SortDirection.DESCENDING, + }; + + const baseFilters = React.useMemo( + () => executionFilterGenerator[resourceType](id), + [id, resourceType], + ); + + // we are getting all the versions for this id + // so we don't want to specify which version + const versions = useEntityVersions( + { ...id, version: '' }, + { + sort, + filter: baseFilters, + limit: showAll ? 100 : WorkflowVersionsTablePageSize, + }, + ); + + const preventDefault: React.MouseEventHandler = (e) => e.preventDefault(); + const handleViewAll = React.useCallback(() => { + history.push( + versionDetailsUrlGenerator({ + ...id, + version: versions.value[0].id.version ?? '', + } as Identifier), + ); + }, [project, domain, name, versions]); + + return ( + + {!showAll && ( + + + setShowTable(!showTable)} + onMouseDown={preventDefault} + className="pointer" + > + + + {showTable ? : } + + + + + {t(patternKey('versionsTitle', entityStrings[id.resourceType]))} + + + + + + + + {t('viewAll')} + + + + + )} + + {showTable || showAll ? ( + + ) : ( + + )} + + + ); +}; diff --git a/packages/oss-console/src/components/Entities/Row.tsx b/packages/oss-console/src/components/Entities/Row.tsx new file mode 100644 index 000000000..8783bcedc --- /dev/null +++ b/packages/oss-console/src/components/Entities/Row.tsx @@ -0,0 +1,34 @@ +import React, { PropsWithChildren } from 'react'; +import Grid from '@mui/material/Grid'; +import Typography from '@mui/material/Typography'; +import styled from '@mui/system/styled'; + +const RowContainer = styled(Grid)(({ theme }) => ({ + marginBottom: theme.spacing(1), + flexWrap: 'nowrap', + // Workaround for display issue in chrome + display: '-webkit-box', + ' display': 'box', + + '.title': { + width: 120, + color: theme.palette.common.grays[30], + fontSize: '14px', + }, +})); + +interface RowProps { + title: String; +} +export const Row: React.FC> = (props) => { + return ( + + + {props.title} + + + {props.children} + + + ); +}; diff --git a/packages/oss-console/src/components/Entities/VersionDetails/EntityVersionDetails.tsx b/packages/oss-console/src/components/Entities/VersionDetails/EntityVersionDetails.tsx new file mode 100644 index 000000000..54faa5352 --- /dev/null +++ b/packages/oss-console/src/components/Entities/VersionDetails/EntityVersionDetails.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import Divider from '@mui/material/Divider'; +import Typography from '@mui/material/Typography'; +import styled from '@mui/system/styled'; +import { useQuery, useQueryClient } from 'react-query'; +import { ResourceIdentifier } from '../../../models/Common/types'; +import { contentMarginGridUnits } from '../../../common/layout'; +import { ReactJsonViewWrapper } from '../../common/ReactJsonView'; +import { makeTaskTemplateQuery } from '../../../queries/taskQueries'; +import { WaitForQuery } from '../../common/WaitForQuery'; +import EnvVarsTable from './EnvVarsTable'; +import t, { patternKey } from '../strings'; +import { entityStrings } from '../constants'; +import { Row } from '../Row'; +import { DataError } from '../../Errors/DataError'; + +const EntityVersionDetailsContainer = styled('div')(({ theme }) => ({ + '.header': { + marginBottom: theme.spacing(1), + marginLeft: theme.spacing(contentMarginGridUnits), + }, + + '.table': { + marginLeft: theme.spacing(contentMarginGridUnits), + display: 'flex', + flexDirection: 'column', + }, +})); + +export interface EntityExecutionsProps { + id: ResourceIdentifier; +} + +/** The tab/page content for viewing a workflow's executions */ +export const EntityVersionDetails: React.FC = ({ id }) => { + const queryClient = useQueryClient(); + // NOTE: need to be generic for supporting other type like workflow, etc. + const templateState = useQuery({ ...makeTaskTemplateQuery(queryClient, id as any) }); + + return ( + + + {t(patternKey('details', entityStrings[id.resourceType]))} + + + + {(template) => ( +
    + {template?.container?.image && ( + + {template?.container?.image} + + )} + {template?.container?.env && ( + + + + )} + {template && ( + + + + )} +
    + )} +
    +
    + ); +}; diff --git a/packages/oss-console/src/components/Entities/VersionDetails/EntityVersionDetailsContainer.tsx b/packages/oss-console/src/components/Entities/VersionDetails/EntityVersionDetailsContainer.tsx new file mode 100644 index 000000000..d725eb009 --- /dev/null +++ b/packages/oss-console/src/components/Entities/VersionDetails/EntityVersionDetailsContainer.tsx @@ -0,0 +1,139 @@ +import React, { useMemo, FC } from 'react'; +import styled from '@mui/system/styled'; +import { RouteComponentProps } from 'react-router-dom'; +import Box from '@mui/material/Box'; +import Grid from '@mui/material/Grid'; +import PageMeta from '@clients/primitives/PageMeta'; +import { LoadingSpinner } from '@clients/primitives/LoadingSpinner'; +import withRouteParams from '../../common/withRouteParams'; +import { ResourceIdentifier, ResourceType } from '../../../models/Common/types'; +import { useProject } from '../../hooks/useProjects'; +import { StaticGraphContainer } from '../../Workflow/StaticGraphContainer'; +import { WorkflowId } from '../../../models/Workflow/types'; +import { entitySections, typeNameToEntityResource } from '../constants'; +import { EntityDetailsHeader } from '../EntityDetailsHeader'; +import { EntityVersions } from '../EntityVersions'; +import { versionsDetailsSections } from './constants'; +import { EntityVersionDetails } from './EntityVersionDetails'; + +const EntityVersionsWrapper = styled(Grid, { + shouldForwardProp: (prop) => prop !== 'resourceType', +})<{ resourceType: ResourceType }>(({ theme, resourceType }) => ({ + marginTop: theme.spacing(2), + padding: theme.spacing(0, 2), + height: `calc(100vh - ${theme.spacing(20)})` as any, + flexWrap: 'nowrap', + overflow: 'hidden', + + '>.MuiGrid-item': { + overflow: 'auto', + width: '100%', + }, + '.staticGraphContainer': { + height: '60vh', + display: 'flex', + flex: '1', + }, + '.versionDetailsContainer': { + height: '55vh', + display: 'flex', + flexDirection: 'column', + + flex: '1', + overflowY: 'scroll', + padding: theme.spacing(0, 2), + }, + '.versionsContainer': { + display: 'flex', + flex: '0 1 auto', + padding: theme.spacing(0, 2), + height: resourceType === ResourceType.LAUNCH_PLAN ? '100%' : '40%', + flexDirection: 'column', + overflowY: 'auto', + }, +})); + +export interface WorkflowVersionDetailsRouteParams { + projectId: string; + domainId: string; + entityType: string; + entityName: string; + entityVersion: string; +} + +/** + * The view component for the Workflow Versions page + * @param projectId + * @param domainId + * @param workflowName + */ +const EntityVersionsDetailsContainerImpl: FC = ({ + projectId, + domainId, + entityType, + entityName, + entityVersion, +}) => { + const workflowId = useMemo( + () => ({ + resourceType: typeNameToEntityResource[entityType], + project: projectId, + domain: domainId, + name: entityName, + version: decodeURIComponent(entityVersion), + }), + [entityType, projectId, domainId, entityName, entityVersion], + ); + + const id = workflowId as ResourceIdentifier; + const sections = entitySections[id.resourceType]; + const versionsSections = versionsDetailsSections[id.resourceType]; + const { data: project } = useProject(workflowId.project); + + const ResourceIdentifierText = useMemo(() => { + switch (id.resourceType) { + case ResourceType.TASK: + return 'Task'; + case ResourceType.WORKFLOW: + return 'Workflow'; + case ResourceType.LAUNCH_PLAN: + return 'Launch Plan'; + default: + return 'Entity'; + } + }, [id.resourceType]); + + if (!project?.id) { + return ; + } + + return ( + <> + + + + + + {versionsSections.details && ( + + + + )} + {versionsSections.graph && ( + + + + )} + + + + + + ); +}; + +export const EntityVersionsDetailsContainer: FC< + RouteComponentProps +> = withRouteParams(EntityVersionsDetailsContainerImpl); + +export default EntityVersionsDetailsContainer; diff --git a/packages/oss-console/src/components/Entities/VersionDetails/EnvVarsTable.tsx b/packages/oss-console/src/components/Entities/VersionDetails/EnvVarsTable.tsx new file mode 100644 index 000000000..0a7a5041a --- /dev/null +++ b/packages/oss-console/src/components/Entities/VersionDetails/EnvVarsTable.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import Typography from '@mui/material/Typography'; +import Table from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell from '@mui/material/TableCell'; +import TableContainer from '@mui/material/TableContainer'; +import TableHead from '@mui/material/TableHead'; +import TableRow from '@mui/material/TableRow'; +import Paper from '@mui/material/Paper'; +import styled from '@mui/system/styled'; + +import Core from '@clients/common/flyteidl/core'; +import t from '../strings'; + +const EnvVarsTableContainer = styled('div')(({ theme }) => ({ + '& .container': { + marginBottom: theme.spacing(1), + '& .MuiTableCell-sizeSmall': { + paddingLeft: 0, + }, + }, + '& .headerText': { + color: theme.palette.common.grays[30], + }, +})); + +interface EnvVarsTableProps { + rows: Core.IKeyValuePair[]; +} + +export default function EnvVarsTable({ rows }: EnvVarsTableProps) { + if (!rows || rows.length === 0) { + return {t('empty')}; + } + return ( + + + + + + + + {t('key')} + + + + + {t('value')} + + + + + + {rows.map((row) => ( + + + {row.key} + + + {row.value} + + + ))} + +
    +
    +
    + ); +} diff --git a/packages/oss-console/src/components/Entities/VersionDetails/VersionDetailsLink.tsx b/packages/oss-console/src/components/Entities/VersionDetails/VersionDetailsLink.tsx new file mode 100644 index 000000000..4d49a0455 --- /dev/null +++ b/packages/oss-console/src/components/Entities/VersionDetails/VersionDetailsLink.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import styled from '@mui/system/styled'; +import { useQueryClient } from 'react-query'; +import { makeTaskQuery } from '../../../queries/taskQueries'; +import { Identifier } from '../../../models/Common/types'; +import { NewTargetLink } from '../../common/NewTargetLink'; +import { versionDetailsUrlGenerator } from '../generators'; +import t from '../strings'; +import { useConditionalQuery } from '../../hooks/useConditionalQuery'; +import { WaitForQuery } from '../../common/WaitForQuery'; + +const StyledNewTargetLink = styled(NewTargetLink)(({ theme }) => ({ + marginBottom: theme.spacing(2), +})) as typeof NewTargetLink; + +interface TaskVersionDetailsLinkProps { + id: Identifier; +} + +export const TaskVersionDetailsLink: React.FC = ({ id }) => { + const queryClient = useQueryClient(); + const taskQuery = useConditionalQuery( + { ...makeTaskQuery(queryClient, id), enabled: !!id }, + (prev) => !prev, + ); + return ( + + {(data) => { + return data ? ( + + {t('details_task')} + + ) : null; + }} + + ); +}; diff --git a/packages/console/src/components/Entities/VersionDetails/constants.ts b/packages/oss-console/src/components/Entities/VersionDetails/constants.ts similarity index 89% rename from packages/console/src/components/Entities/VersionDetails/constants.ts rename to packages/oss-console/src/components/Entities/VersionDetails/constants.ts index 160dc0347..639f570ee 100644 --- a/packages/console/src/components/Entities/VersionDetails/constants.ts +++ b/packages/oss-console/src/components/Entities/VersionDetails/constants.ts @@ -1,4 +1,4 @@ -import { ResourceType } from 'models/Common/types'; +import { ResourceType } from '../../../models/Common/types'; interface VersionsDetailsSectionsFlags { details: boolean; diff --git a/packages/console/src/components/Entities/constants.ts b/packages/oss-console/src/components/Entities/constants.ts similarity index 84% rename from packages/console/src/components/Entities/constants.ts rename to packages/oss-console/src/components/Entities/constants.ts index 6729064c3..c3b5a3bf1 100644 --- a/packages/console/src/components/Entities/constants.ts +++ b/packages/oss-console/src/components/Entities/constants.ts @@ -1,4 +1,4 @@ -import { ResourceType } from 'models/Common/types'; +import { ResourceType } from '../../models/Common/types'; type EntityStringMap = { [k in ResourceType]: string }; @@ -13,11 +13,11 @@ export const entityStrings: EntityStringMap = { type TypeNameToEntityResourceType = { [key: string]: ResourceType }; export const typeNameToEntityResource: TypeNameToEntityResourceType = { - ['dataset']: ResourceType.DATASET, - ['launch_plan']: ResourceType.LAUNCH_PLAN, - ['task']: ResourceType.TASK, - ['item']: ResourceType.UNSPECIFIED, - ['workflow']: ResourceType.WORKFLOW, + dataset: ResourceType.DATASET, + launch_plan: ResourceType.LAUNCH_PLAN, + task: ResourceType.TASK, + item: ResourceType.UNSPECIFIED, + workflow: ResourceType.WORKFLOW, }; interface EntitySectionsFlags { diff --git a/packages/oss-console/src/components/Entities/generators.ts b/packages/oss-console/src/components/Entities/generators.ts new file mode 100644 index 000000000..aa19456c2 --- /dev/null +++ b/packages/oss-console/src/components/Entities/generators.ts @@ -0,0 +1,93 @@ +import { FilterOperation, FilterOperationName } from '@clients/common/types/adminEntityTypes'; +import { ResourceIdentifier, ResourceType, Identifier } from '../../models/Common/types'; +import { Routes } from '../../routes/routes'; + +const noFilters = () => []; + +export const executionFilterGenerator: { + [k in ResourceType]: (id: ResourceIdentifier, version?: string) => FilterOperation[]; +} = { + [ResourceType.DATASET]: noFilters, + [ResourceType.LAUNCH_PLAN]: ({ name }, version) => [ + { + key: 'launch_plan.name', + operation: FilterOperationName.EQ, + value: name, + }, + ...(version + ? [ + { + key: 'launch_plan.version', + operation: FilterOperationName.EQ, + value: version, + }, + ] + : []), + ], + [ResourceType.TASK]: ({ name }, version) => [ + { + key: 'task.name', + operation: FilterOperationName.EQ, + value: name, + }, + ...(version + ? [ + { + key: 'workflow.version', + operation: FilterOperationName.EQ, + value: version, + }, + ] + : []), + ], + [ResourceType.UNSPECIFIED]: noFilters, + [ResourceType.WORKFLOW]: ({ name }, version) => [ + { + key: 'workflow.name', + operation: FilterOperationName.EQ, + value: name, + }, + ...(version + ? [ + { + key: 'workflow.version', + operation: FilterOperationName.EQ, + value: version, + }, + ] + : []), + ], +}; + +const unspecifiedGenerator = ({ + project: _project, + domain: _domain, +}: ResourceIdentifier | Identifier) => { + throw new Error('Unspecified Resourcetype.'); +}; +const unimplementedGenerator = ({ + project: _project, + domain: _domain, +}: ResourceIdentifier | Identifier) => { + throw new Error('Method not implemented.'); +}; + +const workflowVersopmDetailsGenerator = (id: Identifier) => Routes.EntityVersionDetails.makeUrl(id); +const taskVersionDetailsGenerator = (id: Identifier) => Routes.EntityVersionDetails.makeUrl(id); +const launchPlanVersionDetailsGenerator = (id: Identifier) => + Routes.EntityVersionDetails.makeUrl(id); + +const entityMapVersionDetailsUrl: { + [k in ResourceType]: (id: Identifier) => string; +} = { + [ResourceType.DATASET]: unimplementedGenerator, + [ResourceType.LAUNCH_PLAN]: launchPlanVersionDetailsGenerator, + [ResourceType.TASK]: taskVersionDetailsGenerator, + [ResourceType.UNSPECIFIED]: unspecifiedGenerator, + [ResourceType.WORKFLOW]: workflowVersopmDetailsGenerator, +}; + +export const versionDetailsUrlGenerator = (id: Identifier): string => { + if (id?.resourceType) return entityMapVersionDetailsUrl[id?.resourceType](id); + return ''; +}; diff --git a/packages/console/src/components/Entities/strings.ts b/packages/oss-console/src/components/Entities/strings.ts similarity index 83% rename from packages/console/src/components/Entities/strings.ts rename to packages/oss-console/src/components/Entities/strings.ts index 54957023e..3fab9dc63 100644 --- a/packages/console/src/components/Entities/strings.ts +++ b/packages/oss-console/src/components/Entities/strings.ts @@ -1,4 +1,4 @@ -import { createLocalizedString } from '@flyteorg/locale'; +import { createLocalizedString } from '@clients/locale/locale'; const str = { viewAll: 'View All', @@ -49,7 +49,13 @@ const str = { launchPlan_frequency: 'Frequency', launchPlan_name: 'Launch Plan', launchPlan_version: 'Version', + launchPlan_status: 'Status', + launchPlan_schedule: 'Schedule', + launchPlan_lastExecution: 'Last Execution', + launchPlan_nextPotentialExecution: 'Next Potential Execution', + launchPlan_createdAt: 'Created At', + launchPlan_scheduledVersion: 'Scheduled Version', }; -export { patternKey } from '@flyteorg/locale'; +export { patternKey } from '@clients/locale/locale'; export default createLocalizedString(str); diff --git a/packages/oss-console/src/components/Entities/test/EntityDetails.test.tsx b/packages/oss-console/src/components/Entities/test/EntityDetails.test.tsx new file mode 100644 index 000000000..123096944 --- /dev/null +++ b/packages/oss-console/src/components/Entities/test/EntityDetails.test.tsx @@ -0,0 +1,91 @@ +import { render, waitFor, screen, within } from '@testing-library/react'; +import * as React from 'react'; +import { MemoryRouter } from 'react-router'; +import { + QueryClient, + QueryClientProvider as QueryClientProviderImport, + QueryClientProviderProps, +} from 'react-query'; +import { ThemeProvider } from '@mui/material/styles'; +import { muiTheme } from '@clients/theme/Theme/muiTheme'; +import { ResourceIdentifier } from '../../../models/Common/types'; +import { createMockTask } from '../../../models/__mocks__/taskData'; +import { createMockWorkflow } from '../../../models/__mocks__/workflowData'; +import { Task } from '../../../models/Task/types'; +import { Workflow } from '../../../models/Workflow/types'; +import { projects } from '../../../mocks/data/projects'; +import * as projectApi from '../../../models/Project/api'; +import { EntityDetails } from '../EntityDetails'; + +const queryClient = new QueryClient(); + +const QueryClientProvider: React.FC> = + QueryClientProviderImport; + +jest.mock('../../../models/Project/api'); +jest.mock('../../../components/Executions/filters/useOnlyMyExecutionsFilterState', () => ({ + useOnlyMyExecutionsFilterState: jest.fn().mockReturnValue({ + getFilter: jest.fn().mockReturnValue(undefined), + }), +})); + +describe('EntityDetails', () => { + let mockWorkflow: Workflow; + let mockTask: Task; + + // mock api for listProjects + const mockListProjects = jest.spyOn(projectApi, 'listProjects'); + mockListProjects.mockResolvedValue([projects.flyteTest]); + + const createMocks = () => { + mockWorkflow = createMockWorkflow('MyWorkflow'); + mockTask = createMockTask('MyTask'); + }; + + const renderDetails = (id: ResourceIdentifier) => { + return render( + + + + + + + , + ); + }; + + beforeEach(() => { + createMocks(); + }); + + const checkTextInDetailPage = async ( + id: ResourceIdentifier, + versionsString: string, + executionsString: string, + ) => { + // check text for header + await waitFor(() => + expect( + within(screen.getByText(`${id.domain} / ${id.name}`, { exact: false })), + ).toBeInTheDocument(), + ); + + // check text for versions + await waitFor(() => expect(within(screen.getByText(versionsString))).toBeInTheDocument()); + + // check text for executions + await waitFor(() => expect(within(screen.getByText(executionsString))).toBeInTheDocument()); + }; + + it('renders Task Details Page', async () => { + const id: ResourceIdentifier = mockTask.id as ResourceIdentifier; + renderDetails(id); + checkTextInDetailPage(id, 'Recent Task Versions', 'All Executions in the Task'); + }); + + it('renders Workflow Details Page', async () => { + const id: ResourceIdentifier = mockWorkflow.id as ResourceIdentifier; + renderDetails(id); + checkTextInDetailPage(id, 'Recent Workflow Versions', 'All Executions in the Workflow'); + }); +}); diff --git a/packages/oss-console/src/components/Entities/test/EntityVersionDetails.test.tsx b/packages/oss-console/src/components/Entities/test/EntityVersionDetails.test.tsx new file mode 100644 index 000000000..686af3166 --- /dev/null +++ b/packages/oss-console/src/components/Entities/test/EntityVersionDetails.test.tsx @@ -0,0 +1,101 @@ +import { render, waitFor } from '@testing-library/react'; +import StyledEngineProvider from '@mui/material/StyledEngineProvider'; +import { ThemeProvider } from '@mui/material/styles'; +import { muiTheme } from '@clients/theme/Theme/muiTheme'; +import * as React from 'react'; +import * as ReactQuery from 'react-query'; +import { ResourceIdentifier } from '../../../models/Common/types'; +import { createMockTask } from '../../../models/__mocks__/taskData'; +import { Task } from '../../../models/Task/types'; +import { getTask } from '../../../models/Task/api'; +import { APIContext } from '../../data/apiContext'; +import { mockAPIContextValue } from '../../data/__mocks__/apiContext'; +import { EntityVersionDetails } from '../VersionDetails/EntityVersionDetails'; + +// eslint-disable-next-line prefer-destructuring +const QueryClientProvider: React.FC> = + ReactQuery.QueryClientProvider; +const queryClient = new ReactQuery.QueryClient(); + +jest.mock('../../../queries/taskQueries', () => ({ + makeTaskTemplateQuery: async () => { + return createMockTask('MyTask').closure.compiledTask.template; + }, +})); + +jest.mock('../../../components/common/WaitForQuery', () => ({ + WaitForQuery: jest.fn(({ query, children }) => ( +
    + <>{children(query.data)} +
    + )), +})); + +// @ts-ignore +jest.spyOn(ReactQuery, 'useQuery').mockImplementation(() => ({ + data: createMockTask('MyTask').closure.compiledTask.template, + isLoading: false, + error: {}, +})); + +describe('EntityVersionDetails', () => { + let mockTask: Task; + let mockGetTask: jest.Mock>; + + const createMocks = () => { + mockTask = createMockTask('MyTask'); + mockGetTask = jest.fn().mockImplementation(() => Promise.resolve(mockTask)); + }; + + const renderDetails = (id: ResourceIdentifier) => { + return render( + + + + + + + + + , + ); + }; + + describe('Task Version Details', () => { + beforeEach(() => { + createMocks(); + }); + + it('renders and checks text', async () => { + const id: ResourceIdentifier = mockTask.id as ResourceIdentifier; + const { getByText } = renderDetails(id); + + // check text for Task Details + await waitFor(() => { + expect(getByText('Task Details')).toBeInTheDocument(); + }); + + // check text for image + await waitFor(() => { + expect( + getByText(mockTask.closure.compiledTask.template?.container?.image || ''), + ).toBeInTheDocument(); + }); + + // check for env vars + if (mockTask.closure.compiledTask.template?.container?.env) { + const envVars = mockTask.closure.compiledTask.template?.container?.env; + for (let i = 0; i < envVars.length; i++) { + waitFor(() => { + expect(getByText(envVars[i].key || '')).toBeInTheDocument(); + expect(getByText(envVars[i].value || '')).toBeInTheDocument(); + }); + } + } + }); + }); +}); diff --git a/packages/oss-console/src/components/Entities/test/TaskVersionDetailsLink.test.tsx b/packages/oss-console/src/components/Entities/test/TaskVersionDetailsLink.test.tsx new file mode 100644 index 000000000..d1a932ae5 --- /dev/null +++ b/packages/oss-console/src/components/Entities/test/TaskVersionDetailsLink.test.tsx @@ -0,0 +1,156 @@ +import { render, waitFor, screen } from '@testing-library/react'; +import * as React from 'react'; +import { createTestQueryClient } from '@clients/oss-console/test/utils'; +import { QueryClientProvider } from 'react-query'; +import { createMockTask } from '../../../models/__mocks__/taskData'; +import { Task } from '../../../models/Task/types'; +import { Identifier } from '../../../models/Common/types'; +import { versionDetailsUrlGenerator } from '../generators'; +import { TaskVersionDetailsLink } from '../VersionDetails/VersionDetailsLink'; + +jest.mock('../../../models/Task/api.ts', () => ({ + getTask: jest.fn((scope) => ({ + id: scope, + closure: { + compiledTask: { + template: { + config: {}, + id: { + resourceType: 1, + project: 'flytesnacks', + domain: 'development', + name: 'My Task', + version: '1234567890', + }, + type: 'python-task', + metadata: { + tags: {}, + runtime: { + type: 1, + version: '0.32.3', + flavor: 'python', + }, + retries: {}, + }, + interface: { + inputs: { + variables: { + s: { + type: { + schema: { + columns: [], + }, + }, + description: 's', + }, + }, + }, + outputs: { + variables: { + o0: { + type: { + schema: { + columns: [], + }, + }, + description: 'o0', + }, + }, + }, + }, + container: { + command: [], + args: [ + 'pyflyte-fast-execute', + '--additional-distribution', + 's3://union-cloud-oc-staging-dogfood/flytesnacks/development/64MA5UGSQODRA4K5NT3D4HMMRE======/scriptmode.tar.gz', + '--dest-dir', + '/root', + '--', + 'pyflyte-execute', + '--inputs', + '{{.input}}', + '--output-prefix', + '{{.outputPrefix}}', + '--raw-output-data-prefix', + '{{.rawOutputDataPrefix}}', + '--checkpoint-path', + '{{.checkpointOutputPrefix}}', + '--prev-checkpoint', + '{{.prevCheckpointPrefix}}', + '--resolver', + 'flytekit.core.python_auto_container.default_task_resolver', + '--', + 'task-module', + 'athena.athena', + 'task-name', + 'manipulate_athena_schema', + ], + env: [], + config: [], + ports: [], + image: 'ghcr.io/flyteorg/flytecookbook:athena-latest', + resources: { + requests: [], + limits: [], + }, + }, + }, + }, + createdAt: { + seconds: { + low: 1688540086, + high: 0, + unsigned: false, + }, + nanos: 358482000, + }, + }, + })), +})); + +jest.mock('../../../components/common/WaitForData', () => ({ + ...jest.requireActual('../../../components/common/WaitForData'), + WaitForData: jest.fn(({ children }) =>
    {children}
    ), +})); + +describe('TaskVersionDetailsLink', () => { + let mockTask: Task; + const queryClient = createTestQueryClient(); + + const createMocks = () => { + mockTask = createMockTask('MyTask', '1234567890'); + }; + + const renderLink = (id: Identifier) => { + return render( + + + , + ); + }; + + beforeEach(() => { + createMocks(); + }); + + it('renders and checks text', async () => { + const { id } = mockTask; + renderLink(id); + await waitFor(() => { + expect(screen.getByText('Task Details')).toBeInTheDocument(); + }); + }); + + it('renders and checks containing icon', () => { + const { id } = mockTask; + const { container } = renderLink(id); + expect(container.querySelector('svg')).not.toBeNull(); + }); + + it('renders and checks url', () => { + const { id } = mockTask; + const { container } = renderLink(id); + expect(container.querySelector('a')).toHaveAttribute('href', versionDetailsUrlGenerator(id)); + }); +}); diff --git a/packages/oss-console/src/components/Errors/DataError.tsx b/packages/oss-console/src/components/Errors/DataError.tsx new file mode 100644 index 000000000..0641326e1 --- /dev/null +++ b/packages/oss-console/src/components/Errors/DataError.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import Button from '@mui/material/Button'; +import styled from '@mui/system/styled'; +import ErrorOutline from '@mui/icons-material/ErrorOutline'; +import LockPerson from '@clients/ui-atoms/LockPerson'; +import NotFoundError from '@clients/common/Errors/NotFoundError'; +import NotAuthorizedError from '@clients/common/Errors/NotAuthorizedError'; +import { NonIdealState } from '../common/NonIdealState'; +import { PrettyError } from './PrettyError'; + +const StyledNonIdealState = styled(NonIdealState)(({ theme }) => ({ + margin: `${theme.spacing(2)} 0`, +})); + +export interface DataErrorProps { + errorTitle: string; + error?: Error; + retry?: () => void; +} + +/** A shared error component to be used when data fails to load. */ +export const DataError: React.FC = ({ error, errorTitle, retry }) => { + if (error instanceof NotFoundError) { + return ( + + ); + } + // For NotAuthorized, we will be displaying a global error. + if (error instanceof NotAuthorizedError) { + return ( + + ); + } + + const description = error ? error.message : undefined; + + const action = retry ? ( + + ) : undefined; + return ( + + {action} + + ); +}; diff --git a/packages/oss-console/src/components/Errors/DownForMaintenance.tsx b/packages/oss-console/src/components/Errors/DownForMaintenance.tsx new file mode 100644 index 000000000..d014eb3b8 --- /dev/null +++ b/packages/oss-console/src/components/Errors/DownForMaintenance.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import { BrowserRouter, Route, Switch } from 'react-router-dom'; +import { env } from '@clients/common/environment'; +import { FlyteSVGIcon } from '@clients/primitives/assets/icons/FlyteLogo'; +import { PrettyError } from './PrettyError'; + +const DownForMaintenance = () => { + const description = + env.MAINTENANCE_MODE?.length && env.MAINTENANCE_MODE !== 'true' + ? env.MAINTENANCE_MODE + : "We're undergoing planned downtime maintenance. Please check back shortly."; + return ( + + + + + } + /> + + + + + ); +}; + +export default DownForMaintenance; diff --git a/packages/oss-console/src/components/Errors/PrettyError.tsx b/packages/oss-console/src/components/Errors/PrettyError.tsx new file mode 100644 index 000000000..8d842824c --- /dev/null +++ b/packages/oss-console/src/components/Errors/PrettyError.tsx @@ -0,0 +1,133 @@ +import React from 'react'; +import PageMeta from '@clients/primitives/PageMeta'; +import Container from '@mui/material/Container'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Grid'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import { useParams } from 'react-router'; +import NotFoundLogo from '@clients/ui-atoms/NotFoundLogo'; +import { SvgIconProps } from '@mui/material/SvgIcon'; +import { Routes } from '../../routes/routes'; +import { + LOCAL_STORE_DEFAULTS, + LocalStorageProjectDomain, + getLocalStore, +} from '../common/LocalStoreDefaults'; + +export const PrettyError = ({ + title = '404 Not Found', + description = "We can't find the page that you're looking for.", + showLinks = true, + Icon = NotFoundLogo, +}: { + title?: string; + description?: string; + showLinks?: boolean; + Icon?: (props: SvgIconProps) => React.JSX.Element; +}) => { + const params = useParams<{ projectId?: string; domainId?: string }>(); + + const makeProjectUrl = () => { + const localPD: LocalStorageProjectDomain = getLocalStore(LOCAL_STORE_DEFAULTS, { + project: '', + domain: '', + }); + + const project = params.projectId || localPD.project || ''; + const domain = params.domainId || localPD.domain || ''; + + if (project && domain) { + return Routes.ProjectDashboard.makeUrl(project, domain); + } + return Routes.SelectProject.path; + }; + + /** + * React prints the \n as "\n" in the DOM, + * so we need to split on that to make new lines + */ + const makeDescriptionSpans = () => { + const descriptionSpans = description.split('\\n').filter((span) => !!span); + return descriptionSpans.map((span) => ( + + {span} +
    +
    + )); + }; + + return ( + <> + + + + + t.spacing(2), + paddingBottom: (t) => t.spacing(2), + }} + > + + {title} + + {makeDescriptionSpans()} + + {showLinks && ( + <> + + + + Here are the some helpful links instead: + + + + + + + Back to Project + + + + + + Flyte Docs + + + + )} + + + {Icon && ( + + + + )} + + + + ); +}; diff --git a/packages/console/src/components/Errors/__stories__/DataError.stories.tsx b/packages/oss-console/src/components/Errors/__stories__/DataError.stories.tsx similarity index 83% rename from packages/console/src/components/Errors/__stories__/DataError.stories.tsx rename to packages/oss-console/src/components/Errors/__stories__/DataError.stories.tsx index 9c38dc4c5..9a40e858a 100644 --- a/packages/console/src/components/Errors/__stories__/DataError.stories.tsx +++ b/packages/oss-console/src/components/Errors/__stories__/DataError.stories.tsx @@ -14,9 +14,5 @@ stories.add('Title Only', () => ( const error = new Error('A special thing we depended on did not go well.'); stories.add('Title and error', () => ( - + )); diff --git a/packages/oss-console/src/components/Errors/test/DataError.test.tsx b/packages/oss-console/src/components/Errors/test/DataError.test.tsx new file mode 100644 index 000000000..b8a2cf1bc --- /dev/null +++ b/packages/oss-console/src/components/Errors/test/DataError.test.tsx @@ -0,0 +1,30 @@ +import * as React from 'react'; +import { render } from '@testing-library/react'; +import { MemoryRouter } from 'react-router'; +import NotFoundError from '@clients/common/Errors/NotFoundError'; +import NotAuthorizedError from '@clients/common/Errors/NotAuthorizedError'; +import { DataError, DataErrorProps } from '../DataError'; + +describe('DataError', () => { + const defaultProps: DataErrorProps = { + errorTitle: 'Test Error', + }; + + it('renders message for NotAuthorized errors', () => { + const { getByText } = render( + + + , + ); + expect(getByText('Access Denied')).not.toBeEmptyDOMElement(); + }); + + it('renders not found for NotFound errors', () => { + const { getByText } = render( + + + , + ); + expect(getByText('404 Not Found')).not.toBeEmptyDOMElement(); + }); +}); diff --git a/packages/oss-console/src/components/Executions/CacheStatus.tsx b/packages/oss-console/src/components/Executions/CacheStatus.tsx new file mode 100644 index 000000000..a92c9e6ec --- /dev/null +++ b/packages/oss-console/src/components/Executions/CacheStatus.tsx @@ -0,0 +1,125 @@ +import React from 'react'; +import { type SvgIconProps } from '@mui/material/SvgIcon'; +import Tooltip from '@mui/material/Tooltip'; +import Typography from '@mui/material/Typography'; +import CachedOutlined from '@mui/icons-material/CachedOutlined'; +import ErrorOutlined from '@mui/icons-material/ErrorOutlined'; +import InfoOutlined from '@mui/icons-material/InfoOutlined'; +import SmsFailedOutlinedIcon from '@mui/icons-material/SmsFailedOutlined'; +import classnames from 'classnames'; +import MapCacheIcon from '@clients/ui-atoms/MapCacheIcon'; +import { Link as RouterLink } from 'react-router-dom'; +import styled from '@mui/system/styled'; +import { assertNever } from '../../common/utils'; +import { PublishedWithChangesOutlined } from '../common/PublishedWithChanges'; +import { useCommonStyles } from '../common/styles'; +import { CatalogCacheStatus } from '../../models/Execution/enums'; +import { TaskExecutionIdentifier } from '../../models/Execution/types'; +import { Routes } from '../../routes/routes'; +import { + cacheStatusMessages, + unknownCacheStatusString, + viewSourceExecutionString, +} from './constants'; + +const StyledTypography = styled(Typography)(({ theme }) => ({ + alignItems: 'center', + display: 'flex', + marginTop: theme.spacing(1), +})); + +/** Renders the appropriate icon for a given CatalogCacheStatus */ +const NodeExecutionCacheStatusIcon: React.ComponentType< + SvgIconProps & { + status: CatalogCacheStatus; + } +> = React.forwardRef(({ status, ...svgIconProps }, ref) => { + switch (status) { + case CatalogCacheStatus.CACHE_DISABLED: { + return ; + } + case CatalogCacheStatus.CACHE_MISS: + case CatalogCacheStatus.CACHE_SKIPPED: { + return ; + } + case CatalogCacheStatus.CACHE_HIT: { + return ; + } + case CatalogCacheStatus.CACHE_POPULATED: { + return ; + } + case CatalogCacheStatus.CACHE_LOOKUP_FAILURE: + case CatalogCacheStatus.CACHE_PUT_FAILURE: { + return ; + } + case CatalogCacheStatus.MAP_CACHE: { + return ; + } + default: { + assertNever(status as never); + // @ts-ignore + return null; + } + } +}); + +export type CacheStatusProps = SvgIconProps & { + cacheStatus: CatalogCacheStatus | null | undefined; + /** `normal` will render an icon with description message beside it + * `iconOnly` will render just the icon with the description as a tooltip + */ + variant?: 'normal' | 'iconOnly'; + sourceTaskExecutionId?: TaskExecutionIdentifier; + iconStyles?: React.CSSProperties; + className?: string; +}; + +export const CacheStatus: React.FC = ({ + cacheStatus, + sourceTaskExecutionId, + variant = 'normal', + iconStyles, + className, + ...svgIconProps +}) => { + const commonStyles = useCommonStyles(); + + if (cacheStatus == null) { + return null; + } + + const message = cacheStatusMessages[cacheStatus] || unknownCacheStatusString; + + return variant === 'iconOnly' ? ( + + + + ) : ( +
    + + + {message} + + {sourceTaskExecutionId && ( + + {viewSourceExecutionString} + + )} +
    + ); +}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/DetailsPanelContext.tsx b/packages/oss-console/src/components/Executions/ExecutionDetails/DetailsPanelContext.tsx similarity index 62% rename from packages/console/src/components/Executions/ExecutionDetails/DetailsPanelContext.tsx rename to packages/oss-console/src/components/Executions/ExecutionDetails/DetailsPanelContext.tsx index 25b78182d..6311734a8 100644 --- a/packages/console/src/components/Executions/ExecutionDetails/DetailsPanelContext.tsx +++ b/packages/oss-console/src/components/Executions/ExecutionDetails/DetailsPanelContext.tsx @@ -1,30 +1,20 @@ -import React, { - PropsWithChildren, - useContext, - useEffect, - createContext, - useState, -} from 'react'; -import { NodeExecutionIdentifier } from 'models/Execution/types'; -import { DetailsPanel } from 'components/common/DetailsPanel'; -import { TaskExecutionPhase } from 'models'; -import { Core } from '@flyteorg/flyteidl-types'; -import { isStartOrEndNode } from 'models/Node/utils'; +import React, { PropsWithChildren, useContext, useEffect, createContext, useState } from 'react'; +import Core from '@clients/common/flyteidl/core'; +import { NodeExecutionIdentifier } from '../../../models/Execution/types'; +import { DetailsPanel } from '../../common/DetailsPanel'; +import { isStartOrEndNodeId } from '../../../models/Node/utils'; import { NodeExecutionDetailsPanelContent } from './NodeExecutionDetailsPanelContent'; -import { useNodeExecutionsById } from '../contextProvider/NodeExecutionDetails'; +import { useNodeExecutionsById } from '../contextProvider/NodeExecutionDetails/WorkflowNodeExecutionsProvider'; +import { TaskExecutionPhase } from '../../../models/Execution/enums'; export interface DetailsPanelContextData { selectedExecution?: NodeExecutionIdentifier | null; - setSelectedExecution: ( - selectedExecutionId: NodeExecutionIdentifier | null, - ) => void; + setSelectedExecution: (selectedExecutionId: NodeExecutionIdentifier | null) => void; onNodeSelectionChanged: (newSelection: string[]) => void; selectedPhase: Core.TaskExecution.Phase | undefined; - setSelectedPhase: ( - value: React.SetStateAction, - ) => void; + setSelectedPhase: (value: React.SetStateAction) => void; isDetailsTabClosed: boolean; - setIsDetailsTabClosed: (boolean) => void; + setIsDetailsTabClosed: (val: boolean) => void; } export const DetailsPanelContext = createContext( @@ -40,50 +30,43 @@ export const DetailsPanelContextProvider = ({ const [selectedNodes, setSelectedNodes] = useState([]); const { nodeExecutionsById } = useNodeExecutionsById(); - const [selectedPhase, setSelectedPhase] = useState< - TaskExecutionPhase | undefined - >(undefined); + const [selectedPhase, setSelectedPhase] = useState(undefined); // Note: flytegraph allows multiple selection, but we only support showing // a single item in the details panel - const [selectedExecution, setSelectedExecution] = - useState( - selectedNodes.length - ? nodeExecutionsById[selectedNodes[0]] - ? nodeExecutionsById[selectedNodes[0]].id - : { - nodeId: selectedNodes[0], - executionId: - nodeExecutionsById[Object.keys(nodeExecutionsById)[0]].id - .executionId, - } - : null, - ); - - const [isDetailsTabClosed, setIsDetailsTabClosed] = useState( - !selectedExecution, + const [selectedExecution, setSelectedExecution] = useState( + // eslint-disable-next-line no-nested-ternary + selectedNodes.length + ? nodeExecutionsById[selectedNodes[0]] + ? nodeExecutionsById[selectedNodes[0]].id + : { + nodeId: selectedNodes[0], + executionId: nodeExecutionsById[Object.keys(nodeExecutionsById)[0]].id.executionId, + } + : null, ); + const [isDetailsTabClosed, setIsDetailsTabClosed] = useState(!selectedExecution); + useEffect(() => { setIsDetailsTabClosed(!selectedExecution); }, [selectedExecution]); const onNodeSelectionChanged = (newSelection: string[]) => { - const validSelection = newSelection.filter(nodeId => { - if (isStartOrEndNode(nodeId)) { + const validSelection = newSelection.filter((nodeId) => { + if (isStartOrEndNodeId(nodeId)) { return false; } return true; }); setSelectedNodes(validSelection); + // eslint-disable-next-line no-nested-ternary const newSelectedExecution = validSelection.length ? nodeExecutionsById[validSelection[0]] ? nodeExecutionsById[validSelection[0]].id : { nodeId: validSelection[0], - executionId: - nodeExecutionsById[Object.keys(nodeExecutionsById)[0]].id - .executionId, + executionId: nodeExecutionsById[Object.keys(nodeExecutionsById)[0]].id.executionId, } : null; setSelectedExecution(newSelectedExecution); diff --git a/packages/console/src/components/Executions/ExecutionDetails/ExecutionDetails.tsx b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionContainer.tsx similarity index 51% rename from packages/console/src/components/Executions/ExecutionDetails/ExecutionDetails.tsx rename to packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionContainer.tsx index 57c1c22e4..8f3e3bb74 100644 --- a/packages/console/src/components/Executions/ExecutionDetails/ExecutionDetails.tsx +++ b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionContainer.tsx @@ -1,40 +1,49 @@ -import * as React from 'react'; -import { useContext, useEffect } from 'react'; -import { Collapse, IconButton } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; -import ExpandMore from '@material-ui/icons/ExpandMore'; +import React, { useContext } from 'react'; +import Collapse from '@mui/material/Collapse'; +import IconButton from '@mui/material/IconButton'; +import ExpandMore from '@mui/icons-material/ExpandMore'; import classnames from 'classnames'; -import { - LargeLoadingComponent, - LargeLoadingSpinner, -} from 'components/common/LoadingSpinner'; -import { WaitForQuery } from 'components/common/WaitForQuery'; -import { withRouteParams } from 'components/common/withRouteParams'; -import { DataError } from 'components/Errors/DataError'; -import { Execution } from 'models/Execution/types'; -import { RouteComponentProps } from 'react-router-dom'; import { useQuery, useQueryClient } from 'react-query'; -import { Workflow } from 'models/Workflow/types'; -import { makeWorkflowQuery } from 'components/Workflow/workflowQueries'; -import { useBreadCrumbsGreyStyle } from 'components/Breadcrumbs'; +import styled from '@mui/system/styled'; +import PageMeta from '@clients/primitives/PageMeta'; +import { LargeLoadingComponent, LargeLoadingSpinner } from '@clients/primitives/LoadingSpinner'; +import { WaitForQuery } from '../../common/WaitForQuery'; +import { DataError } from '../../Errors/DataError'; +import { Execution } from '../../../models/Execution/types'; +import { Workflow } from '../../../models/Workflow/types'; +import { makeWorkflowQuery } from '../../../queries/workflowQueries'; import { ExecutionContext } from '../contexts'; import { useWorkflowExecutionQuery } from '../useWorkflowExecution'; import { ExecutionMetadata } from './ExecutionMetadata'; import { ExecutionNodeViews } from './ExecutionNodeViews'; -import { - NodeExecutionDetailsContextProvider, - WorkflowNodeExecutionsProvider, -} from '../contextProvider/NodeExecutionDetails'; -import { useExecutionNodeViewsStatePoll } from './useExecutionNodeViewsState'; +import { useExecutionNodeViewsStatePoll } from './useExecutionNodeViewsStatePoll'; +import { useBreadCrumbsGreyStyle } from '../../Breadcrumbs/hooks'; +import { NodeExecutionDetailsContextProvider } from '../contextProvider/NodeExecutionDetails/NodeExecutionDetailsContextProvider'; +import { WorkflowNodeExecutionsProvider } from '../contextProvider/NodeExecutionDetails/WorkflowNodeExecutionsProvider'; -const useStyles = makeStyles((theme: Theme) => ({ - expandCollapseButton: { - transition: theme.transitions.create('transform'), +export interface ExecutionDetailsRouteParams { + domainId: string; + executionId: string; + projectId: string; +} + +const StyledContainer = styled('div')(({ theme }) => ({ + position: 'relative', + height: '100%', + flexGrow: 1, + display: 'flex', + flexDirection: 'column', + '& .expandCollapseButton': { + transition: 'transform 0s linear', + transform: 'rotate(0deg)', '&.expanded': { transform: 'rotate(180deg)', }, }, - expandCollapseContainer: { + '& .relativer': { + position: 'relative', + }, + '& .expandCollapseContainer': { alignItems: 'center', bottom: 0, display: 'flex', @@ -45,13 +54,9 @@ const useStyles = makeStyles((theme: Theme) => ({ transform: 'translateY(100%)', zIndex: 1, }, - metadataContainer: { - position: 'relative', - }, })); -const ExecutionContainer: React.FC<{}> = () => { - const styles = useStyles(); +export const ExecutionContainer: React.FC<{}> = () => { const [metadataExpanded, setMetadataExpanded] = React.useState(true); const toggleMetadata = () => setMetadataExpanded(!metadataExpanded); @@ -59,37 +64,38 @@ const ExecutionContainer: React.FC<{}> = () => { return ( <> -
    - - - -
    - - - + + +
    + + + +
    + + + +
    -
    - + + ); }; -const RenderExecutionContainer: React.FC> = ({ - children, -}) => { +const RenderExecutionContainer: React.FC> = ({ children }) => { const { execution } = useContext(ExecutionContext); const { closure: { workflowId }, } = execution; - const workflowQuery = useQuery( - makeWorkflowQuery(useQueryClient(), workflowId), - ); + const queryClient = useQueryClient(); + + const workflowQuery = useQuery(makeWorkflowQuery(queryClient, workflowId)); // query to get all data to build Graph and Timeline const { nodeExecutionsQuery } = useExecutionNodeViewsStatePoll(execution); @@ -97,16 +103,16 @@ const RenderExecutionContainer: React.FC> = ({ <> {/* Fetches the current workflow to build the execution tree inside NodeExecutionDetailsContextProvider */} - {workflow => ( + {(workflow) => ( <> {/* Provides a node execution tree for the current workflow */} - + - {data => ( + {(data) => ( {children} @@ -151,42 +157,3 @@ export const ExecutionDetailsWrapper: React.FC< ); }; - -export function withExecutionDetails

    ( - WrappedComponent: React.FC

    , -) { - return (props: P) => { - const [localRouteProps, setLocalRouteProps] = React.useState

    (); - - useEffect(() => { - setLocalRouteProps(prev => { - if (JSON.stringify(prev) === JSON.stringify(props)) { - return prev; - } - - return props; - }); - }, [props]); - - if (!localRouteProps) { - return ; - } - return ( - - - - ); - }; -} - -export interface ExecutionDetailsRouteParams { - domainId: string; - executionId: string; - projectId: string; -} - -export const ExecutionDetails: React.FunctionComponent< - RouteComponentProps -> = withRouteParams( - withExecutionDetails(ExecutionContainer), -); diff --git a/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/FlyteDeckButton.tsx b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/FlyteDeckButton.tsx new file mode 100644 index 000000000..dbff7814a --- /dev/null +++ b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/FlyteDeckButton.tsx @@ -0,0 +1,119 @@ +import React, { FC, useState } from 'react'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import Close from '@mui/icons-material/Close'; +import Fullscreen from '@mui/icons-material/Fullscreen'; +import FullscreenExit from '@mui/icons-material/FullscreenExit'; +import Grid from '@mui/material/Grid'; +import IconButton from '@mui/material/IconButton'; +import Typography from '@mui/material/Typography'; +import DialogContent from '@mui/material/DialogContent'; +import t from '../strings'; +import { WorkflowNodeExecution } from '../../contexts'; +import { NodeExecutionPhase } from '../../../../models/Execution/enums'; +import { useEscapeKey } from '../../../hooks/useKeyListener'; +import { ExecutionNodeDeck } from '../ExecutionNodeDeck'; + +const fullscreenDialog = { + maxWidth: '100vw', + width: '100vw', + maxHeight: '100svh', + height: '100svh', + margin: 0, + transition: 'all 0.3s ease', + borderRadius: 0, +}; + +const dialog = { + maxWidth: `calc(100% - 96px)`, + maxHeight: `calc(100% - 96px)`, + height: '720px', + width: '880px', + transition: 'all 0.3s ease', +}; + +export interface FlyteDeckButtonProps { + nodeExecution: WorkflowNodeExecution; + phase: NodeExecutionPhase; + flyteDeckText?: string; +} +export const FlyteDeckButton: FC = ({ + nodeExecution, + phase, + flyteDeckText, +}) => { + const [showDeck, setShowDeck] = useState(false); + const [fullScreen, setSetFullScreen] = useState(false); + const onCloseDeck = () => setShowDeck(false); + // Close deck modal on escape key press + useEscapeKey(onCloseDeck); + + const toggleFullScreen = () => { + setSetFullScreen(!fullScreen); + }; + + return nodeExecution?.closure?.deckUri ? ( + <> + +

    + + + + {fullScreen ? : } + + + + + {t('flyteDeck')} + + + + + + + + + + + + + + ) : ( + <> + ); +}; diff --git a/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/RerunButton.tsx b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/RerunButton.tsx new file mode 100644 index 000000000..d8de01866 --- /dev/null +++ b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/RerunButton.tsx @@ -0,0 +1,72 @@ +import React, { FC, useState } from 'react'; +import Button from '@mui/material/Button'; +import { literalsToLiteralValueMap } from '@clients/oss-console/components/Launch/LaunchForm/utils'; +import { ResourceIdentifier } from '@clients/oss-console/models/Common/types'; +import { LaunchFormDialog } from '@clients/oss-console/components/Launch/LaunchForm/LaunchFormDialog'; +import t from '../strings'; +import { WorkflowNodeExecution } from '../../contexts'; +import { useEscapeKey } from '../../../hooks/useKeyListener'; +import { useNodeExecutionDataQuery } from '../../../hooks/useNodeExecutionDataQuery'; +import { NodeExecutionDetails } from '../../types'; +import { WaitForQuery } from '../../../common/WaitForQuery'; +import { TaskInitialLaunchParameters } from '../../../Launch/LaunchForm/types'; + +export interface RerunButtonProps { + nodeExecution: WorkflowNodeExecution; + nodeExecutionDetails?: NodeExecutionDetails; + text?: string; +} +export const RerunButton: FC = ({ + nodeExecution, + nodeExecutionDetails, + text, +}) => { + const [showLaunchForm, setShowLaunchForm] = useState(false); + const executionDataQuery = useNodeExecutionDataQuery({ + id: nodeExecution.id, + }); + useEscapeKey(() => { + setShowLaunchForm(false); + }); + + const rerunOnClick = (e: React.MouseEvent) => { + e.stopPropagation(); + setShowLaunchForm(true); + }; + + const taskTemplateId = nodeExecutionDetails?.taskTemplate?.id; + + return taskTemplateId && !nodeExecution.dynamicParentNodeId ? ( + <> + + + {(executionData) => { + const literals = executionData?.fullInputs?.literals; + const taskInputsTypes = nodeExecutionDetails?.taskTemplate?.interface?.inputs?.variables; + const initialParameters = + literals && taskInputsTypes + ? ({ + values: + literals && + taskInputsTypes && + literalsToLiteralValueMap(literals, taskInputsTypes), + taskId: taskTemplateId, + } as TaskInitialLaunchParameters) + : undefined; + return ( + <> + + + ); + }} + + + ) : null; +}; diff --git a/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/ResumeButton.tsx b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/ResumeButton.tsx new file mode 100644 index 000000000..3957e295e --- /dev/null +++ b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/ResumeButton.tsx @@ -0,0 +1,85 @@ +import React, { FC, useState } from 'react'; +import Button from '@mui/material/Button'; +import { literalsToLiteralValueMap } from '../../../Launch/LaunchForm/utils'; +import { LaunchFormDialog } from '../../../Launch/LaunchForm/LaunchFormDialog'; +import { extractCompiledNodes } from '../../../hooks/utils'; +import t from '../strings'; +import { WorkflowNodeExecution } from '../../contexts'; +import { useEscapeKey } from '../../../hooks/useKeyListener'; +import { useNodeExecutionDataQuery } from '../../../hooks/useNodeExecutionDataQuery'; +import { NodeExecutionDetails } from '../../types'; +import { WaitForQuery } from '../../../common/WaitForQuery'; +import { TaskInitialLaunchParameters } from '../../../Launch/LaunchForm/types'; +import { NodeExecutionPhase } from '../../../../models/Execution/enums'; +import { useNodeExecutionContext } from '../../contextProvider/NodeExecutionDetails/NodeExecutionDetailsContextProvider'; + +export interface ResumeButtonProps { + nodeExecution: WorkflowNodeExecution; + nodeExecutionDetails?: NodeExecutionDetails; + phase: NodeExecutionPhase; + + text?: string; +} +export const ResumeButton: FC = ({ + phase, + nodeExecution, + nodeExecutionDetails, + text, +}) => { + const { compiledWorkflowClosure } = useNodeExecutionContext(); + const [showResumeForm, setShowResumeForm] = useState(false); + + const compiledNode = extractCompiledNodes(compiledWorkflowClosure).find( + (node) => + node.id === nodeExecution?.metadata?.specNodeId || node.id === nodeExecution.id.nodeId, + ); + const executionDataQuery = useNodeExecutionDataQuery({ + id: nodeExecution.id, + }); + useEscapeKey(() => { + setShowResumeForm(false); + }); + + const onResumeClick = (e: React.MouseEvent) => { + e.stopPropagation(); + setShowResumeForm(true); + }; + const taskTemplateId = nodeExecutionDetails?.taskTemplate?.id; + + return taskTemplateId ? ( + <> + {phase === NodeExecutionPhase.PAUSED && ( + + )} + + {(executionData) => { + const literals = executionData?.fullInputs?.literals; + const taskInputsTypes = nodeExecutionDetails?.taskTemplate?.interface?.inputs?.variables; + const initialParameters = taskTemplateId + ? ({ + values: + literals && + taskInputsTypes && + literalsToLiteralValueMap(literals, taskInputsTypes), + taskId: taskTemplateId, + } as TaskInitialLaunchParameters) + : undefined; + + return ( + compiledNode && ( + + ) + ); + }} + + + ) : null; +}; diff --git a/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/index.tsx b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/index.tsx new file mode 100644 index 000000000..ef7fca13c --- /dev/null +++ b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsActions/index.tsx @@ -0,0 +1,65 @@ +import React from 'react'; +import classnames from 'classnames'; +import styled from '@mui/system/styled'; +import { NodeExecutionPhase } from '../../../../models/Execution/enums'; +import { NodeExecutionDetails } from '../../types'; +import { WorkflowNodeExecution } from '../../contexts'; +import { FlyteDeckButton } from './FlyteDeckButton'; +import { RerunButton } from './RerunButton'; +import { ResumeButton } from './ResumeButton'; + +const ActionsContainer = styled('div')(({ theme }) => ({ + borderTop: `1px solid ${theme.palette.divider}`, + marginTop: theme.spacing(2), + paddingTop: theme.spacing(2), + '& button': { + marginRight: theme.spacing(1), + }, +})); + +interface ExecutionDetailsActionsProps { + className?: string; + nodeExecutionDetails?: NodeExecutionDetails; + nodeExecution: WorkflowNodeExecution; + phase: NodeExecutionPhase; + text?: { + flyteDeckText?: string; + rerunText?: string; + resumeText?: string; + }; +} + +export const ExecutionDetailsActions = ({ + className, + nodeExecutionDetails, + nodeExecution, + phase, + text, +}: ExecutionDetailsActionsProps): JSX.Element => { + return ( + <> + + + + + + + + ); +}; diff --git a/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx new file mode 100644 index 000000000..1f206846f --- /dev/null +++ b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionDetailsAppBarContent.tsx @@ -0,0 +1,152 @@ +import React from 'react'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import Grid from '@mui/material/Grid'; +import { CircularProgressButton } from '@clients/primitives/CircularProgressButton'; +import { MoreOptionsMenu } from '../../common/MoreOptionsMenu'; +import { useCommonStyles } from '../../common/styles'; +import { history } from '../../../routes/history'; +import { Routes } from '../../../routes/routes'; +import { WorkflowExecutionPhase } from '../../../models/Execution/enums'; +import { useEscapeKey } from '../../hooks/useKeyListener'; +import { ExecutionInputsOutputsModal } from '../ExecutionInputsOutputsModal'; +import { ExecutionStatusBadge } from '../ExecutionStatusBadge'; +import { TerminateExecutionButton } from '../TerminateExecution/TerminateExecutionButton'; +import { executionIsStoppable, executionIsTerminal } from '../utils'; +import { executionActionStrings } from './constants'; +import { RelaunchExecutionForm } from './RelaunchExecutionForm'; +import { useRecoverExecutionState } from './useRecoverExecutionState'; +import { ExecutionContext } from '../contexts'; +import BreadcrumbTitleActions from '../../Breadcrumbs/components/BreadcrumbTitleActions'; + +/** Renders information about a given Execution into the NavBar */ +export const ExecutionDetailsAppBarContentInner: React.FC<{}> = () => { + const commonStyles = useCommonStyles(); + + const { execution } = React.useContext(ExecutionContext); + + const [showInputsOutputs, setShowInputsOutputs] = React.useState(false); + const [showRelaunchForm, setShowRelaunchForm] = React.useState(false); + const { phase } = execution.closure; + + const isStoppable = executionIsStoppable(execution); + const isTerminal = executionIsTerminal(execution); + const onClickShowInputsOutputs = () => setShowInputsOutputs(true); + const onClickRelaunch = () => setShowRelaunchForm(true); + const onCloseRelaunch = (_?: any) => setShowRelaunchForm(false); + + // Close modal on escape key press + useEscapeKey(onCloseRelaunch); + + const { + recoverExecution, + recoverState: { isLoading: recovering, data: recoveredId }, + } = useRecoverExecutionState(); + + React.useEffect(() => { + if (!recovering && recoveredId) { + history.push(Routes.ExecutionDetails.makeUrl(recoveredId)); + } + }, [recovering, recoveredId]); + + let modalContent: JSX.Element | null = null; + if (showInputsOutputs) { + const onClose = () => setShowInputsOutputs(false); + modalContent = ; + } + + const onClickRecover = React.useCallback(async () => { + await recoverExecution(); + }, [recoverExecution]); + + const isRecoverVisible = React.useMemo( + () => + [ + WorkflowExecutionPhase.FAILED, + WorkflowExecutionPhase.ABORTED, + WorkflowExecutionPhase.TIMED_OUT, + ].includes(phase), + [phase], + ); + + const actionContent = isStoppable ? ( + + + + ) : isTerminal ? ( + <> + {isRecoverVisible && ( + + + + )} + + + + + ) : null; + + // For non-terminal executions, add an overflow menu with the ability to clone + const moreActionsContent = !isTerminal ? ( + + + + ) : null; + return ( + <> + + + + + + + + + {actionContent && <>{actionContent}} + {moreActionsContent && <>{moreActionsContent}} + + + + + + {modalContent} + + ); +}; + +export const ExecutionDetailsAppBarContent: React.FC<{}> = () => { + return ; +}; diff --git a/packages/console/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx similarity index 62% rename from packages/console/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx rename to packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx index 84c8f214c..fef119a0c 100644 --- a/packages/console/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx +++ b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionMetadata.tsx @@ -1,48 +1,48 @@ -import * as React from 'react'; -import { Grid, Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; +import React from 'react'; +import Grid from '@mui/material/Grid'; +import Typography from '@mui/material/Typography'; import classnames from 'classnames'; -import { dashedValueString } from 'common/constants'; -import { formatDateUTC, protobufDurationToHMS } from 'common/formatters'; -import { timestampToDate } from 'common/utils'; -import { useCommonStyles } from 'components/common/styles'; -import { secondaryBackgroundColor } from 'components/Theme/constants'; import { Link as RouterLink } from 'react-router-dom'; -import { Routes } from 'routes/routes'; +import styled from '@mui/system/styled'; +import * as CommonStylesConstants from '@clients/theme/CommonStyles/constants'; +import { dashedValueString } from '@clients/common/constants'; +import { formatDateUTC, protobufDurationToHMS } from '../../../common/formatters'; +import { timestampToDate } from '../../../common/utils'; +import { useCommonStyles } from '../../common/styles'; +import { Routes } from '../../../routes/routes'; import { ExecutionContext } from '../contexts'; import { ExpandableExecutionError } from '../Tables/ExpandableExecutionError'; import { ExecutionMetadataLabels } from './constants'; import { ExecutionMetadataExtra } from './ExecutionMetadataExtra'; -const useStyles = makeStyles((theme: Theme) => { +const StyledContainer = styled('div')(({ theme }) => { return { - container: { - background: secondaryBackgroundColor, - width: '100%', - }, - detailsContainer: { + background: CommonStylesConstants.secondaryBackgroundColor, + width: '100%', + '& .detailsContainer': { display: 'flex', paddingTop: theme.spacing(1), paddingBottom: theme.spacing(2), marginTop: 0, }, - detailItem: { + '& .detailItem': { marginLeft: theme.spacing(4), }, - expandCollapseButton: { - transition: theme.transitions.create('transform'), + '& .expandCollapseButton': { + transition: 'transform 0s linear', + transform: 'rotate(0deg)', '&.expanded': { transform: 'rotate(180deg)', }, }, - expandCollapseContainer: { + '& .expandCollapseContainer': { bottom: 0, position: 'absolute', right: theme.spacing(2), transform: 'translateY(100%)', zIndex: 1, }, - version: { + '& .version': { flex: '0 1 auto', overflow: 'hidden', }, @@ -58,20 +58,24 @@ interface DetailItem { /** Renders metadata details about a given Execution */ export const ExecutionMetadata: React.FC<{}> = () => { const commonStyles = useCommonStyles(); - const styles = useStyles(); const { execution } = React.useContext(ExecutionContext); const { domain } = execution.id; - const { abortMetadata, duration, error, startedAt, workflowId } = - execution.closure; + + const abortMetadata = execution?.closure?.abortMetadata; + const duration = execution?.closure?.duration; + const error = execution?.closure?.error; + const startedAt = execution?.closure?.startedAt; + const workflowId = execution?.closure?.workflowId; + const { referenceExecution, systemMetadata } = execution.spec.metadata; const cluster = systemMetadata?.executionCluster ?? dashedValueString; const details: DetailItem[] = [ { label: ExecutionMetadataLabels.domain, value: domain }, { - className: styles.version, + className: 'version', label: ExecutionMetadataLabels.version, value: workflowId.version, }, @@ -81,9 +85,7 @@ export const ExecutionMetadata: React.FC<{}> = () => { }, { label: ExecutionMetadataLabels.time, - value: startedAt - ? formatDateUTC(timestampToDate(startedAt)) - : dashedValueString, + value: startedAt ? formatDateUTC(timestampToDate(startedAt)) : dashedValueString, }, { label: ExecutionMetadataLabels.duration, @@ -96,7 +98,7 @@ export const ExecutionMetadata: React.FC<{}> = () => { label: ExecutionMetadataLabels.relatedTo, value: ( {referenceExecution.name} @@ -106,18 +108,11 @@ export const ExecutionMetadata: React.FC<{}> = () => { } return ( -
    - + + {details.map(({ className, label, value }) => ( - - + + {label} = () => { ) : null} -
    + ); }; diff --git a/packages/console/src/components/Executions/ExecutionDetails/ExecutionMetadataExtra.tsx b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionMetadataExtra.tsx similarity index 61% rename from packages/console/src/components/Executions/ExecutionDetails/ExecutionMetadataExtra.tsx rename to packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionMetadataExtra.tsx index 52acede52..692d1616b 100644 --- a/packages/console/src/components/Executions/ExecutionDetails/ExecutionMetadataExtra.tsx +++ b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionMetadataExtra.tsx @@ -1,20 +1,18 @@ -import { Grid, Typography } from '@material-ui/core'; -import { makeStyles, Theme } from '@material-ui/core/styles'; +import React from 'react'; +import Grid from '@mui/material/Grid'; +import Typography from '@mui/material/Typography'; import classnames from 'classnames'; -import { useCommonStyles } from 'components/common/styles'; -import { Execution } from 'models/Execution/types'; -import * as React from 'react'; -import { getLaunchPlan } from 'models/Launch/api'; -import { LaunchPlanSpec } from 'models/Launch/types'; -import { dashedValueString } from 'common/constants'; +import styled from '@mui/system/styled'; +import { dashedValueString } from '@clients/common/constants'; +import { useCommonStyles } from '../../common/styles'; +import { Execution } from '../../../models/Execution/types'; +import { getLaunchPlan } from '../../../models/Launch/api'; +import { LaunchPlanSpec } from '../../../models/Launch/types'; import { ExecutionMetadataLabels } from './constants'; -const useStyles = makeStyles((theme: Theme) => ({ - detailItem: { - flexShrink: 0, - marginLeft: theme.spacing(4), - }, -})); +const StyledDetailItem = styled(Grid)(() => ({ + flexShrink: 0, +})) as typeof Grid; interface DetailItem { className?: string; @@ -31,7 +29,6 @@ export const ExecutionMetadataExtra: React.FC<{ execution: Execution; }> = ({ execution }) => { const commonStyles = useCommonStyles(); - const styles = useStyles(); const { launchPlan: launchPlanId, @@ -42,9 +39,7 @@ export const ExecutionMetadataExtra: React.FC<{ overwriteCache, } = execution.spec; - const [launchPlanSpec, setLaunchPlanSpec] = React.useState< - Partial - >({}); + const [launchPlanSpec, setLaunchPlanSpec] = React.useState>({}); React.useEffect(() => { getLaunchPlan(launchPlanId).then(({ spec }) => setLaunchPlanSpec(spec)); @@ -53,15 +48,12 @@ export const ExecutionMetadataExtra: React.FC<{ const details: DetailItem[] = [ { label: ExecutionMetadataLabels.iam, - value: - securityContext?.runAs?.iamRole || - ExecutionMetadataLabels.securityContextDefault, + value: securityContext?.runAs?.iamRole || ExecutionMetadataLabels.securityContextDefault, }, { label: ExecutionMetadataLabels.serviceAccount, value: - securityContext?.runAs?.k8sServiceAccount || - ExecutionMetadataLabels.securityContextDefault, + securityContext?.runAs?.k8sServiceAccount || ExecutionMetadataLabels.securityContextDefault, }, { label: ExecutionMetadataLabels.rawOutputPrefix, @@ -76,11 +68,7 @@ export const ExecutionMetadataExtra: React.FC<{ }, { label: ExecutionMetadataLabels.interruptible, - value: interruptible - ? interruptible.value - ? 'true' - : 'false' - : dashedValueString, + value: interruptible ? (interruptible.value ? 'true' : 'false') : dashedValueString, }, { label: ExecutionMetadataLabels.overwriteCache, @@ -91,11 +79,7 @@ export const ExecutionMetadataExtra: React.FC<{ return ( <> {details.map(({ className, label, value }) => ( - + {label} @@ -106,7 +90,7 @@ export const ExecutionMetadataExtra: React.FC<{ > {value} - + ))} ); diff --git a/packages/console/src/components/Executions/ExecutionDetails/ExecutionNodeDeck.tsx b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionNodeDeck.tsx similarity index 51% rename from packages/console/src/components/Executions/ExecutionDetails/ExecutionNodeDeck.tsx rename to packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionNodeDeck.tsx index a108d025c..d871c7e62 100644 --- a/packages/console/src/components/Executions/ExecutionDetails/ExecutionNodeDeck.tsx +++ b/packages/oss-console/src/components/Executions/ExecutionDetails/ExecutionNodeDeck.tsx @@ -1,7 +1,8 @@ import React from 'react'; -import { useDownloadLink } from 'components/hooks/useDataProxy'; -import { Core } from '@flyteorg/flyteidl-types'; -import { LoadingSpinner, WaitForData } from 'components/common'; +import Core from '@clients/common/flyteidl/core'; +import { LoadingSpinner } from '@clients/primitives/LoadingSpinner'; +import { useDownloadLink } from '../../hooks/useDataProxy'; +import { WaitForData } from '../../common/WaitForData'; /** Fetches and renders the deck data for a given `nodeExecutionId` */ export const ExecutionNodeDeck: React.FC<{ @@ -11,6 +12,21 @@ export const ExecutionNodeDeck: React.FC<{ const downloadLink = useDownloadLink(nodeExecutionId); const iFrameSrc = downloadLink?.value?.signedUrl?.[0]; + // Taken from https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#sandbox + const sandboxRules = [ + 'allow-forms', + 'allow-modals', + 'allow-orientation-lock', + 'allow-pointer-lock', + 'allow-popups', + 'allow-popups-to-escape-sandbox', + 'allow-presentation', + 'allow-same-origin', + 'allow-scripts', + 'allow-top-navigation-by-user-activation', + 'allow-downloads', + ].join(' '); + return (