From e1da8a7c8f5fa69526ef9049f15fb5abab7385d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mija=C3=ADl=20Rond=C3=B3n?= Date: Tue, 7 May 2024 09:51:59 -0500 Subject: [PATCH] feat(dashboard): new dashboard version (#780) --- .github/workflows/branch.yml | 20 +- .github/workflows/publish-docker.yml | 20 +- .github/workflows/tests.yml | 10 +- dashboard/.editorconfig | 21 + dashboard/.env-sample | 16 + dashboard/.env.sample | 8 - dashboard/.eslintrc.js | 10 - dashboard/.eslintrc.json | 3 + dashboard/.gitignore | 30 +- dashboard/.npmrc | 2 - dashboard/.nvmrc | 1 - dashboard/.prettierignore | 1 + dashboard/.prettierrc | 10 + dashboard/README.md | 213 +- dashboard/apps/web/.env.sample | 19 - dashboard/apps/web/.eslintrc.js | 7 - dashboard/apps/web/.gitignore | 34 - .../pages/api/drawer/externalEvent.test.ts | 34 - .../apps/pages/api/drawer/nodeRun.test.ts | 28 - .../api/drawer/taskDef/[name]/index.test.ts | 24 - .../apps/pages/api/drawer/taskRun.test.ts | 28 - .../apps/pages/api/drawer/userTaskRun.test.ts | 26 - .../apps/pages/api/drawer/variable.test.ts | 28 - .../pages/api/drawer/wfRun/[id]/index.test.ts | 26 - .../api/drawer/wfSpec/[name]/index.test.ts | 24 - .../pages/api/grpcMethodCallHandler.test.ts | 831 -- .../pages/api/information/taskDef.test.ts | 22 - .../pages/api/information/userTaskDef.test.ts | 24 - .../apps/pages/api/loops/taskRun.test.ts | 77 - .../apps/pages/api/metrics/taskDef.test.ts | 31 - .../apps/pages/api/metrics/wfSpec.test.ts | 35 - .../pages/api/search/externalEventDef.test.ts | 32 - .../nodeRun/[number]/[position].test.ts | 32 - .../apps/pages/api/search/taskDef.test.ts | 33 - .../apps/pages/api/search/taskRun.test.ts | 40 - .../apps/pages/api/search/userTaskDef.test.ts | 26 - .../apps/pages/api/search/userTaskRun.test.ts | 41 - .../apps/pages/api/search/wfRun.test.ts | 45 - .../apps/pages/api/search/wfSpec.test.ts | 41 - .../pages/api/visualization/wfRun.test.ts | 19 - .../pages/api/visualization/wfSpec.test.ts | 24 - .../workflowLayoutedGraph.test.ts | 57 - .../web/app/(auth)/signin/LoginButtons.tsx | 24 - .../apps/web/app/(auth)/signin/LoginPage.tsx | 53 - .../app/(auth)/signin/ProviderSigInBtn.tsx | 15 - .../web/app/(main)/components/HeaderBar.tsx | 11 - .../app/(main)/components/LoginDropdown.tsx | 51 - .../metrics/TaskExecutionMetrics.tsx | 168 - .../metrics/WorkflowExecutionMetrics.tsx | 169 - .../components/search/MetadataSearchTable.tsx | 44 - .../app/(main)/sections/MetadataSearch.tsx | 221 - .../apps/web/app/(main)/sections/Metrics.tsx | 27 - dashboard/apps/web/app/layout.tsx | 35 - dashboard/apps/web/app/page.tsx | 14 - .../metrics/TaskExecutionMetrics.tsx | 156 - .../components/search/TaskRunSearchTable.tsx | 43 - dashboard/apps/web/app/taskdef/[id]/page.tsx | 23 - .../sections/TaskDefSchemaInformation.tsx | 72 - .../[id]/sections/TaskExecutionMetrics.tsx | 28 - .../taskdef/[id]/sections/TaskRunSearch.tsx | 296 - .../[version]/components/VersionChanger.tsx | 42 - .../app/usertaskdef/[id]/[version]/page.tsx | 29 - .../search/userTaskRunSearchTable.tsx | 45 - .../sections/userTaskDefSchemaInformation.tsx | 103 - .../[version]/sections/userTaskRunSearch.tsx | 346 - .../[id]/components/visualizer/TaskNode.tsx | 29 - .../components/visualizer/WfRunVisualizer.tsx | 164 - dashboard/apps/web/app/wfrun/[id]/page.tsx | 19 - .../[id]/sections/WfRunVisualization.tsx | 13 - .../[version]/components/VersionChanger.tsx | 42 - .../components/common/VersionExtractor.ts | 7 - .../metrics/WorkflowExecutionMetrics.tsx | 161 - .../components/search/WfRunSearchTable.tsx | 41 - .../components/visualizer/EdgeTypesEnum.ts | 7 - .../components/visualizer/LabelsUtils.test.ts | 9 - .../components/visualizer/LabelsUtils.ts | 9 - .../components/visualizer/TaskNode.tsx | 14 - .../components/visualizer/WfSpecGraph.tsx | 117 - .../visualizer/WfSpecVisualizer.tsx | 138 - .../edgeTypes/CustomSmartEdgeType.tsx | 64 - .../extractors/EdgeLabelExtractor.test.ts | 694 - .../extractors/EdgeLabelExtractor.ts | 144 - .../visualizer/mappers/ElkNodeMapper.test.ts | 98 - .../visualizer/mappers/ElkNodeMapper.ts | 93 - .../visualizer/mappers/GraphLayouter.test.ts | 3137 ---- .../visualizer/mappers/GraphLayouter.ts | 200 - .../visualizer/mappers/NodeTypeMapper.test.ts | 19 - .../visualizer/mappers/NodeTypeMapper.ts | 49 - .../mappers/ReactFlowEdgeHandler.ts | 84 - .../nodeTypes/EntrypointNodeType.tsx | 19 - .../visualizer/nodeTypes/ExitNodeType.tsx | 20 - .../nodeTypes/ExternalEventNodeType.tsx | 20 - .../visualizer/nodeTypes/NopNodeType.tsx | 24 - .../visualizer/nodeTypes/SleepNodeType.tsx | 20 - .../SpawnMultipleThreadsNodeType.tsx | 20 - .../nodeTypes/SpawnThreadNodeType.tsx | 20 - .../visualizer/nodeTypes/TaskNodeType.tsx | 21 - .../visualizer/nodeTypes/UserTaskNodeType.tsx | 21 - .../nodeTypes/WaitForThreadsNodeType.tsx | 21 - .../web/app/wfspec/[id]/[version]/page.tsx | 25 - .../[id]/[version]/sections/WfRunSearch.tsx | 348 - .../sections/WfSpecVisualization.tsx | 16 - .../sections/WorkflowExecutionMetrics.tsx | 29 - dashboard/apps/web/components/Breadcrumbs.tsx | 45 - .../web/components/Charts/LatencyChart.tsx | 373 - .../components/Charts/LatencyTaskChart.tsx | 378 - .../web/components/Charts/NewScrollBar.tsx | 139 - .../apps/web/components/Charts/TaskChart.tsx | 293 - .../web/components/Charts/WorkflowsChart.tsx | 333 - .../apps/web/components/CheckSession.tsx | 53 - .../apps/web/components/Drawer/Drawer.tsx | 17 - .../web/components/Drawer/DrawerComponent.tsx | 515 - .../Drawer/WfSpecDrawerComponent.tsx | 315 - .../apps/web/components/Drawer/WfVariable.tsx | 119 - .../web/components/Drawer/arrow-right.svg | 4 - .../internals/ExternalEventInformation.tsx | 158 - .../Drawer/internals/FailureInformation.tsx | 79 - .../Drawer/internals/NOPInformation.tsx | 112 - .../components/Drawer/internals/NodeData.tsx | 27 - .../Drawer/internals/SleepNodeInformation.tsx | 74 - .../internals/SpawnChildInformation.tsx | 83 - .../Drawer/internals/TaskInformation.tsx | 277 - .../internals/ThreadRunsHandler.test.ts | 219 - .../Drawer/internals/ThreadRunsHandler.ts | 33 - .../internals/UserTaskNodeInformation.tsx | 185 - .../internals/WaitForThreadsInformation.tsx | 128 - .../Drawer/internals/correct-arrow.svg | 4 - .../Drawer/internals/drawerInternals.ts | 60 - .../components/Drawer/internals/exception.svg | 4 - .../extractors/SleepLabelExtractor.test.ts | 49 - .../extractors/SleepLabelExtractor.ts | 22 - .../web/components/Drawer/internals/link.svg | 3 - .../components/Drawer/internals/polyline.svg | 3 - .../Drawer/internals/spawn-child.svg | 4 - .../Drawer/internals/split-arrow.svg | 4 - .../apps/web/components/SessionProvider.tsx | 10 - .../apps/web/components/Snippet/Snippet.tsx | 27 - .../apps/web/components/Snippet/index.tsx | 3 - .../WFRunInformationSideBar.tsx | 40 - .../WFRunInformationSideBar/index.tsx | 3 - .../web/contexts/FeatureToggleContext.tsx | 20 - dashboard/apps/web/global.scss | 1 - dashboard/apps/web/helpers/nodename.ts | 12 - .../apps/web/helpers/parseValueByType.ts | 9 - .../apps/web/interfaces/InputVarsTaskDef.ts | 5 - .../apps/web/interfaces/TaskDefInformation.ts | 7 - .../interfaces/TaskDefInformationResponse.ts | 6 - .../apps/web/littlehorse-public-api/acls.ts | 1039 -- .../littlehorse-public-api/common_enums.ts | 531 - .../littlehorse-public-api/common_wfspec.ts | 1593 --- .../littlehorse-public-api/external_event.ts | 425 - .../google/protobuf/empty.ts | 71 - .../google/protobuf/timestamp.ts | 214 - .../web/littlehorse-public-api/node_run.ts | 1696 --- .../web/littlehorse-public-api/object_id.ts | 1537 -- .../web/littlehorse-public-api/service.ts | 9201 ------------ .../web/littlehorse-public-api/task_def.ts | 139 - .../web/littlehorse-public-api/task_run.ts | 1021 -- .../web/littlehorse-public-api/user_tasks.ts | 1725 --- .../web/littlehorse-public-api/variable.ts | 393 - .../apps/web/littlehorse-public-api/wf_run.ts | 1645 --- .../web/littlehorse-public-api/wf_spec.ts | 3699 ----- .../littlehorse-public-api/workflow_event.ts | 246 - dashboard/apps/web/middleware.ts | 36 - dashboard/apps/web/next-env.d.ts | 6 - dashboard/apps/web/next.config.js | 12 - dashboard/apps/web/package.json | 48 - dashboard/apps/web/pages/api/LHClient.ts | 60 - .../apps/web/pages/api/auth/[...nextauth].ts | 89 - .../web/pages/api/drawer/externalEvent.ts | 19 - .../apps/web/pages/api/drawer/nodeRun.ts | 21 - .../pages/api/drawer/taskDef/[name]/index.ts | 12 - .../apps/web/pages/api/drawer/taskRun.ts | 18 - .../apps/web/pages/api/drawer/userTaskRun.ts | 20 - .../apps/web/pages/api/drawer/variable.ts | 20 - .../web/pages/api/drawer/wfRun/[id]/index.ts | 16 - .../pages/api/drawer/wfSpec/[name]/index.ts | 12 - .../web/pages/api/grpcMethodCallHandler.ts | 65 - .../apps/web/pages/api/information/taskDef.ts | 15 - .../web/pages/api/information/userTaskDef.ts | 18 - dashboard/apps/web/pages/api/loops/taskRun.ts | 55 - .../apps/web/pages/api/metrics/taskDef.ts | 18 - .../apps/web/pages/api/metrics/wfSpec.ts | 21 - .../web/pages/api/search/externalEventDef.ts | 9 - .../api/search/nodeRun/[number]/[position].ts | 24 - .../apps/web/pages/api/search/taskDef.ts | 9 - .../apps/web/pages/api/search/taskRun.ts | 9 - .../apps/web/pages/api/search/userTaskDef.ts | 9 - .../apps/web/pages/api/search/userTaskRun.ts | 13 - dashboard/apps/web/pages/api/search/wfRun.ts | 9 - dashboard/apps/web/pages/api/search/wfSpec.ts | 17 - .../apps/web/pages/api/visualization/wfRun.ts | 15 - .../web/pages/api/visualization/wfSpec.ts | 16 - .../visualization/workflowLayoutedGraph.ts | 69 - dashboard/apps/web/providers/index.tsx | 23 - dashboard/apps/web/public/ENTRYPOINT.svg | 4 - dashboard/apps/web/public/EXCEPTION.svg | 4 - dashboard/apps/web/public/EXIT.svg | 4 - dashboard/apps/web/public/EXTERNAL_EVENT.svg | 4 - dashboard/apps/web/public/LH Logo.svg | 22 - dashboard/apps/web/public/NOP.svg | 4 - dashboard/apps/web/public/SLEEP.svg | 4 - dashboard/apps/web/public/SLEEP2.svg | 4 - dashboard/apps/web/public/START_THREAD.svg | 4 - dashboard/apps/web/public/Spinner.svg | 7 - dashboard/apps/web/public/TASK.svg | 4 - dashboard/apps/web/public/TASKICON.svg | 4 - dashboard/apps/web/public/USER_TASK.svg | 4 - dashboard/apps/web/public/WAIT_FOR_THREAD.svg | 4 - .../apps/web/public/WAIT_FOR_THREADS.svg | 4 - dashboard/apps/web/public/add.svg | 3 - dashboard/apps/web/public/chevron_right.svg | 3 - dashboard/apps/web/public/distance.svg | 4 - dashboard/apps/web/public/expand_more.svg | 3 - dashboard/apps/web/public/key.svg | 3 - dashboard/apps/web/public/link.svg | 3 - dashboard/apps/web/public/littlehorse.svg | 4 - dashboard/apps/web/public/logo-lh.svg | 15 - dashboard/apps/web/public/loop.svg | 3 - dashboard/apps/web/public/polyline.svg | 3 - dashboard/apps/web/public/replay.svg | 3 - dashboard/apps/web/public/search.svg | 3 - dashboard/apps/web/tsconfig.json | 21 - dashboard/jest.config.js | 5 - dashboard/jest.config.ts | 18 + dashboard/jest.setup.js | 2 + dashboard/meta.json | 7 - dashboard/next.config.mjs | 30 + dashboard/package-lock.json | 11907 ++++++++++++++++ dashboard/package.json | 66 +- .../packages/eslint-config-custom/next.js | 93 - .../eslint-config-custom/package.json | 12 - dashboard/packages/tsconfig/base.json | 20 - dashboard/packages/tsconfig/nextjs.json | 21 - dashboard/packages/tsconfig/package.json | 9 - .../packages/tsconfig/react-library.json | 11 - dashboard/packages/ui/Header.tsx | 5 - .../packages/ui/components/Button/Button.tsx | 27 - .../ui/components/Button/_button.scss | 60 - .../packages/ui/components/Button/index.tsx | 1 - .../ui/components/Calendar/Calendar.tsx | 151 - .../ui/components/Calendar/CalendarB.tsx | 73 - .../CalendarCanvas/CalendarCanvas.tsx | 93 - .../CalendarCanvas/CalendarCanvasB.tsx | 87 - .../Calendar/CalendarCanvas/index.ts | 2 - .../Calendar/CalendarComponents/CInput.tsx | 25 - .../Calendar/CalendarComponents/Content.tsx | 318 - .../CalendarComponents/YearSelector.tsx | 32 - .../Calendar/CalendarComponents/index.ts | 3 - .../ui/components/Calendar/_calendar.scss | 437 - .../packages/ui/components/Calendar/index.ts | 2 - .../packages/ui/components/Container.tsx | 5 - .../ui/components/Drawer/DrawerHeader.tsx | 15 - .../ui/components/Drawer/DrawerLink.tsx | 13 - .../ui/components/Drawer/DrawerSection.tsx | 11 - .../Drawer/DrawerThreadSpecLink.tsx | 11 - .../packages/ui/components/Drawer/index.ts | 4 - .../packages/ui/components/HeaderBar.tsx | 9 - .../packages/ui/components/Input/Input.tsx | 9 - .../packages/ui/components/Input/_input.scss | 38 - .../packages/ui/components/Label/Label.tsx | 9 - .../packages/ui/components/Label/_label.scss | 10 - .../LoadMoreButton/LoadMoreButton.tsx | 36 - .../LoadMoreButton/_load_more_button.scss | 50 - .../ui/components/LoadMoreButton/index.tsx | 1 - dashboard/packages/ui/components/Loader.tsx | 7 - dashboard/packages/ui/components/Loading.tsx | 19 - .../ui/components/PerPage/PerPage.tsx | 35 - .../ui/components/PerPage/_per_page.scss | 62 - .../packages/ui/components/Titles/H1/H1.tsx | 9 - .../ui/components/Titles/H1/index.tsx | 1 - .../packages/ui/components/Titles/H2/H2.tsx | 9 - .../ui/components/Titles/H2/index.tsx | 1 - .../packages/ui/components/Titles/H3/H3.tsx | 9 - .../ui/components/Titles/H3/index.tsx | 1 - .../packages/ui/components/Titles/H4/H4.tsx | 9 - .../ui/components/Titles/H4/index.tsx | 1 - .../packages/ui/components/Titles/H5/H5.tsx | 9 - .../ui/components/Titles/H5/index.tsx | 1 - .../packages/ui/components/Titles/index.ts | 5 - dashboard/packages/ui/index.tsx | 25 - dashboard/packages/ui/package.json | 26 - dashboard/packages/ui/styles.scss | 308 - dashboard/packages/ui/styles/_components.scss | 107 - dashboard/packages/ui/styles/_drawer.scss | 770 - dashboard/packages/ui/styles/_login.scss | 77 - .../ui/styles/_react_flow_custom.scss | 7 - dashboard/packages/ui/styles/_scrollbar.scss | 26 - dashboard/packages/ui/styles/_table_cell.scss | 28 - .../packages/ui/styles/_table_scrollbar.scss | 30 - dashboard/packages/ui/styles/_variables.scss | 7 - dashboard/packages/ui/styles/_visualizer.scss | 127 - .../ui/styles/_wf_extra_information.scss | 20 - dashboard/packages/ui/tsconfig.json | 5 - .../packages/ui/turbo/generators/config.ts | 30 - .../turbo/generators/templates/component.hbs | 14 - dashboard/packages/ui/utils/calendarUtils.tsx | 9 - dashboard/packages/ui/utils/index.ts | 2 - .../packages/ui/utils/useOutsideClick.tsx | 35 - dashboard/pnpm-lock.yaml | 7154 ---------- dashboard/pnpm-workspace.yaml | 3 - dashboard/postcss.config.js | 6 + .../(diagram)/components/Diagram.tsx | 76 + .../components/EdgeTypes/Default.tsx | 48 + .../components/EdgeTypes/EdgeDetails.tsx | 22 + .../components/EdgeTypes/extractEdges.ts | 59 + .../(diagram)/components/EdgeTypes/index.ts | 6 + .../(diagram)/components/Layouter.tsx | 57 + .../(diagram)/components/Modals/Modals.tsx | 10 + .../(diagram)/components/Modals/TaskRun.tsx | 69 + .../(diagram)/components/Modals/index.ts | 13 + .../components/NodeTypes/Entrypoint.tsx | 12 + .../(diagram)/components/NodeTypes/Exit.tsx | 36 + .../components/NodeTypes/ExternalEvent.tsx | 51 + .../(diagram)/components/NodeTypes/Fade.tsx | 13 + .../components/NodeTypes/NodeDetails.tsx | 49 + .../(diagram)/components/NodeTypes/Nop.tsx | 23 + .../(diagram)/components/NodeTypes/Sleep.tsx | 23 + .../NodeTypes/StartMultipleThreads.tsx | 79 + .../components/NodeTypes/StartThread.tsx | 53 + .../components/NodeTypes/StatusPin.tsx | 66 + .../components/NodeTypes/Task/Task.tsx | 34 + .../components/NodeTypes/Task/TaskDetails.tsx | 91 + .../components/NodeTypes/Task/getTaskRun.ts | 10 + .../components/NodeTypes/Task/index.ts | 1 + .../components/NodeTypes/UserTask.tsx | 61 + .../components/NodeTypes/WaitForThreads.tsx | 48 + .../components/NodeTypes/extractNodes.ts | 71 + .../(diagram)/components/NodeTypes/index.ts | 33 + .../(diagram)/components/ThreadPanel.tsx | 71 + .../(diagram)/context/ModalContext.tsx | 23 + .../(diagram)/context/ThreadContext.tsx | 13 + .../(diagram)/context/index.ts | 2 + .../(diagram)/hooks/useModal.tsx | 7 + .../(diagram)/hooks/useScrollbar.tsx | 31 + .../(diagram)/hooks/useThread.tsx | 7 + .../app/(authenticated)/(diagram)/layout.tsx | 18 + .../wfRun/[...ids]/components/Details.tsx | 52 + .../wfRun/[...ids]/components/WfRun.tsx | 24 + .../(diagram)/wfRun/[...ids]/getWfRun.ts | 46 + .../(diagram)/wfRun/[...ids]/page.tsx | 23 + .../wfSpec/[...props]/actions/getVersions.ts | 29 + .../wfSpec/[...props]/actions/getWfSpec.ts | 20 + .../wfSpec/[...props]/actions/searchWfRun.ts | 10 + .../wfSpec/[...props]/components/Details.tsx | 28 + .../[...props]/components/Mutations.tsx | 57 + .../wfSpec/[...props]/components/Thread.tsx | 32 + .../[...props]/components/Variables.tsx | 30 + .../wfSpec/[...props]/components/Versions.tsx | 27 + .../wfSpec/[...props]/components/WfRuns.tsx | 85 + .../[...props]/components/WfRunsHeader.tsx | 58 + .../wfSpec/[...props]/components/WfSpec.tsx | 27 + .../(diagram)/wfSpec/[...props]/page.tsx | 31 + .../app/(authenticated)/components/Header.tsx | 27 + .../(authenticated)/components/Navigation.tsx | 20 + .../(authenticated)/components/Principal.tsx | 52 + .../components/QueryProvider.tsx | 8 + .../app/(authenticated)/components/Search.tsx | 54 + .../components/SearchFooter.tsx | 36 + .../components/SearchHeader.tsx | 41 + .../components/TenantSelector.tsx | 62 + .../components/VersionSelector.tsx | 40 + .../components/searchAction.ts | 78 + .../tables/ExternalEventDefTable.tsx | 26 + .../components/tables/TaskDefTable.tsx | 26 + .../components/tables/UserTaskDefTable.tsx | 30 + .../components/tables/WfSpecTable.tsx | 30 + .../components/tables/index.ts | 10 + dashboard/src/app/(authenticated)/error.tsx | 24 + .../[name]/components/Details.tsx | 22 + .../[name]/components/ExternalEventDef.tsx | 17 + .../[name]/components/InputVars.tsx | 21 + .../[name]/getExternalEventDef.ts | 13 + .../externalEventDef/[name]/page.tsx | 23 + dashboard/src/app/(authenticated)/layout.tsx | 28 + dashboard/src/app/(authenticated)/page.tsx | 5 + .../taskDef/[name]/components/Details.tsx | 14 + .../taskDef/[name]/components/InputVars.tsx | 21 + .../taskDef/[name]/components/TaskDef.tsx | 18 + .../taskDef/[name]/getTaskDef.ts | 15 + .../(authenticated)/taskDef/[name]/page.tsx | 23 + .../[...props]/components/Details.tsx | 20 + .../[...props]/components/Fields.tsx | 24 + .../[...props]/components/UserTaskDef.tsx | 18 + .../[...props]/components/Versions.tsx | 27 + .../[...props]/components/getVersions.ts | 26 + .../userTaskDef/[...props]/getUserTaskDef.ts | 21 + .../userTaskDef/[...props]/page.tsx | 27 + .../app/api/auth/[...nextauth]/authOptions.ts | 44 + .../src/app/api/auth/[...nextauth]/route.ts | 6 + .../src/app/api/auth/signin/LoginButton.tsx | 17 + .../app/api/auth/signin}/handsome-horse.png | Bin dashboard/src/app/api/auth/signin/page.tsx | 35 + dashboard/src/app/constants.ts | 39 + dashboard/src/app/getWhoami.ts | 36 + dashboard/src/app/globals.css | 15 + dashboard/src/app/layout.tsx | 21 + dashboard/src/app/lhClient.ts | 11 + dashboard/src/app/utils/date.ts | 11 + dashboard/src/app/utils/index.ts | 3 + dashboard/src/app/utils/variables.test.ts | 101 + dashboard/src/app/utils/variables.ts | 34 + dashboard/src/app/utils/wfRun.test.ts | 30 + dashboard/src/app/utils/wfRun.ts | 11 + dashboard/src/contexts/WhoAmIContext.tsx | 35 + dashboard/src/lhConfig.ts | 21 + dashboard/src/littlehorse.svg | 3 + dashboard/src/middleware.ts | 24 + dashboard/src/setTenant.ts | 6 + dashboard/src/types/index.ts | 19 + dashboard/src/types/next-auth.d.ts | 15 + dashboard/tailwind.config.ts | 26 + dashboard/tsconfig.json | 26 + dashboard/turbo.json | 37 - docker/dashboard/Dockerfile | 33 +- docker/dashboard/docker-entrypoint.sh | 49 - docker/dashboard/entrypoint.sh | 43 + docker/standalone/Dockerfile | 7 +- docker/standalone/dashboard-entrypoint.sh | 4 +- local-dev/build.sh | 4 +- package-lock.json | 6 + 421 files changed, 15625 insertions(+), 51120 deletions(-) create mode 100644 dashboard/.editorconfig create mode 100644 dashboard/.env-sample delete mode 100644 dashboard/.env.sample delete mode 100644 dashboard/.eslintrc.js create mode 100644 dashboard/.eslintrc.json delete mode 100644 dashboard/.npmrc delete mode 100644 dashboard/.nvmrc create mode 100644 dashboard/.prettierignore create mode 100644 dashboard/.prettierrc delete mode 100644 dashboard/apps/web/.env.sample delete mode 100644 dashboard/apps/web/.eslintrc.js delete mode 100644 dashboard/apps/web/.gitignore delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/drawer/externalEvent.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/drawer/nodeRun.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/drawer/taskDef/[name]/index.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/drawer/taskRun.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/drawer/userTaskRun.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/drawer/variable.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/drawer/wfRun/[id]/index.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/drawer/wfSpec/[name]/index.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/grpcMethodCallHandler.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/information/taskDef.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/information/userTaskDef.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/loops/taskRun.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/metrics/taskDef.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/metrics/wfSpec.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/search/externalEventDef.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/search/nodeRun/[number]/[position].test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/search/taskDef.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/search/taskRun.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/search/userTaskDef.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/search/userTaskRun.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/search/wfRun.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/search/wfSpec.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/visualization/wfRun.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/visualization/wfSpec.test.ts delete mode 100644 dashboard/apps/web/__tests__/apps/pages/api/visualization/workflowLayoutedGraph.test.ts delete mode 100644 dashboard/apps/web/app/(auth)/signin/LoginButtons.tsx delete mode 100644 dashboard/apps/web/app/(auth)/signin/LoginPage.tsx delete mode 100644 dashboard/apps/web/app/(auth)/signin/ProviderSigInBtn.tsx delete mode 100644 dashboard/apps/web/app/(main)/components/HeaderBar.tsx delete mode 100644 dashboard/apps/web/app/(main)/components/LoginDropdown.tsx delete mode 100644 dashboard/apps/web/app/(main)/components/metrics/TaskExecutionMetrics.tsx delete mode 100644 dashboard/apps/web/app/(main)/components/metrics/WorkflowExecutionMetrics.tsx delete mode 100644 dashboard/apps/web/app/(main)/components/search/MetadataSearchTable.tsx delete mode 100644 dashboard/apps/web/app/(main)/sections/MetadataSearch.tsx delete mode 100644 dashboard/apps/web/app/(main)/sections/Metrics.tsx delete mode 100644 dashboard/apps/web/app/layout.tsx delete mode 100644 dashboard/apps/web/app/page.tsx delete mode 100644 dashboard/apps/web/app/taskdef/[id]/components/metrics/TaskExecutionMetrics.tsx delete mode 100644 dashboard/apps/web/app/taskdef/[id]/components/search/TaskRunSearchTable.tsx delete mode 100644 dashboard/apps/web/app/taskdef/[id]/page.tsx delete mode 100644 dashboard/apps/web/app/taskdef/[id]/sections/TaskDefSchemaInformation.tsx delete mode 100644 dashboard/apps/web/app/taskdef/[id]/sections/TaskExecutionMetrics.tsx delete mode 100644 dashboard/apps/web/app/taskdef/[id]/sections/TaskRunSearch.tsx delete mode 100644 dashboard/apps/web/app/usertaskdef/[id]/[version]/components/VersionChanger.tsx delete mode 100644 dashboard/apps/web/app/usertaskdef/[id]/[version]/page.tsx delete mode 100644 dashboard/apps/web/app/usertaskdef/[id]/[version]/search/userTaskRunSearchTable.tsx delete mode 100644 dashboard/apps/web/app/usertaskdef/[id]/[version]/sections/userTaskDefSchemaInformation.tsx delete mode 100644 dashboard/apps/web/app/usertaskdef/[id]/[version]/sections/userTaskRunSearch.tsx delete mode 100644 dashboard/apps/web/app/wfrun/[id]/components/visualizer/TaskNode.tsx delete mode 100644 dashboard/apps/web/app/wfrun/[id]/components/visualizer/WfRunVisualizer.tsx delete mode 100644 dashboard/apps/web/app/wfrun/[id]/page.tsx delete mode 100644 dashboard/apps/web/app/wfrun/[id]/sections/WfRunVisualization.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/VersionChanger.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/common/VersionExtractor.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/metrics/WorkflowExecutionMetrics.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/search/WfRunSearchTable.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/EdgeTypesEnum.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/LabelsUtils.test.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/LabelsUtils.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/TaskNode.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/WfSpecGraph.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/WfSpecVisualizer.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/edgeTypes/CustomSmartEdgeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/extractors/EdgeLabelExtractor.test.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/extractors/EdgeLabelExtractor.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ElkNodeMapper.test.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ElkNodeMapper.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter.test.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/NodeTypeMapper.test.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/NodeTypeMapper.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ReactFlowEdgeHandler.ts delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/EntrypointNodeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/ExitNodeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/ExternalEventNodeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/NopNodeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SleepNodeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SpawnMultipleThreadsNodeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SpawnThreadNodeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/TaskNodeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/UserTaskNodeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/WaitForThreadsNodeType.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/page.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/sections/WfRunSearch.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/sections/WfSpecVisualization.tsx delete mode 100644 dashboard/apps/web/app/wfspec/[id]/[version]/sections/WorkflowExecutionMetrics.tsx delete mode 100644 dashboard/apps/web/components/Breadcrumbs.tsx delete mode 100644 dashboard/apps/web/components/Charts/LatencyChart.tsx delete mode 100644 dashboard/apps/web/components/Charts/LatencyTaskChart.tsx delete mode 100644 dashboard/apps/web/components/Charts/NewScrollBar.tsx delete mode 100644 dashboard/apps/web/components/Charts/TaskChart.tsx delete mode 100644 dashboard/apps/web/components/Charts/WorkflowsChart.tsx delete mode 100644 dashboard/apps/web/components/CheckSession.tsx delete mode 100644 dashboard/apps/web/components/Drawer/Drawer.tsx delete mode 100644 dashboard/apps/web/components/Drawer/DrawerComponent.tsx delete mode 100644 dashboard/apps/web/components/Drawer/WfSpecDrawerComponent.tsx delete mode 100644 dashboard/apps/web/components/Drawer/WfVariable.tsx delete mode 100644 dashboard/apps/web/components/Drawer/arrow-right.svg delete mode 100644 dashboard/apps/web/components/Drawer/internals/ExternalEventInformation.tsx delete mode 100644 dashboard/apps/web/components/Drawer/internals/FailureInformation.tsx delete mode 100644 dashboard/apps/web/components/Drawer/internals/NOPInformation.tsx delete mode 100644 dashboard/apps/web/components/Drawer/internals/NodeData.tsx delete mode 100644 dashboard/apps/web/components/Drawer/internals/SleepNodeInformation.tsx delete mode 100644 dashboard/apps/web/components/Drawer/internals/SpawnChildInformation.tsx delete mode 100644 dashboard/apps/web/components/Drawer/internals/TaskInformation.tsx delete mode 100644 dashboard/apps/web/components/Drawer/internals/ThreadRunsHandler.test.ts delete mode 100644 dashboard/apps/web/components/Drawer/internals/ThreadRunsHandler.ts delete mode 100644 dashboard/apps/web/components/Drawer/internals/UserTaskNodeInformation.tsx delete mode 100644 dashboard/apps/web/components/Drawer/internals/WaitForThreadsInformation.tsx delete mode 100644 dashboard/apps/web/components/Drawer/internals/correct-arrow.svg delete mode 100644 dashboard/apps/web/components/Drawer/internals/drawerInternals.ts delete mode 100644 dashboard/apps/web/components/Drawer/internals/exception.svg delete mode 100644 dashboard/apps/web/components/Drawer/internals/extractors/SleepLabelExtractor.test.ts delete mode 100644 dashboard/apps/web/components/Drawer/internals/extractors/SleepLabelExtractor.ts delete mode 100644 dashboard/apps/web/components/Drawer/internals/link.svg delete mode 100644 dashboard/apps/web/components/Drawer/internals/polyline.svg delete mode 100644 dashboard/apps/web/components/Drawer/internals/spawn-child.svg delete mode 100644 dashboard/apps/web/components/Drawer/internals/split-arrow.svg delete mode 100644 dashboard/apps/web/components/SessionProvider.tsx delete mode 100644 dashboard/apps/web/components/Snippet/Snippet.tsx delete mode 100644 dashboard/apps/web/components/Snippet/index.tsx delete mode 100644 dashboard/apps/web/components/WFRunInformationSideBar/WFRunInformationSideBar.tsx delete mode 100644 dashboard/apps/web/components/WFRunInformationSideBar/index.tsx delete mode 100644 dashboard/apps/web/contexts/FeatureToggleContext.tsx delete mode 100644 dashboard/apps/web/global.scss delete mode 100644 dashboard/apps/web/helpers/nodename.ts delete mode 100644 dashboard/apps/web/helpers/parseValueByType.ts delete mode 100644 dashboard/apps/web/interfaces/InputVarsTaskDef.ts delete mode 100644 dashboard/apps/web/interfaces/TaskDefInformation.ts delete mode 100644 dashboard/apps/web/interfaces/TaskDefInformationResponse.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/acls.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/common_enums.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/common_wfspec.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/external_event.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/google/protobuf/empty.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/google/protobuf/timestamp.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/node_run.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/object_id.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/service.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/task_def.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/task_run.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/user_tasks.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/variable.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/wf_run.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/wf_spec.ts delete mode 100644 dashboard/apps/web/littlehorse-public-api/workflow_event.ts delete mode 100644 dashboard/apps/web/middleware.ts delete mode 100644 dashboard/apps/web/next-env.d.ts delete mode 100644 dashboard/apps/web/next.config.js delete mode 100644 dashboard/apps/web/package.json delete mode 100644 dashboard/apps/web/pages/api/LHClient.ts delete mode 100644 dashboard/apps/web/pages/api/auth/[...nextauth].ts delete mode 100644 dashboard/apps/web/pages/api/drawer/externalEvent.ts delete mode 100644 dashboard/apps/web/pages/api/drawer/nodeRun.ts delete mode 100644 dashboard/apps/web/pages/api/drawer/taskDef/[name]/index.ts delete mode 100644 dashboard/apps/web/pages/api/drawer/taskRun.ts delete mode 100644 dashboard/apps/web/pages/api/drawer/userTaskRun.ts delete mode 100644 dashboard/apps/web/pages/api/drawer/variable.ts delete mode 100644 dashboard/apps/web/pages/api/drawer/wfRun/[id]/index.ts delete mode 100644 dashboard/apps/web/pages/api/drawer/wfSpec/[name]/index.ts delete mode 100644 dashboard/apps/web/pages/api/grpcMethodCallHandler.ts delete mode 100644 dashboard/apps/web/pages/api/information/taskDef.ts delete mode 100644 dashboard/apps/web/pages/api/information/userTaskDef.ts delete mode 100644 dashboard/apps/web/pages/api/loops/taskRun.ts delete mode 100644 dashboard/apps/web/pages/api/metrics/taskDef.ts delete mode 100644 dashboard/apps/web/pages/api/metrics/wfSpec.ts delete mode 100644 dashboard/apps/web/pages/api/search/externalEventDef.ts delete mode 100644 dashboard/apps/web/pages/api/search/nodeRun/[number]/[position].ts delete mode 100644 dashboard/apps/web/pages/api/search/taskDef.ts delete mode 100644 dashboard/apps/web/pages/api/search/taskRun.ts delete mode 100644 dashboard/apps/web/pages/api/search/userTaskDef.ts delete mode 100644 dashboard/apps/web/pages/api/search/userTaskRun.ts delete mode 100644 dashboard/apps/web/pages/api/search/wfRun.ts delete mode 100644 dashboard/apps/web/pages/api/search/wfSpec.ts delete mode 100644 dashboard/apps/web/pages/api/visualization/wfRun.ts delete mode 100644 dashboard/apps/web/pages/api/visualization/wfSpec.ts delete mode 100644 dashboard/apps/web/pages/api/visualization/workflowLayoutedGraph.ts delete mode 100644 dashboard/apps/web/providers/index.tsx delete mode 100644 dashboard/apps/web/public/ENTRYPOINT.svg delete mode 100644 dashboard/apps/web/public/EXCEPTION.svg delete mode 100644 dashboard/apps/web/public/EXIT.svg delete mode 100644 dashboard/apps/web/public/EXTERNAL_EVENT.svg delete mode 100644 dashboard/apps/web/public/LH Logo.svg delete mode 100644 dashboard/apps/web/public/NOP.svg delete mode 100644 dashboard/apps/web/public/SLEEP.svg delete mode 100644 dashboard/apps/web/public/SLEEP2.svg delete mode 100644 dashboard/apps/web/public/START_THREAD.svg delete mode 100644 dashboard/apps/web/public/Spinner.svg delete mode 100644 dashboard/apps/web/public/TASK.svg delete mode 100644 dashboard/apps/web/public/TASKICON.svg delete mode 100644 dashboard/apps/web/public/USER_TASK.svg delete mode 100644 dashboard/apps/web/public/WAIT_FOR_THREAD.svg delete mode 100644 dashboard/apps/web/public/WAIT_FOR_THREADS.svg delete mode 100644 dashboard/apps/web/public/add.svg delete mode 100644 dashboard/apps/web/public/chevron_right.svg delete mode 100644 dashboard/apps/web/public/distance.svg delete mode 100644 dashboard/apps/web/public/expand_more.svg delete mode 100644 dashboard/apps/web/public/key.svg delete mode 100644 dashboard/apps/web/public/link.svg delete mode 100644 dashboard/apps/web/public/littlehorse.svg delete mode 100644 dashboard/apps/web/public/logo-lh.svg delete mode 100644 dashboard/apps/web/public/loop.svg delete mode 100644 dashboard/apps/web/public/polyline.svg delete mode 100644 dashboard/apps/web/public/replay.svg delete mode 100644 dashboard/apps/web/public/search.svg delete mode 100644 dashboard/apps/web/tsconfig.json delete mode 100644 dashboard/jest.config.js create mode 100644 dashboard/jest.config.ts create mode 100644 dashboard/jest.setup.js delete mode 100644 dashboard/meta.json create mode 100644 dashboard/next.config.mjs create mode 100644 dashboard/package-lock.json delete mode 100644 dashboard/packages/eslint-config-custom/next.js delete mode 100644 dashboard/packages/eslint-config-custom/package.json delete mode 100644 dashboard/packages/tsconfig/base.json delete mode 100644 dashboard/packages/tsconfig/nextjs.json delete mode 100644 dashboard/packages/tsconfig/package.json delete mode 100644 dashboard/packages/tsconfig/react-library.json delete mode 100644 dashboard/packages/ui/Header.tsx delete mode 100644 dashboard/packages/ui/components/Button/Button.tsx delete mode 100644 dashboard/packages/ui/components/Button/_button.scss delete mode 100644 dashboard/packages/ui/components/Button/index.tsx delete mode 100644 dashboard/packages/ui/components/Calendar/Calendar.tsx delete mode 100644 dashboard/packages/ui/components/Calendar/CalendarB.tsx delete mode 100644 dashboard/packages/ui/components/Calendar/CalendarCanvas/CalendarCanvas.tsx delete mode 100644 dashboard/packages/ui/components/Calendar/CalendarCanvas/CalendarCanvasB.tsx delete mode 100644 dashboard/packages/ui/components/Calendar/CalendarCanvas/index.ts delete mode 100644 dashboard/packages/ui/components/Calendar/CalendarComponents/CInput.tsx delete mode 100644 dashboard/packages/ui/components/Calendar/CalendarComponents/Content.tsx delete mode 100644 dashboard/packages/ui/components/Calendar/CalendarComponents/YearSelector.tsx delete mode 100644 dashboard/packages/ui/components/Calendar/CalendarComponents/index.ts delete mode 100644 dashboard/packages/ui/components/Calendar/_calendar.scss delete mode 100644 dashboard/packages/ui/components/Calendar/index.ts delete mode 100644 dashboard/packages/ui/components/Container.tsx delete mode 100644 dashboard/packages/ui/components/Drawer/DrawerHeader.tsx delete mode 100644 dashboard/packages/ui/components/Drawer/DrawerLink.tsx delete mode 100644 dashboard/packages/ui/components/Drawer/DrawerSection.tsx delete mode 100644 dashboard/packages/ui/components/Drawer/DrawerThreadSpecLink.tsx delete mode 100644 dashboard/packages/ui/components/Drawer/index.ts delete mode 100644 dashboard/packages/ui/components/HeaderBar.tsx delete mode 100644 dashboard/packages/ui/components/Input/Input.tsx delete mode 100644 dashboard/packages/ui/components/Input/_input.scss delete mode 100644 dashboard/packages/ui/components/Label/Label.tsx delete mode 100644 dashboard/packages/ui/components/Label/_label.scss delete mode 100644 dashboard/packages/ui/components/LoadMoreButton/LoadMoreButton.tsx delete mode 100644 dashboard/packages/ui/components/LoadMoreButton/_load_more_button.scss delete mode 100644 dashboard/packages/ui/components/LoadMoreButton/index.tsx delete mode 100644 dashboard/packages/ui/components/Loader.tsx delete mode 100644 dashboard/packages/ui/components/Loading.tsx delete mode 100644 dashboard/packages/ui/components/PerPage/PerPage.tsx delete mode 100644 dashboard/packages/ui/components/PerPage/_per_page.scss delete mode 100644 dashboard/packages/ui/components/Titles/H1/H1.tsx delete mode 100644 dashboard/packages/ui/components/Titles/H1/index.tsx delete mode 100644 dashboard/packages/ui/components/Titles/H2/H2.tsx delete mode 100644 dashboard/packages/ui/components/Titles/H2/index.tsx delete mode 100644 dashboard/packages/ui/components/Titles/H3/H3.tsx delete mode 100644 dashboard/packages/ui/components/Titles/H3/index.tsx delete mode 100644 dashboard/packages/ui/components/Titles/H4/H4.tsx delete mode 100644 dashboard/packages/ui/components/Titles/H4/index.tsx delete mode 100644 dashboard/packages/ui/components/Titles/H5/H5.tsx delete mode 100644 dashboard/packages/ui/components/Titles/H5/index.tsx delete mode 100644 dashboard/packages/ui/components/Titles/index.ts delete mode 100644 dashboard/packages/ui/index.tsx delete mode 100644 dashboard/packages/ui/package.json delete mode 100644 dashboard/packages/ui/styles.scss delete mode 100644 dashboard/packages/ui/styles/_components.scss delete mode 100644 dashboard/packages/ui/styles/_drawer.scss delete mode 100644 dashboard/packages/ui/styles/_login.scss delete mode 100644 dashboard/packages/ui/styles/_react_flow_custom.scss delete mode 100644 dashboard/packages/ui/styles/_scrollbar.scss delete mode 100644 dashboard/packages/ui/styles/_table_cell.scss delete mode 100644 dashboard/packages/ui/styles/_table_scrollbar.scss delete mode 100644 dashboard/packages/ui/styles/_variables.scss delete mode 100644 dashboard/packages/ui/styles/_visualizer.scss delete mode 100644 dashboard/packages/ui/styles/_wf_extra_information.scss delete mode 100644 dashboard/packages/ui/tsconfig.json delete mode 100644 dashboard/packages/ui/turbo/generators/config.ts delete mode 100644 dashboard/packages/ui/turbo/generators/templates/component.hbs delete mode 100644 dashboard/packages/ui/utils/calendarUtils.tsx delete mode 100644 dashboard/packages/ui/utils/index.ts delete mode 100644 dashboard/packages/ui/utils/useOutsideClick.tsx delete mode 100644 dashboard/pnpm-lock.yaml delete mode 100644 dashboard/pnpm-workspace.yaml create mode 100644 dashboard/postcss.config.js create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/Diagram.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/Default.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/EdgeDetails.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/extractEdges.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/index.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/Layouter.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/Modals/Modals.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/Modals/TaskRun.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/Modals/index.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Entrypoint.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Exit.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/ExternalEvent.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Fade.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/NodeDetails.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Nop.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Sleep.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StartMultipleThreads.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StartThread.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StatusPin.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/Task.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/TaskDetails.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/getTaskRun.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/index.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/UserTask.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/WaitForThreads.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/extractNodes.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/index.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/components/ThreadPanel.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/context/ModalContext.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/context/ThreadContext.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/context/index.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/hooks/useModal.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/hooks/useScrollbar.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/hooks/useThread.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/layout.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/components/Details.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/components/WfRun.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/getWfRun.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/page.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/getVersions.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/getWfSpec.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/searchWfRun.ts create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Details.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Mutations.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Thread.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Variables.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Versions.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfRuns.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfRunsHeader.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfSpec.tsx create mode 100644 dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/page.tsx create mode 100644 dashboard/src/app/(authenticated)/components/Header.tsx create mode 100644 dashboard/src/app/(authenticated)/components/Navigation.tsx create mode 100644 dashboard/src/app/(authenticated)/components/Principal.tsx create mode 100644 dashboard/src/app/(authenticated)/components/QueryProvider.tsx create mode 100644 dashboard/src/app/(authenticated)/components/Search.tsx create mode 100644 dashboard/src/app/(authenticated)/components/SearchFooter.tsx create mode 100644 dashboard/src/app/(authenticated)/components/SearchHeader.tsx create mode 100644 dashboard/src/app/(authenticated)/components/TenantSelector.tsx create mode 100644 dashboard/src/app/(authenticated)/components/VersionSelector.tsx create mode 100644 dashboard/src/app/(authenticated)/components/searchAction.ts create mode 100644 dashboard/src/app/(authenticated)/components/tables/ExternalEventDefTable.tsx create mode 100644 dashboard/src/app/(authenticated)/components/tables/TaskDefTable.tsx create mode 100644 dashboard/src/app/(authenticated)/components/tables/UserTaskDefTable.tsx create mode 100644 dashboard/src/app/(authenticated)/components/tables/WfSpecTable.tsx create mode 100644 dashboard/src/app/(authenticated)/components/tables/index.ts create mode 100644 dashboard/src/app/(authenticated)/error.tsx create mode 100644 dashboard/src/app/(authenticated)/externalEventDef/[name]/components/Details.tsx create mode 100644 dashboard/src/app/(authenticated)/externalEventDef/[name]/components/ExternalEventDef.tsx create mode 100644 dashboard/src/app/(authenticated)/externalEventDef/[name]/components/InputVars.tsx create mode 100644 dashboard/src/app/(authenticated)/externalEventDef/[name]/getExternalEventDef.ts create mode 100644 dashboard/src/app/(authenticated)/externalEventDef/[name]/page.tsx create mode 100644 dashboard/src/app/(authenticated)/layout.tsx create mode 100644 dashboard/src/app/(authenticated)/page.tsx create mode 100644 dashboard/src/app/(authenticated)/taskDef/[name]/components/Details.tsx create mode 100644 dashboard/src/app/(authenticated)/taskDef/[name]/components/InputVars.tsx create mode 100644 dashboard/src/app/(authenticated)/taskDef/[name]/components/TaskDef.tsx create mode 100644 dashboard/src/app/(authenticated)/taskDef/[name]/getTaskDef.ts create mode 100644 dashboard/src/app/(authenticated)/taskDef/[name]/page.tsx create mode 100644 dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Details.tsx create mode 100644 dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Fields.tsx create mode 100644 dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/UserTaskDef.tsx create mode 100644 dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Versions.tsx create mode 100644 dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/getVersions.ts create mode 100644 dashboard/src/app/(authenticated)/userTaskDef/[...props]/getUserTaskDef.ts create mode 100644 dashboard/src/app/(authenticated)/userTaskDef/[...props]/page.tsx create mode 100644 dashboard/src/app/api/auth/[...nextauth]/authOptions.ts create mode 100644 dashboard/src/app/api/auth/[...nextauth]/route.ts create mode 100644 dashboard/src/app/api/auth/signin/LoginButton.tsx rename dashboard/{apps/web/public => src/app/api/auth/signin}/handsome-horse.png (100%) create mode 100644 dashboard/src/app/api/auth/signin/page.tsx create mode 100644 dashboard/src/app/constants.ts create mode 100644 dashboard/src/app/getWhoami.ts create mode 100644 dashboard/src/app/globals.css create mode 100644 dashboard/src/app/layout.tsx create mode 100644 dashboard/src/app/lhClient.ts create mode 100644 dashboard/src/app/utils/date.ts create mode 100644 dashboard/src/app/utils/index.ts create mode 100644 dashboard/src/app/utils/variables.test.ts create mode 100644 dashboard/src/app/utils/variables.ts create mode 100644 dashboard/src/app/utils/wfRun.test.ts create mode 100644 dashboard/src/app/utils/wfRun.ts create mode 100644 dashboard/src/contexts/WhoAmIContext.tsx create mode 100644 dashboard/src/lhConfig.ts create mode 100644 dashboard/src/littlehorse.svg create mode 100644 dashboard/src/middleware.ts create mode 100644 dashboard/src/setTenant.ts create mode 100644 dashboard/src/types/index.ts create mode 100644 dashboard/src/types/next-auth.d.ts create mode 100644 dashboard/tailwind.config.ts create mode 100644 dashboard/tsconfig.json delete mode 100644 dashboard/turbo.json delete mode 100755 docker/dashboard/docker-entrypoint.sh create mode 100755 docker/dashboard/entrypoint.sh create mode 100644 package-lock.json diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 08e6d7d95..45f4d4509 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -80,22 +80,16 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 - with: - package_json_file: dashboard/package.json - - name: Use Node.js uses: actions/setup-node@v3 with: node-version: 20 - cache-dependency-path: dashboard/pnpm-lock.yaml - cache: pnpm - name: Build Dashboard working-directory: ./dashboard run: | - pnpm install - pnpm build + npm ci + npm run build - name: Build and Publish uses: ./.github/actions/publish-image @@ -113,22 +107,16 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 - with: - package_json_file: ./dashboard/package.json - - name: Use Node.js uses: actions/setup-node@v3 with: node-version: 20 - cache-dependency-path: dashboard/pnpm-lock.yaml - cache: pnpm - name: Build Dashboard working-directory: ./dashboard run: | - pnpm install - pnpm build + npm ci + npm run build - name: Dowload Server Jar artifact uses: actions/download-artifact@v4 diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml index f93eb2166..efbef188b 100644 --- a/.github/workflows/publish-docker.yml +++ b/.github/workflows/publish-docker.yml @@ -94,22 +94,16 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 - with: - package_json_file: ./dashboard/package.json - - name: Use Node.js uses: actions/setup-node@v3 with: node-version: 20 - cache-dependency-path: dashboard/pnpm-lock.yaml - cache: pnpm - name: Build Dashboard working-directory: ./dashboard run: | - pnpm install --frozen-lockfile - pnpm build + npm ci + npm run build - name: Build and Publish uses: ./.github/actions/publish-image @@ -126,22 +120,16 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 - with: - package_json_file: ./dashboard/package.json - - name: Use Node.js uses: actions/setup-node@v3 with: node-version: 20 - cache-dependency-path: dashboard/pnpm-lock.yaml - cache: pnpm - name: Build Dashboard working-directory: ./dashboard run: | - pnpm install - pnpm build + npm ci + npm run build - name: Dowload Server Jar artifact uses: actions/download-artifact@v4 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 388531c56..7c4c70ebb 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -115,19 +115,13 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - package_json_file: ./dashboard/package.json - - name: Use Node.js uses: actions/setup-node@v4 with: node-version: 20 - cache-dependency-path: dashboard/pnpm-lock.yaml - cache: pnpm - name: Build Dashboard working-directory: ./dashboard run: | - pnpm install - pnpm test + npm ci + npm run test diff --git a/dashboard/.editorconfig b/dashboard/.editorconfig new file mode 100644 index 000000000..a2ee7fe44 --- /dev/null +++ b/dashboard/.editorconfig @@ -0,0 +1,21 @@ +root = true +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space + +[*.{ts,json,js,tsx,jsx}] +indent_style = space +indent_size = 2 + +[*.md] +indent_size = 2 +indent_style = space + +[Dockerfile] +indent_style = space +indent_size = 2 + +[*.{yml,yaml}] +indent_size = 2 diff --git a/dashboard/.env-sample b/dashboard/.env-sample new file mode 100644 index 000000000..172bd87cf --- /dev/null +++ b/dashboard/.env-sample @@ -0,0 +1,16 @@ +# Littlehorse configuration +LHC_API_HOST=localhost +LHC_API_PORT=2023 + +LHD_OAUTH_ENABLED=false +LHS_CA_CERT= + + +# Next-Auth configuration +NEXTAUTH_SECRET= +NEXTAUTH_URL= + +# Keycloak +KEYCLOAK_CLIENT_ID= +KEYCLOAK_CLIENT_SECRET= +KEYCLOAK_ISSUER_URI= diff --git a/dashboard/.env.sample b/dashboard/.env.sample deleted file mode 100644 index 7e4da8b91..000000000 --- a/dashboard/.env.sample +++ /dev/null @@ -1,8 +0,0 @@ -AUTH_SECRET="" -API_URL= -NEXTAUTH_URL="" - - -KEYCLOAK_CLIENT_ID="a-client-id" -KEYCLOAK_CLIENT_SECRET="a-client-secret" -KEYCLOAK_ISSUER_URI="https://a-keycloack-issuer-url" diff --git a/dashboard/.eslintrc.js b/dashboard/.eslintrc.js deleted file mode 100644 index aa48f7d5a..000000000 --- a/dashboard/.eslintrc.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - root: true, - // This tells ESLint to load the config from the package `eslint-config-custom` - extends: [ 'custom/next' ], - settings: { - next: { - rootDir: [ 'apps/*/' ], - }, - }, -} diff --git a/dashboard/.eslintrc.json b/dashboard/.eslintrc.json new file mode 100644 index 000000000..bffb357a7 --- /dev/null +++ b/dashboard/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/dashboard/.gitignore b/dashboard/.gitignore index 9bd162f7a..fd3dbb571 100644 --- a/dashboard/.gitignore +++ b/dashboard/.gitignore @@ -1,17 +1,20 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -.idea/ + # dependencies -node_modules -.pnp +/node_modules +/.pnp .pnp.js +.yarn/install-state.gz # testing -coverage +/coverage # next.js -.next/ -out/ -build +/.next/ +/out/ + +# production +/build # misc .DS_Store @@ -23,16 +26,11 @@ yarn-debug.log* yarn-error.log* # local env files -.env -.env.local -.env.development.local -.env.test.local -.env.production.local - -# turbo -.turbo +.env*.local # vercel .vercel -.vscode +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/dashboard/.npmrc b/dashboard/.npmrc deleted file mode 100644 index fe4353c8f..000000000 --- a/dashboard/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -auto-install-peers = true -public-hoist-pattern[]=next diff --git a/dashboard/.nvmrc b/dashboard/.nvmrc deleted file mode 100644 index 035651d12..000000000 --- a/dashboard/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -20.7.0 diff --git a/dashboard/.prettierignore b/dashboard/.prettierignore new file mode 100644 index 000000000..3c3629e64 --- /dev/null +++ b/dashboard/.prettierignore @@ -0,0 +1 @@ +node_modules diff --git a/dashboard/.prettierrc b/dashboard/.prettierrc new file mode 100644 index 000000000..1f97ea1cf --- /dev/null +++ b/dashboard/.prettierrc @@ -0,0 +1,10 @@ +{ + "printWidth": 120, + "semi": false, + "singleQuote": true, + "useTabs": false, + "tabWidth": 2, + "arrowParens": "avoid", + "trailingComma": "es5", + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/dashboard/README.md b/dashboard/README.md index 57d7c814a..2b7287a98 100644 --- a/dashboard/README.md +++ b/dashboard/README.md @@ -1,143 +1,58 @@ -# LittleHorse Dashboard +# LH Dashboard -This directory contains the code for the LittleHorse Dashhboard. The LH Dashboard is an administrative tool that allows you to easily visualize what's going on in your LH Cluster. -## Requirements -* `NodeJS`. The version 20 is required. In case you need multiple versions of node on you machine, you can install - [NVM](https://github.com/nvm-sh/nvm) on your machine. Then you can run: `nvm use` -* Previous command will use the node version defined in the .nvmrc file on the root folder of this project. -* Install pnpm globally -``` -npm install pnpm --global -``` +## Environment Variables +If running the app without Docker, you need to fill in the environment variables in the `.env` file inside `apps/web`. The `.env` file in the root folder is not being read by the app. -* Install the node packages: -``` -pnpm install -``` +- `LHC_API_HOST` littlehorse hostname +- `LHC_API_PORT` littlehorse port +- `LHC_CA_CERT` To specify the path to the self signed certificate that the dashboard needs to connect to a LittleHorse server configured to work with OAuth. +- `LHD_OAUTH_ENABLED` enable oauth authentication +- `LHD_OAUTH_ENCRYPT_SECRET` random string that will be used to encrypt the secrets and also the JWT token +- `LHD_OAUTH_CALLBACK_URL` the url (domain) in which the dashboard will run (required for some authentication methods). For your local you can use: `http:/localhost:3001/` +- `LHD_OAUTH_CLIENT_ID` the client id configured in keycloack +- `LHD_OAUTH_CLIENT_SECRET` the client secret configured in keycloack +- `LHD_OAUTH_ISSUER_URI` the keycloack -## Feature Toggles -At this point you can configure the feature toggles through an environment variable that will enable/disabled the feature in any environment. -The name of the environment variable that you need to set as `true` or `false` is `LHD_OAUTH_ENABLED`. -### CHANGING A TOOGLE'S STATUS -* You need to change the environment variable value. -* You need to re-run the application. +## Development -### HOW TO USE THEM -#### Server side -On the server side code you can do: -``` -if (process.env.LHD_OAUTH_ENABLED === 'true') { - // ...some code here... -} -``` +Create a copy of `.env-sample` as `.env-local` and modify it accordingly to your littlehorse-server configuration. -#### Client side -We have created a React Hook in order to read the feature toggles on the client side components. -``` - const isAuthenticationEnabled = useFeatureToggle('isAuthenticationEnabled') +Then simply run - if (isAuthenticationEnabled) { - // do something here - } +```shell +npm install +npm run dev ``` -### Testing -To make the feature toggles available for the tests the following has been put in place: -* A `testGlobals.js` file which is reading the featureToggles and loading them into the jest context. -* To turn ON/OFF a toggle for the tests, you can either: +The application will start with watch mode on [http://localhost:3000](http://localhost:3000) - * Enable/Disable it in the `featureToggles` file like indicated in the above sections. - * In your tests you can overwrite the value of the toggle like: - ``` - __A_TOGGLE__ = false - __ANOTHER_TOGGLE__ = true - ``` +### LH Server without authentication -## SINGLE SIGN ON FOR THE DASHBOARD -* The LH Dashboard can use Keycloack provider as an SSO mechanism for a user to login into the dashboard and use it. For that to work you have to enable the toggle `LHD_OATUH_ENABLED` in the needed environments. - -* You need to your LittleHorse server running in OAuth mode for this feature to work correclty. - -* For the needed Environment Variables please refer to the corresponding section in this README. - -* [Here a detail of the implemented authentication flow for this project](https://link.excalidraw.com/readonly/5sxfddEgSEFTEQLF3WAG) - - -### Libraries -We are using the following libraries: -* `ts-proto`: library for the generation of the TypeScript files, we are using the options: - * outputServices=nice-grpc -> ts-proto will output server and client stubs for nice-grpc. - * outputServices=generic-definitions -> ts-proto will output generic (framework-agnostic) service definitions. Required to work with nice-grpc. - * useDate=string -> Protobuff Timestamps are compiled as TypeScript strings, this will avoid us to be dealing with JS Date types. - * esModuleInterop=true -> As Next JS make use only of ES Modules, we need this option so our ts proto files import modules like `import something from something` instead of using `require`. - * stringEnums=true -> Enums are represented as strings instead of numbers. -* `nice-grpc`: Library that provides a good interface from the developer perspective when making GRPC calls. - -### Generating TypeScript proto files - -Protobuf files can be re-compiled by running, _from the root of the repo, NOT this folder_: +If you don't have a lh-server running, you can use this command: -``` -./local-dev/compile.sh +```shell +docker run --rm -d -p 2023:2023 ghcr.io/littlehorse-enterprises/littlehorse/lh-standalone:master ``` -### Known Issues -The protobufjs library does not have a default export because of that you can have an error similar to: +Asuming your lh-server is running on `localhost:2023` create a `.env.local` file with +```env +LHC_API_HOST=localhost +LHC_API_PORT=2023 ``` -if (_m0.util.Long !== Long) -TypeError: Cannot read properties of undefined (reading 'Long') -``` -A more detailed discussion about it can be found (here)[https://github.com/stephenh/ts-proto/issues/536#issuecomment-1198154550], the workaround proposed is to replace `import _m0 from 'protobufjs/minimal'` by `import * as _m0 from 'protobufjs/minimal'`. -A new step has been included in the `compile-proto.sh` script to take care of that. - - -## Build -To build all apps and packages, run the following command: - -``` -pnpm build -``` +### LH Server with authentication -## Develop - -To start the application on your local machine run the following command: - -``` -pnpm dev -``` - -Open [http://localhost:3001](http://localhost:3001) with your browser to see the result. - -You can start editing the page by modifying `pages/next.js`. The page auto-updates as you edit the file. - -[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3001/api/hello](http://localhost:3001/api/hello). This endpoint can be edited in `pages/api/hello.js`. - -The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. - -### Know Issues -As of September 2023, turbo versions greater that 1.10.4 are causing the following error. [Issue detailed here.](https://github.com/vercel/turbo/issues/5331): - -``` -root task dev (turbo run dev) looks like it invokes turbo and might cause a loop -``` +* The LH Dashboard can use Keycloack provider as an SSO mechanism for a user to login into the dashboard and use it. For that to work you have to enable the toggle `LHD_OATUH_ENABLED` in the needed environments. -That's why in the package JSON we have fixed the version to 1.10.4 until the bug is fixed. +* You need to your LittleHorse server running in OAuth mode for this feature to work correclty. -## Environment Variables -If running the app without Docker, you need to fill in the environment variables in the `.env` file inside `apps/web`. The `.env` file in the root folder is not being read by the app. +* For the needed Environment Variables please refer to the corresponding section in this README. -- `AUTH_SECRET` random string that will be used to encrypt the secrets and also the JWT token -- `API_URL` the URL of the Little Horse Core, in your local it will be `localhost:2023` -- `NEXTAUTH_URL` the url (domain) in which the dashboard will run (required for some authentication methods). For your local you can use: `http:/localhost:3001/` -- `KEYCLOAK_CLIENT_ID` the client id configured in keycloack -- `KEYCLOAK_CLIENT_SECRET` the client secret configured in keycloack -- `KEYCLOAK_ISSUER_URI` the keycloack -- `LHC_CA_CERT` To specify the path to the self signed certificate that the dashboard needs to connect to a LittleHorse server configured to work with OAuth. +* [Here a detail of the implemented authentication flow for this project](https://link.excalidraw.com/readonly/5sxfddEgSEFTEQLF3WAG) ## Linting @@ -145,18 +60,14 @@ We are using ESLint as the linter for project. Given that we have a mono-repo st You can run the linter by: ``` -pnpm run lint +npm run lint ``` If you wanna ESLint to try to fix the issues automatically, run: ``` -pnpm run lint -- --fix +npm run lint:fix ``` -### What are we running the linter for: -* apps/web -* packages/ui - ### Configuring your IDE to have Linter Live Feedback #### Intellij @@ -194,11 +105,11 @@ for the entire `lh-dashboard` mono-repo. Jest is being used as the testing framework, any file that has the pattern `*.test.*` in its name is considered a test and will be executed by Jest. To run the tests please execute: ``` -pnpm test +npm run test ``` If you wanna watch your tests while developing execute: ``` -pnpm test --watch +npm run test --watch ``` ### Environment variables @@ -208,24 +119,52 @@ You need to create a `env.test.local` file to contain any env variable you might ## Start the Dashboard with Docker The Dashboard docker image is under `docker/dashboard`, in order to run it please do the following: -1. Ensure pnpm is installed, if not please execute `npm install -g pnpm ` +1. Go under the `dashboard` directory, execute: `npm install` -2. Go under the `dashboard` directory, execute: `pnpm install` +2. Build the docker image -3. Build the docker image -``` - docker build -f docker/dashboard/Dockerfile -t a-tag-name . +```sh +./local-dev/build.sh --dashboard ``` - Execute either of the following: -4.1. If you want to run it the Authentication Enabled: -``` -docker run --env LHD_OAUTH_ENABLED='true' --env LHD_OAUTH_CLIENT_ID='{a-client-id}' --env LHD_OAUTH_CLIENT_SECRET='{a-client-secret}' --env LHD_OAUTH_SERVER_URL='{https://keycloack-env}/realms/lh' --env LHD_OAUTH_ENCRYPT_SECRET='{a-secret-to-encrypt}' --env LHD_OAUTH_CALLBACK_URL='localhost:8080' --env LHD_API_HOST=localhost --env LHD_API_PORT=2023 --network host a-tag-name +### Authentication Disabled: + +```bash +docker run --rm \ + -p 3000:3000 \ + --env LHC_API_HOST='localhost' \ + --env LHC_API_PORT='2023' \ + --network host \ + ghcr.io/littlehorse-enterprises/littlehorse/lh-dashboard:master ``` -5.1. If you want to run it the Authentication Disabled: +### Authentication Enabled: + +```bash +docker run --rm \ + --env LHC_API_HOST='localhost' \ + --env LHC_API_PORT='2023' \ + --env LHD_OAUTH_ENABLED='true' \ + --env LHD_OAUTH_CLIENT_ID='{a-client-id}' \ + --env LHD_OAUTH_CLIENT_SECRET='{a-client-secret}' \ + --env LHD_OAUTH_ISSUER_URI='{https://keycloack-env}/realms/lh' \ + --env LHD_OAUTH_CALLBACK_URL='localhost:3000' \ + --env LHD_OAUTH_ENCRYPT_SECRET='{a-secret-to-encrypt}' \ + --network host \ + ghcr.io/littlehorse-enterprises/littlehorse/lh-dashboard:master ``` -docker run --env LHD_OAUTH_ENABLED='false' --env LHD_OAUTH_ENCRYPT_SECRET='{a-secret-to-encrypt}' --env LHD_API_HOST=localhost --env LHD_API_PORT=2023 --network host a-tag-name + +## SSL termination + +Assuming you have a folder `./ssl` containing `tls.crt` and `tls.key` + +```bash +docker run --rm \ + --env SSL='true' \ + --env LHC_API_HOST='localhost' \ + --env LHC_API_PORT='2023' \ + --network host \ + -v ./ssl:/ssl \ + ghcr.io/littlehorse-enterprises/littlehorse/lh-dashboard:master ``` -**Note**: For **2.1** and **2.2** please replace the placeholders between the curly braces with the corresponding values. diff --git a/dashboard/apps/web/.env.sample b/dashboard/apps/web/.env.sample deleted file mode 100644 index 3de69ebac..000000000 --- a/dashboard/apps/web/.env.sample +++ /dev/null @@ -1,19 +0,0 @@ -AUTH_SECRET="SUPER.Secret_Sentence" - -#GOOGLE_ID="XXXXX" -#GOOGLE_SECRET="XXXXX" - -#GITHUB_ID="XXXXX" -#GITHUB_SECRET="XXXXX" - -#AZURE_AD_CLIENT_ID="AZURE.CLIENT_ID" -#AZURE_AD_CLIENT_SECRET="AZURE.CLIENT_SECRET" -#AZURE_AD_TENANT_ID="AZURE.TENANT" - -#OKTA_CLIENT_ID="OKTA.CLIENT_ID" -#OKTA_CLIENT_SECRET="OKTA.CLIENT_SECRET" -#OKTA_ISSUER_URI="OKTA.ISSUER_URI" - -NEXTAUTH_URL="http://localhost:3001" - -API_URL=http://rest.altimetrik.demo.littlehorse.cloud:8080 diff --git a/dashboard/apps/web/.eslintrc.js b/dashboard/apps/web/.eslintrc.js deleted file mode 100644 index 15a800773..000000000 --- a/dashboard/apps/web/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - root: true, - globals: { - 'NodeJS': 'readonly' - }, - extends: [ 'custom/next' ], -} diff --git a/dashboard/apps/web/.gitignore b/dashboard/apps/web/.gitignore deleted file mode 100644 index 1437c53f7..000000000 --- a/dashboard/apps/web/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local - -# vercel -.vercel diff --git a/dashboard/apps/web/__tests__/apps/pages/api/drawer/externalEvent.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/drawer/externalEvent.test.ts deleted file mode 100644 index 267987e4e..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/drawer/externalEvent.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/drawer/externalEvent' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { ExternalEventId } from '../../../../../littlehorse-public-api/object_id' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('externalEvent API', () => { - it('should perform a grpc request for a externalEvent sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - wfRunId: { - id: 'A_WFRUN_ID' - }, - externalEventDefId: { - name: 'AN_EXTERNAL_EVENT_NAME' - }, - guid: 'A_GUID' - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('getExternalEvent', req, res, { - wfRunId: { - id: 'A_WFRUN_ID' - }, - externalEventDefId: { - name: 'AN_EXTERNAL_EVENT_NAME' - }, - guid: 'A_GUID' - } as ExternalEventId) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/drawer/nodeRun.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/drawer/nodeRun.test.ts deleted file mode 100644 index a20d06143..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/drawer/nodeRun.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/drawer/nodeRun' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { NodeRunId } from '../../../../../littlehorse-public-api/object_id' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('nodeRun API', () => { - it('should perform a grpc request for a nodeRun sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - wfRunId: 'A_WFRUN_ID', - threadRunNumber: 0, - name: '1' - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('getNodeRun', req, res, { - wfRunId: { - id: 'A_WFRUN_ID' - }, - threadRunNumber: 0, - position: 1 - } as NodeRunId) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/drawer/taskDef/[name]/index.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/drawer/taskDef/[name]/index.test.ts deleted file mode 100644 index a2367cfc5..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/drawer/taskDef/[name]/index.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../../../../web/pages/api/drawer/taskDef/[name]/index' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../../../pages/api/grpcMethodCallHandler' -import type { TaskDefId } from '../../../../../../../littlehorse-public-api/object_id' - -jest.mock('../../../../../../../../../apps/web/pages/api/grpcMethodCallHandler') - -describe('taskDef API', () => { - it('should perform a grpc request for a taskDef sending the right request body', async () => { - - - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'GET' }) - req.query = { - name: 'A_TASKDEF' - } - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('getTaskDef', req, res, { - name: 'A_TASKDEF' - } as TaskDefId) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/drawer/taskRun.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/drawer/taskRun.test.ts deleted file mode 100644 index 18f30cefd..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/drawer/taskRun.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/drawer/taskRun' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { TaskRunId } from '../../../../../littlehorse-public-api/object_id' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('taskRun API', () => { - it('should perform a grpc request for a taskRun sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - wfRunId: { - id: 'A_WFRUN_ID' - }, - taskGuid: 'A_GUID' - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('getTaskRun', req, res, { - wfRunId: { - id: 'A_WFRUN_ID' - }, - taskGuid: 'A_GUID' - } as TaskRunId) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/drawer/userTaskRun.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/drawer/userTaskRun.test.ts deleted file mode 100644 index 0f6f358a2..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/drawer/userTaskRun.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/drawer/userTaskRun' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { UserTaskRunId } from '../../../../../littlehorse-public-api/object_id' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('drawer userTaskRun API', () => { - it('should perform a grpc request for a userTaskRun sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - wfRunId: 'A_WFRUN_ID', - guid: 'A_GUID' - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('getUserTaskRun', req, res, { - wfRunId: { - id: 'A_WFRUN_ID' - }, - userTaskGuid: 'A_GUID' - } as UserTaskRunId) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/drawer/variable.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/drawer/variable.test.ts deleted file mode 100644 index edc9c7829..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/drawer/variable.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/drawer/variable' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { VariableId } from '../../../../../littlehorse-public-api/object_id' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('taskDef API', () => { - it('should perform a grpc request to search for a wfRun sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - wfRunId: 'A_WFRUN_ID', - threadRunNumber: 0, - name: 'A_VARIABLE_NAME' - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('getVariable', req, res, { - wfRunId: { - id: 'A_WFRUN_ID' - }, - threadRunNumber: 0, - name: 'A_VARIABLE_NAME' - } as VariableId) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/drawer/wfRun/[id]/index.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/drawer/wfRun/[id]/index.test.ts deleted file mode 100644 index 090dcc475..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/drawer/wfRun/[id]/index.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../../../../web/pages/api/drawer/wfRun/[id]/index' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../../../pages/api/grpcMethodCallHandler' -import type { ListNodeRunsRequest } from '../../../../../../../littlehorse-public-api/service' - -jest.mock('../../../../../../../../../apps/web/pages/api/grpcMethodCallHandler') - -describe('wfRun API', () => { - it('should perform a grpc request for a wfRun sending the right request body', async () => { - - - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'GET' }) - req.query = { - id: 'A_WFRUN_ID' - } - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('listNodeRuns', req, res, { - wfRunId: { - id: 'A_WFRUN_ID' - } - } as ListNodeRunsRequest) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/drawer/wfSpec/[name]/index.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/drawer/wfSpec/[name]/index.test.ts deleted file mode 100644 index 65ac0a431..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/drawer/wfSpec/[name]/index.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../../../../web/pages/api/drawer/wfSpec/[name]/index' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../../../../../apps/web/pages/api/grpcMethodCallHandler' -import type { GetLatestWfSpecRequest } from '../../../../../../../littlehorse-public-api/service' - -jest.mock('../../../../../../../../../apps/web/pages/api/grpcMethodCallHandler') - -describe('wfSpec API', () => { - it('should perform a grpc request for a drawer wfSpec sending the right request body', async () => { - - - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'GET' }) - req.query = { - name: 'A_WFSPEC_NAME' - } - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('getLatestWfSpec', req, res, { - name: 'A_WFSPEC_NAME' - } as GetLatestWfSpecRequest) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/grpcMethodCallHandler.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/grpcMethodCallHandler.test.ts deleted file mode 100644 index 4ae062f68..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/grpcMethodCallHandler.test.ts +++ /dev/null @@ -1,831 +0,0 @@ -import { makeGrpcCall, handleGrpcCallWithNext } from '../../../../pages/api/grpcMethodCallHandler' -import type { NextApiRequest, NextApiResponse } from 'next' -import LHClient from '../../../../pages/api/LHClient' -import * as nextAuth from 'next-auth/next' -import type { SearchWfSpecRequest, WfSpecIdList } from '../../../../littlehorse-public-api/service' -import { ClientError, Status } from 'nice-grpc-common' -import { constants } from 'http2' - -jest.mock('../../../../pages/api/LHClient') - -describe('GRPC Method call handler', () => { - describe('AUTHENTICATION ENABLED', () => { - beforeEach(() => { - process.env.LHD_OAUTH_ENABLED = 'true' - }) - - describe('Grpc method call handler that returns the success response', () => { - it('a result is returned by the invoked grpc method when the a session is active', async () => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: 'ANY_ACCESS_TOKEN' }) - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const response: NextApiResponse = { - send: jest.fn(), - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.resolve({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - } as WfSpecIdList) - } - })) - - const wfRun = await makeGrpcCall('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(wfRun).toEqual({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - }) - }) - - it('should call grpc with the provided request body', async () => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: 'ANY_ACCESS_TOKEN' }) - - const searchWfSpecMock = jest.fn() - - const request: NextApiRequest = { - body: JSON.stringify({ - id: 'ANY_WFRUN_ID', - number: 0, - position: 0 - }), - } as NextApiRequest - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => { - return ({ - searchWfSpec: searchWfSpecMock - }) - }) - const sendMock = jest.fn() - - const response: NextApiResponse = { - send: sendMock, - } as unknown as NextApiResponse - - const grpcRequestBody = { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - } - - await makeGrpcCall('searchWfSpec', request, response, grpcRequestBody) - - expect(searchWfSpecMock).toHaveBeenCalledWith(grpcRequestBody) - }) - - it('unauthorized response when grpc method answers with PERMISSION DENIED', async () => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: 'EXPIRED_ACCESS_TOKEN' }) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const statusMock = jest.fn() - const jsonMock = jest.fn() - const response: NextApiResponse = { - send: jest.fn(), - status: statusMock.mockImplementation(() => ({ - json: jsonMock - })), - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.reject(new ClientError('/searchWfSpec', Status.PERMISSION_DENIED, 'Token is not active')) - } - })) - - await makeGrpcCall('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(statusMock).toHaveBeenCalledWith(constants.HTTP_STATUS_UNAUTHORIZED) - expect(jsonMock).toHaveBeenCalledWith({ - status: 401, - message: 'You need to be authenticated to access this resource.' - }) - }) - - it('unauthorized response when grpc method answers with UNAUTHENTICATED', async () => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: undefined }) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const statusMock = jest.fn() - const jsonMock = jest.fn() - const response: NextApiResponse = { - send: jest.fn(), - status: statusMock.mockImplementation(() => ({ - json: jsonMock - })), - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.reject(new ClientError('/searchWfSpec', Status.UNAUTHENTICATED, 'Unauthenticated')) - } - })) - - await makeGrpcCall('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(statusMock).toHaveBeenCalledWith(constants.HTTP_STATUS_UNAUTHORIZED) - expect(jsonMock).toHaveBeenCalledWith({ - status: 401, - message: 'You need to be authenticated to access this resource.' - }) - }) - - it.each([ - [ Status.CANCELLED ], - [ Status.UNKNOWN ], - [ Status.INVALID_ARGUMENT ], - [ Status.DEADLINE_EXCEEDED ], - [ Status.NOT_FOUND ], - [ Status.ALREADY_EXISTS ], - [ Status.RESOURCE_EXHAUSTED ], - [ Status.FAILED_PRECONDITION ], - [ Status.ABORTED ], - [ Status.OUT_OF_RANGE ], - [ Status.UNIMPLEMENTED ], - [ Status.INTERNAL ], - [ Status.UNAVAILABLE ], - [ Status.DATA_LOSS ], - ])('internal server error response when grpc method answers with any error code but PERMISSION_DENIED or AUTHENTICATED', async (grpcStatusCode: Status) => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: 'A_VALID_TOKEN' }) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const statusMock = jest.fn() - const jsonMock = jest.fn() - const response: NextApiResponse = { - send: jest.fn(), - status: statusMock.mockImplementation(() => ({ - json: jsonMock - })), - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.reject(new ClientError('/searchWfSpec', grpcStatusCode, 'Error Details.')) - } - })) - - await makeGrpcCall('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(statusMock).toHaveBeenCalledWith(constants.HTTP_STATUS_INTERNAL_SERVER_ERROR) - expect(jsonMock).toHaveBeenCalledWith({ - status: 500, - message: 'There was an error while processing your request. Error Details.' - }) - }) - - it('non authorized response when the is no active session', async () => { - const nullSession = null - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue(nullSession) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const responseStatusMock = jest.fn() - const response: NextApiResponse = { - status: responseStatusMock.mockImplementation(() => ({ - json: jest.fn() - })), - } as unknown as NextApiResponse - - - await makeGrpcCall('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(responseStatusMock).toHaveBeenCalledWith(401) - }) - - it('non authorized response should include a json body with details about the error', async () => { - const nullSession = null - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue(nullSession) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const jsonResponseMock = jest.fn() - const response: NextApiResponse = { - status: jest.fn().mockImplementation(() => ({ - json: jsonResponseMock - })), - } as unknown as NextApiResponse - - - await makeGrpcCall('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(jsonResponseMock).toHaveBeenCalledWith({ - status: 401, - message: 'You need to be authenticated to access this resource.' - }) - }) - - it('should return the API Response', async () => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: 'ANY_ACCESS_TOKEN' }) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const sendMock = jest.fn() - const response: NextApiResponse = { - send: sendMock, - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.resolve({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - } as WfSpecIdList) - } - })) - - const wfRunResponse = await makeGrpcCall('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(wfRunResponse).toEqual({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - }) - }) - }) - describe('Grpc Method Call handler that sends the success response through Next', () => { - afterEach(() => { - jest.resetAllMocks() - }) - - it('response should include the result returned by the invoked grpc method when the a session is active', async () => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: 'ANY_ACCESS_TOKEN' }) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const sendMock = jest.fn() - const response: NextApiResponse = { - send: sendMock, - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.resolve({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - } as WfSpecIdList) - } - })) - - await handleGrpcCallWithNext('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(sendMock).toHaveBeenCalledWith({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - }) - }) - - it('should call grpc with the provided request body', async () => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: 'ANY_ACCESS_TOKEN' }) - - const searchWfSpecMock = jest.fn() - - const request: NextApiRequest = { - body: JSON.stringify({ - id: 'ANY_WFRUN_ID', - number: 0, - position: 0 - }), - } as NextApiRequest - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => { - return ({ - searchWfSpec: searchWfSpecMock - }) - }) - const sendMock = jest.fn() - - const response: NextApiResponse = { - send: sendMock, - } as unknown as NextApiResponse - - const grpcRequestBody = { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - } - - await handleGrpcCallWithNext('searchWfSpec', request, response, grpcRequestBody) - - expect(searchWfSpecMock).toHaveBeenCalledWith(grpcRequestBody) - }) - - it('unauthorized response when grpc method answers with PERMISSION DENIED', async () => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: 'EXPIRED_ACCESS_TOKEN' }) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const statusMock = jest.fn() - const jsonMock = jest.fn() - const response: NextApiResponse = { - send: jest.fn(), - status: statusMock.mockImplementation(() => ({ - json: jsonMock - })), - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.reject(new ClientError('/searchWfSpec', Status.PERMISSION_DENIED, 'Token is not active')) - } - })) - - await handleGrpcCallWithNext('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(statusMock).toHaveBeenCalledWith(constants.HTTP_STATUS_UNAUTHORIZED) - expect(jsonMock).toHaveBeenCalledWith({ - status: 401, - message: 'You need to be authenticated to access this resource.' - }) - }) - - it('unauthorized response when grpc method answers with UNAUTHENTICATED', async () => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: undefined }) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const statusMock = jest.fn() - const jsonMock = jest.fn() - const response: NextApiResponse = { - send: jest.fn(), - status: statusMock.mockImplementation(() => ({ - json: jsonMock - })), - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.reject(new ClientError('/searchWfSpec', Status.UNAUTHENTICATED, 'Unauthenticated')) - } - })) - - await handleGrpcCallWithNext('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(statusMock).toHaveBeenCalledWith(constants.HTTP_STATUS_UNAUTHORIZED) - expect(jsonMock).toHaveBeenCalledWith({ - status: 401, - message: 'You need to be authenticated to access this resource.' - }) - }) - - it.each([ - [ Status.CANCELLED ], - [ Status.UNKNOWN ], - [ Status.INVALID_ARGUMENT ], - [ Status.DEADLINE_EXCEEDED ], - [ Status.NOT_FOUND ], - [ Status.ALREADY_EXISTS ], - [ Status.RESOURCE_EXHAUSTED ], - [ Status.FAILED_PRECONDITION ], - [ Status.ABORTED ], - [ Status.OUT_OF_RANGE ], - [ Status.UNIMPLEMENTED ], - [ Status.INTERNAL ], - [ Status.UNAVAILABLE ], - [ Status.DATA_LOSS ], - ])('internal server error response when grpc method answers with any error code but PERMISSION_DENIED', async (grpcStatusCode: Status) => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: 'A_VALID_TOKEN' }) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const statusMock = jest.fn() - const jsonMock = jest.fn() - const response: NextApiResponse = { - send: jest.fn(), - status: statusMock.mockImplementation(() => ({ - json: jsonMock - })), - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.reject(new ClientError('/searchWfSpec', grpcStatusCode, 'Error Details.')) - } - })) - - await handleGrpcCallWithNext('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(statusMock).toHaveBeenCalledWith(constants.HTTP_STATUS_INTERNAL_SERVER_ERROR) - expect(jsonMock).toHaveBeenCalledWith({ - status: 500, - message: 'There was an error while processing your request. Error Details.' - }) - }) - - it('non authorized response when the is no active session', async () => { - const nullSession = null - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue(nullSession) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const responseStatusMock = jest.fn() - const response: NextApiResponse = { - status: responseStatusMock.mockImplementation(() => ({ - json: jest.fn() - })), - } as unknown as NextApiResponse - - - await handleGrpcCallWithNext('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(responseStatusMock).toHaveBeenCalledWith(401) - }) - - it('non authorized response should include a json body with details about the error', async () => { - const nullSession = null - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue(nullSession) - - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const jsonResponseMock = jest.fn() - const response: NextApiResponse = { - status: jest.fn().mockImplementation(() => ({ - json: jsonResponseMock - })), - } as unknown as NextApiResponse - - - await handleGrpcCallWithNext('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(jsonResponseMock).toHaveBeenCalledWith({ - status: 401, - message: 'You need to be authenticated to access this resource.' - }) - }) - }) - }) - - describe('AUTHENTICATION DISABLED', () => { - beforeEach(() => { - process.env.LHD_OAUTH_ENABLED = 'false' - }) - - describe('Grpc method call handler that returns the success response', () => { - it('a result is returned by the invoked grpc method', async () => { - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const response: NextApiResponse = { - send: jest.fn(), - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.resolve({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - } as WfSpecIdList) - } - })) - - const wfRun = await makeGrpcCall('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(wfRun).toEqual({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - }) - }) - - it('should call grpc with the provided request body', async () => { - const searchWfSpecMock = jest.fn() - - const request: NextApiRequest = { - body: JSON.stringify({ - id: 'ANY_WFRUN_ID', - number: 0, - position: 0 - }), - } as NextApiRequest - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => { - return ({ - searchWfSpec: searchWfSpecMock - }) - }) - const sendMock = jest.fn() - - const response: NextApiResponse = { - send: sendMock, - } as unknown as NextApiResponse - - const grpcRequestBody = { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - } - - await makeGrpcCall('searchWfSpec', request, response, grpcRequestBody) - - expect(searchWfSpecMock).toHaveBeenCalledWith(grpcRequestBody) - }) - - it.each([ - [ Status.CANCELLED ], - [ Status.UNKNOWN ], - [ Status.INVALID_ARGUMENT ], - [ Status.DEADLINE_EXCEEDED ], - [ Status.NOT_FOUND ], - [ Status.ALREADY_EXISTS ], - [ Status.RESOURCE_EXHAUSTED ], - [ Status.FAILED_PRECONDITION ], - [ Status.ABORTED ], - [ Status.OUT_OF_RANGE ], - [ Status.UNIMPLEMENTED ], - [ Status.INTERNAL ], - [ Status.UNAVAILABLE ], - [ Status.DATA_LOSS ], - ])('internal server error response when grpc method answers with any error code but PERMISSION_DENIED OR UNAUTHENTICATED', async (grpcStatusCode: Status) => { - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const statusMock = jest.fn() - const jsonMock = jest.fn() - const response: NextApiResponse = { - send: jest.fn(), - status: statusMock.mockImplementation(() => ({ - json: jsonMock - })), - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.reject(new ClientError('/searchWfSpec', grpcStatusCode, 'Error Details.')) - } - })) - - await makeGrpcCall('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(statusMock).toHaveBeenCalledWith(constants.HTTP_STATUS_INTERNAL_SERVER_ERROR) - expect(jsonMock).toHaveBeenCalledWith({ - status: 500, - message: 'There was an error while processing your request. Error Details.' - }) - }) - - it('should return the API Response', async () => { - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const sendMock = jest.fn() - const response: NextApiResponse = { - send: sendMock, - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.resolve({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - } as WfSpecIdList) - } - })) - - const wfRunResponse = await makeGrpcCall('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(wfRunResponse).toEqual({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - }) - }) - }) - describe('Grpc Method Call handler that sends the success response through Next', () => { - afterEach(() => { - jest.resetAllMocks() - }) - - it('response should include the result returned by the invoked grpc method when the a session is active', async () => { - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const sendMock = jest.fn() - const response: NextApiResponse = { - send: sendMock, - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.resolve({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - } as WfSpecIdList) - } - })) - - await handleGrpcCallWithNext('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(sendMock).toHaveBeenCalledWith({ - results: [ { name: 'ANY_SPEC', majorVersion: 0, revision: 0 } ] - }) - }) - - it.each([ - [ Status.CANCELLED ], - [ Status.UNKNOWN ], - [ Status.INVALID_ARGUMENT ], - [ Status.DEADLINE_EXCEEDED ], - [ Status.NOT_FOUND ], - [ Status.ALREADY_EXISTS ], - [ Status.RESOURCE_EXHAUSTED ], - [ Status.FAILED_PRECONDITION ], - [ Status.ABORTED ], - [ Status.OUT_OF_RANGE ], - [ Status.UNIMPLEMENTED ], - [ Status.INTERNAL ], - [ Status.UNAVAILABLE ], - [ Status.DATA_LOSS ], - ])('internal server error response when grpc method answers with any error code but PERMISSION_DENIED or AUTHENTICATED', async (grpcStatusCode: Status) => { - const request: NextApiRequest = { - body: JSON.stringify({ - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }), - } as NextApiRequest - - const statusMock = jest.fn() - const jsonMock = jest.fn() - const response: NextApiResponse = { - send: jest.fn(), - status: statusMock.mockImplementation(() => ({ - json: jsonMock - })), - } as unknown as NextApiResponse - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.reject(new ClientError('/searchWfSpec', grpcStatusCode, 'Error Details.')) - } - })) - - await handleGrpcCallWithNext('searchWfSpec', request, response, { - wfRunId: 'ANY_WFRUN_ID', - threadNumber: 0, - position: 0 - }) - - expect(statusMock).toHaveBeenCalledWith(constants.HTTP_STATUS_INTERNAL_SERVER_ERROR) - expect(jsonMock).toHaveBeenCalledWith({ - status: 500, - message: 'There was an error while processing your request. Error Details.' - }) - }) - }) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/information/taskDef.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/information/taskDef.test.ts deleted file mode 100644 index 819ccb2f6..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/information/taskDef.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/information/taskDef' -import type { NextApiRequest, NextApiResponse } from 'next' -import type { TaskDefId } from '../../../../../littlehorse-public-api/object_id' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('information taskDef API', () => { - it('should perform a grpc request to get information for a taskDef sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - id: 'A_TASKDEF' - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('getTaskDef', req, res, { - name: 'A_TASKDEF' - } as TaskDefId) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/information/userTaskDef.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/information/userTaskDef.test.ts deleted file mode 100644 index c775ac608..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/information/userTaskDef.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/information/userTaskDef' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { UserTaskDefId } from '../../../../../littlehorse-public-api/object_id' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('information userTaskDef API', () => { - it('should perform a grpc request to get information for a userTaskDef sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - id: 'A_TASKDEF', - version: 0 - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('getUserTaskDef', req, res, { - name: 'A_TASKDEF', - version: 0 - } as UserTaskDefId) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/loops/taskRun.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/loops/taskRun.test.ts deleted file mode 100644 index fa03fd18a..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/loops/taskRun.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/loops/taskRun' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import { TaskStatus } from '../../../../../littlehorse-public-api/common_enums' -import type { SearchTaskRunRequest } from '../../../../../littlehorse-public-api/service' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('taskRun API', () => { - it('should get all the SCHEDULED RUNNING and SUCCESS task runs for the given wfRunId', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - - req.body = JSON.stringify({ - taskDefName: 'A_TASKDEF', - wfRunId: 'A_WFRUN_ID' - }); - - (grpcCallHandler.makeGrpcCall as jest.Mock).mockImplementation((method: string, req: NextApiRequest, res: NextApiResponse, grpcRequestBody: SearchTaskRunRequest) => { - if (grpcRequestBody.status === TaskStatus.TASK_SCHEDULED) { - expect(grpcRequestBody).toEqual( { - status: 'TASK_SCHEDULED', - taskDefName: 'A_TASKDEF', - 'limit': 99 - }) - - return Promise.resolve({ - results: [ - { wfRunId: 'A_WFRUN_ID', taskGuid: 'A_SCHEDULED_TASK_GUID' }, - { wfRunId: 'ANOTHER_WFRUN_ID', taskGuid: 'ANOTHER_SCHEDULED_TASK_GUID' } - ] - }) - } - - if (grpcRequestBody.status === TaskStatus.TASK_RUNNING) { - expect(grpcRequestBody).toEqual( { - status: 'TASK_RUNNING', - taskDefName: 'A_TASKDEF', - 'limit': 99 - }) - - return Promise.resolve({ - results: [ - { wfRunId: 'A_WFRUN_ID', taskGuid: 'A_RUNNING_TASK_GUID' }, - { wfRunId: 'ANOTHER_WFRUN_ID', taskGuid: 'ANOTHER_RUNNING_TASK_GUID' } - ] - }) - } - - if (grpcRequestBody.status === TaskStatus.TASK_SUCCESS) { - expect(grpcRequestBody).toEqual( { - status: 'TASK_SUCCESS', - taskDefName: 'A_TASKDEF', - 'limit': 99 - }) - - return Promise.resolve({ - results: [ - { wfRunId: 'A_WFRUN_ID', taskGuid: 'A_SUCCESS_TASK_GUID' }, - { wfRunId: 'ANOTHER_WFRUN_ID', taskGuid: 'ANOTHER_SUCCESS_TASK_GUID' } - ] - }) - } - }) - - const sendMock = jest.fn() - res.send = sendMock - - await handler(req, res) - - expect(sendMock).toHaveBeenCalledWith([ - { wfRunId: 'A_WFRUN_ID', taskGuid: 'A_SCHEDULED_TASK_GUID' }, - { wfRunId: 'A_WFRUN_ID', taskGuid: 'A_RUNNING_TASK_GUID' }, - { wfRunId: 'A_WFRUN_ID', taskGuid: 'A_SUCCESS_TASK_GUID' } - ]) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/metrics/taskDef.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/metrics/taskDef.test.ts deleted file mode 100644 index b273f4ee5..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/metrics/taskDef.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/metrics/taskDef' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import { MetricsWindowLength } from '../../../../../littlehorse-public-api/common_enums' -import type { ListTaskMetricsRequest } from '../../../../../littlehorse-public-api/service' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('metrics taskDef API', () => { - it('should perform a grpc request to get the metrics for tasDefs sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - lastWindowStart: '2023-11-12T12:12:12Z', - numWindows: 24, - taskDefName: 'A_TASKDEF', - windowLength: 'HOURS_2' - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('listTaskDefMetrics', req, res, { - lastWindowStart: '2023-11-12T12:12:12Z', - numWindows: 24, - taskDefId: { - name: 'A_TASKDEF' - }, - windowLength: MetricsWindowLength.HOURS_2 - } as ListTaskMetricsRequest) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/metrics/wfSpec.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/metrics/wfSpec.test.ts deleted file mode 100644 index 850b2556e..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/metrics/wfSpec.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/metrics/wfSpec' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import { MetricsWindowLength } from '../../../../../littlehorse-public-api/common_enums' -import type { ListWfMetricsRequest } from '../../../../../littlehorse-public-api/service' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('metrics wfSpec API', () => { - it('should perform a grpc request to get the metrics for wfSpecs sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - lastWindowStart: '2023-11-12T12:12:12Z', - numWindows: 24, - wfSpecName: 'A_WFSPEC', - majorVersion: 1, - revision: 1, - windowLength: 'HOURS_2' - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('listWfSpecMetrics', req, res, { - wfSpecId: { - name: 'A_WFSPEC', - majorVersion: 1, - revision: 1 - }, - lastWindowStart: '2023-11-12T12:12:12Z', - windowLength: MetricsWindowLength.HOURS_2, - numWindows: 24 - } as ListWfMetricsRequest) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/search/externalEventDef.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/search/externalEventDef.test.ts deleted file mode 100644 index 2e6143967..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/search/externalEventDef.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/search/externalEventDef' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { SearchExternalEventDefRequest } from '../../../../../littlehorse-public-api/service' -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('externalEventDef API', () => { - afterEach(() => { - jest.clearAllMocks() - }) - - it('should perform a grpc request to search for an externalEvent sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - prefix: 'A_PREFIX', - bookmark: 'QV9CT09LTUFSSw==', - limit: 5 - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('searchExternalEventDef', req, res, { - prefix: 'A_PREFIX', - bookmark: Uint8Array.from([ - 65, 95, 66, 79, 79, - 75, 77, 65, 82, 75 - ]), - limit: 5 - } as SearchExternalEventDefRequest) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/search/nodeRun/[number]/[position].test.ts b/dashboard/apps/web/__tests__/apps/pages/api/search/nodeRun/[number]/[position].test.ts deleted file mode 100644 index 6286a18a2..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/search/nodeRun/[number]/[position].test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { createMocks } from 'node-mocks-http' - -import type { NextApiRequest, NextApiResponse } from 'next' -import handler from '../../../../../../../pages/api/search/nodeRun/[number]/[position]' -import * as grpcCallHandler from '../../../../../../../pages/api/grpcMethodCallHandler' -import type { NodeRunId } from '../../../../../../../littlehorse-public-api/object_id' - -jest.mock('../../../../../../../pages/api/grpcMethodCallHandler') - -describe('nodeRun API', () => { - it('should perform a grpc request to search for an externalEvent sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.query = { - number: '0', - position: '1' - } - - req.body = JSON.stringify({ - id: 'A_WFRUN_ID', - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('getNodeRun', req, res, { - wfRunId: { - id: 'A_WFRUN_ID' - }, - threadRunNumber: 0, - position: 1 - } as NodeRunId) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/search/taskDef.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/search/taskDef.test.ts deleted file mode 100644 index 825439ca6..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/search/taskDef.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/search/taskDef' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { SearchTaskDefRequest } from '../../../../../littlehorse-public-api/service' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('taskDef API', () => { - afterEach(() => { - jest.clearAllMocks() - }) - - it('should perform a grpc request to search for a taskDef sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - prefix: 'A_PREFIX', - bookmark: 'QV9CT09LTUFSSw==', - limit: 5 - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('searchTaskDef', req, res, { - bookmark: Uint8Array.from([ - 65, 95, 66, 79, 79, - 75, 77, 65, 82, 75 - ]), - limit: 5, - prefix: 'A_PREFIX' - } as SearchTaskDefRequest) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/search/taskRun.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/search/taskRun.test.ts deleted file mode 100644 index 7609bf25a..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/search/taskRun.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/search/taskRun' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { SearchTaskRunRequest } from '../../../../../littlehorse-public-api/service' -import { TaskStatus } from '../../../../../littlehorse-public-api/common_enums' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('TaskRun API', () => { - afterEach(() => { - jest.clearAllMocks() - }) - - it('should perform a grpc request to search for a taskRun sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - status: 'TASK_RUNNING', - taskDefName: 'A_TASK_DEF_NAME', - earliestStart: '2022-11-11T12:12:12Z', - latestStart: '2022-11-12T12:12:12Z', - bookmark: 'QV9CT09LTUFSSw==', - limit: 5 - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('searchTaskRun', req, res, { - status: TaskStatus.TASK_RUNNING, - taskDefName: 'A_TASK_DEF_NAME', - earliestStart: '2022-11-11T12:12:12Z', - latestStart: '2022-11-12T12:12:12Z', - bookmark: Uint8Array.from([ - 65, 95, 66, 79, 79, - 75, 77, 65, 82, 75 - ]), - limit: 5 - } as SearchTaskRunRequest) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/search/userTaskDef.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/search/userTaskDef.test.ts deleted file mode 100644 index 1e6173f32..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/search/userTaskDef.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/search/userTaskDef' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { SearchUserTaskDefRequest } from '../../../../../littlehorse-public-api/service' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('user task def API', () => { - afterEach(() => { - jest.clearAllMocks() - }) - - it('should perform a grpc request to search for a userTaskDef sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - prefix: 'A_PREFIX' - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('searchUserTaskDef', req, res, { - prefix: 'A_PREFIX' - } as SearchUserTaskDefRequest) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/search/userTaskRun.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/search/userTaskRun.test.ts deleted file mode 100644 index 4a53db4ca..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/search/userTaskRun.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/search/userTaskRun' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { SearchUserTaskRunRequest } from '../../../../../littlehorse-public-api/service' -import { UserTaskRunStatus } from '../../../../../littlehorse-public-api/user_tasks' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('user task run API', () => { - afterEach(() => { - jest.clearAllMocks() - }) - - it('should perform a grpc request to search for a user task run sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - - req.body = JSON.stringify({ - status: 'ASSIGNED', - userTaskDefName: 'A_DEF_NAME', - earliestStart: '2023-11-11T12:12:12Z', - latestStart: '2023-11-12T12:12:12Z', - limit: 5, - bookmark: 'QV9CT09LTUFSSw==' - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('searchUserTaskRun', req, res, { - status: UserTaskRunStatus.ASSIGNED, - userTaskDefName: 'A_DEF_NAME', - earliestStart: '2023-11-11T12:12:12Z', - latestStart: '2023-11-12T12:12:12Z', - limit: 5, - bookmark: Uint8Array.from([ - 65, 95, 66, 79, 79, - 75, 77, 65, 82, 75 - ]), - } as SearchUserTaskRunRequest) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/search/wfRun.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/search/wfRun.test.ts deleted file mode 100644 index 07963da3c..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/search/wfRun.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/search/wfRun' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { SearchWfRunRequest } from '../../../../../littlehorse-public-api/service' -import { LHStatus } from '../../../../../littlehorse-public-api/common_enums' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('WFRun API', () => { - afterEach(() => { - jest.clearAllMocks() - }) - - it('should perform a grpc request to search for a wfRun sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ - status: 'RUNNING', - wfSpecName: 'any_wfSpec_name', - wfSpecMajorVersion: 0, - wfSpecRevision: 0, - earliestStart: '2023-11-11T12:12:12Z', - latestStart: '2023-11-11T14:12:12Z', - bookmark: 'QV9CT09LTUFSSw==', - limit: 4 - }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext).toHaveBeenCalledWith('searchWfRun', req, res, { - status: LHStatus.RUNNING, - wfSpecName: 'any_wfSpec_name', - wfSpecMajorVersion: 0, - wfSpecRevision: 0, - earliestStart: '2023-11-11T12:12:12Z', - latestStart: '2023-11-11T14:12:12Z', - variableFilters: [], - bookmark: Uint8Array.from([ - 65, 95, 66, 79, 79, - 75, 77, 65, 82, 75 - ]), - limit: 4 - } as SearchWfRunRequest) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/search/wfSpec.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/search/wfSpec.test.ts deleted file mode 100644 index f9684bb2b..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/search/wfSpec.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/search/wfSpec' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { SearchWfSpecRequest } from '../../../../../littlehorse-public-api/service' -import LHClient from '../../../../../pages/api/LHClient' -import type { WfSpecIdList } from '../../../../../littlehorse-public-api/service' -jest.mock('../../../../../pages/api/LHClient') - -describe('wfSpec API', () => { - beforeEach(() => { - process.env.LDH_OAUTH_ENABLED = 'false' - }) - - afterEach(() => { - jest.clearAllMocks() - }) - - it('should perform a grpc request to get the wfSpec sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - - req.body = JSON.stringify({ prefix: 'any_prefix' }); - - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({ - searchWfSpec: (_: SearchWfSpecRequest): Promise => { - return Promise.resolve({ - results: [ { name: 'ANY_SPEC', majorVersion: 1, revision: 2 } ] - } as WfSpecIdList) - } - })) - - const mockedJson = jest.fn() - res.json = mockedJson - - await handler(req, res) - - expect(mockedJson).toHaveBeenCalledWith({ - results: [ { name: 'ANY_SPEC', majorVersion: 1, revision: 2, version: '1.2' } ] - }) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/visualization/wfRun.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/visualization/wfRun.test.ts deleted file mode 100644 index ab60086d2..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/visualization/wfRun.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/visualization/wfRun' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -jest.mock('../../../../../pages/api/grpcMethodCallHandler') -describe('WFRun API', () => { - it('should perform a grpc request to get the wfRun sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ wfRunId: 'any_wf_run_id' }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext) - .toHaveBeenCalledWith('getWfRun', - req, res, { - id: 'any_wf_run_id' - }) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/visualization/wfSpec.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/visualization/wfSpec.test.ts deleted file mode 100644 index e9f4aaf7a..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/visualization/wfSpec.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/visualization/wfSpec' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { WfSpecId } from '../../../../../littlehorse-public-api/object_id' - -jest.mock('../../../../../pages/api/grpcMethodCallHandler') - -describe('WfSpec API', () => { - it('should perform a grpc request to get the wfSpec sending the right request body', async () => { - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ id: 'any_wf_spec', majorVersion: 1, revision: 1 }) - - await handler(req, res) - - expect(grpcCallHandler.handleGrpcCallWithNext) - .toHaveBeenCalledWith('getWfSpec', - req, res, { - name: 'any_wf_spec', - majorVersion: 1, - revision: 1 - } as WfSpecId) - }) -}) diff --git a/dashboard/apps/web/__tests__/apps/pages/api/visualization/workflowLayoutedGraph.test.ts b/dashboard/apps/web/__tests__/apps/pages/api/visualization/workflowLayoutedGraph.test.ts deleted file mode 100644 index d1947da14..000000000 --- a/dashboard/apps/web/__tests__/apps/pages/api/visualization/workflowLayoutedGraph.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { createMocks } from 'node-mocks-http' -import handler from '../../../../../pages/api/visualization/workflowLayoutedGraph' -import type { NextApiRequest, NextApiResponse } from 'next' -import * as grpcCallHandler from '../../../../../pages/api/grpcMethodCallHandler' -import type { WfSpecId } from '../../../../../littlehorse-public-api/object_id' -import * as nextAuth from 'next-auth/next' -import LHClient from '../../../../../pages/api/LHClient' - -jest.mock('../../../../../pages/api/LHClient') -jest.mock('../../../../../pages/api/grpcMethodCallHandler') -jest.mock( '../../../../../app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter') - - -describe('Layouted Graph API', () => { - beforeEach(() => { - (LHClient.getInstance as unknown as jest.Mock).mockImplementation(() => ({})) - }) - - it('should perform a grpc request to get the wfSpec sending the right request body', async () => { - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue({ accessToken: 'ANY_ACCESS_TOKEN' }) - - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - req.body = JSON.stringify({ wfSpecName: 'ANY_WF_SPEC', majorVersion: 1, revision: 2 }) - - await handler(req, res) - - expect(grpcCallHandler.makeGrpcCall) - .toHaveBeenCalledWith('getWfSpec', - req, res, { - name: 'ANY_WF_SPEC', - majorVersion: 1, - revision: 2 - } as WfSpecId) - }) - - it('should return a 401 error when no active session and the OAUTH toggle is ON', async () => { - process.env.LHD_OAUTH_ENABLED = 'true' - const { req, res }: { req: NextApiRequest; res: NextApiResponse } = createMocks({ method: 'POST' }) - jest.spyOn(nextAuth, 'getServerSession').mockResolvedValue(null) - - req.body = JSON.stringify({ wfSpecName: 'ANY_WF_SPEC', majorVersion: 1, revision: 2 }) - - const statusMock = jest.fn() - const jsonMock = jest.fn() - - res.status = statusMock.mockImplementation(() => ({ - json: jsonMock - })) - - await handler(req, res) - - expect(jsonMock).toHaveBeenCalledWith({ - status: 401, - message: 'You need to be authenticated to access this resource.' - }) - }) -}) diff --git a/dashboard/apps/web/app/(auth)/signin/LoginButtons.tsx b/dashboard/apps/web/app/(auth)/signin/LoginButtons.tsx deleted file mode 100644 index c73554fb7..000000000 --- a/dashboard/apps/web/app/(auth)/signin/LoginButtons.tsx +++ /dev/null @@ -1,24 +0,0 @@ -'use client' - -import type { ClientSafeProvider } from 'next-auth/react' -import { getProviders } from 'next-auth/react' -import { useEffect, useState } from 'react' -import { ProviderSigInBtn } from './ProviderSigInBtn' - -export function LoginButtons() { - const [ vProviders, setVProviders ] = useState([]) - - useEffect(() => { - getProviders().then(providers => { - setVProviders(Object.values(providers || [])) - }, rejectedReason => { - console.error('Not able to get Auth providers', rejectedReason) - }) - }, []) - - return ( - <> - {vProviders.map((provider) => )} - - ) -} diff --git a/dashboard/apps/web/app/(auth)/signin/LoginPage.tsx b/dashboard/apps/web/app/(auth)/signin/LoginPage.tsx deleted file mode 100644 index 67ba1399d..000000000 --- a/dashboard/apps/web/app/(auth)/signin/LoginPage.tsx +++ /dev/null @@ -1,53 +0,0 @@ -'use client' - -import Image from 'next/image' -import { Suspense } from 'react' -import { Loader } from 'ui' -import { LoginButtons } from './LoginButtons' - - -export function LoginPage() { - - return
-
-
- logo-lh -
-
- Welcome to your - Little Horse - dashboard -
- }> - - - -
-
Copyright © 2023 LittleHorse Enterprises LLC.
-
- -
- - //
- //
- //
- //
- // - //
- //
- //

Welcome to your Little Horse dashboard

- // - // {/* @ts-expect-error Server Component */} - // - // - //
- //
Copyright © 2023 LittleHorse Enterprises LLC.
- //
- //
-} diff --git a/dashboard/apps/web/app/(auth)/signin/ProviderSigInBtn.tsx b/dashboard/apps/web/app/(auth)/signin/ProviderSigInBtn.tsx deleted file mode 100644 index b098b32f7..000000000 --- a/dashboard/apps/web/app/(auth)/signin/ProviderSigInBtn.tsx +++ /dev/null @@ -1,15 +0,0 @@ -'use client' - -import { signIn } from 'next-auth/react' -import Image from 'next/image' - -export function ProviderSigInBtn({ provider, num }:{ provider:any, num:number }) { - return ( - - ) -} diff --git a/dashboard/apps/web/app/(main)/components/HeaderBar.tsx b/dashboard/apps/web/app/(main)/components/HeaderBar.tsx deleted file mode 100644 index 9d8eb5903..000000000 --- a/dashboard/apps/web/app/(main)/components/HeaderBar.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import Image from 'next/image' -import { HeaderBar as Header } from 'ui' -import Link from 'next/link' -import { LoginDropdown } from './LoginDropdown' - -export function HeaderBar() { - return
- LittleHorse - -
-} diff --git a/dashboard/apps/web/app/(main)/components/LoginDropdown.tsx b/dashboard/apps/web/app/(main)/components/LoginDropdown.tsx deleted file mode 100644 index d7d340855..000000000 --- a/dashboard/apps/web/app/(main)/components/LoginDropdown.tsx +++ /dev/null @@ -1,51 +0,0 @@ -'use client' - -import Image from 'next/image' -import { signOut, useSession } from 'next-auth/react' -import { useState, useRef } from 'react' -import { useOutsideClick } from 'ui' -import { useFeatureToggle } from '../../../contexts/FeatureToggleContext' - -function Avatar({ session }) { - return ( -
- {session?.user?.image ? {session?.user?.email : null} - {!session?.user?.image && session?.user?.name ? - {session.user.name - .split(' ', 2) - .map((t: string) => t[0]) - .join('')} - : null} -
- ) -} - -export function LoginDropdown() { - // ref used to locate the ancestor Ref so the handler doesn't reopen the log out option - const ancestorOutsideClickRef = useRef(null) - const outsideClickRef = useOutsideClick(() => { setActive(false) },ancestorOutsideClickRef) - const isAuthenticationEnabled = useFeatureToggle('isAuthenticationEnabled') - - const { data: session } = useSession() - const [ active, setActive ] = useState(false) - - if (isAuthenticationEnabled) { - return ( -
-
{ setActive(prev => !prev) }}> - - {session?.user?.email} - expand -
- {active ?
- -
: null} -
- ) - } - - return
-} diff --git a/dashboard/apps/web/app/(main)/components/metrics/TaskExecutionMetrics.tsx b/dashboard/apps/web/app/(main)/components/metrics/TaskExecutionMetrics.tsx deleted file mode 100644 index 4d7727128..000000000 --- a/dashboard/apps/web/app/(main)/components/metrics/TaskExecutionMetrics.tsx +++ /dev/null @@ -1,168 +0,0 @@ -'use client' - -import { useEffect, useState } from 'react' -import moment, { utc } from 'moment' -import { Button, Loader } from 'ui' -import { TaskChart } from '../../../../components/Charts/TaskChart' -import { LatencyTaskChart } from '../../../../components/Charts/LatencyTaskChart' - -export interface TaskDefMetric { - windowStart: Date - type: string - totalStarted: string - totalScheduled: string - totalErrored: string - totalCompelted: string - taskDefName: string - startToCompleteMax: string - startToCompleteAvg: string - scheduleToStartMax: string - ScheduleToStartAvg: string -} - -interface TaskExecutionMetricsProps{ - type: string - windows: number - lastWindowStart: Date -} -export function TaskExecutionMetrics({ windows= 16, lastWindowStart=moment().toDate(), type='HOURS_2' }:TaskExecutionMetricsProps) { - const [ data, setData ] = useState([]) - const [ chart, setChart ] = useState('tasks') - const [ isLoading, setIsLoading ] = useState(false) - - const windowsNotOverpassing300 = windows > 300 ? 300 : windows - - function timeoutP (_lastWindowStart:Date, metrics:any[]) { - const lastWindowStartAsMoment = moment(_lastWindowStart) - let firstDate:moment.Moment - if (type === 'HOURS_2'){ - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300*2,'hours') - } else if (type === 'DAYS_1'){ - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300,'days') - } else { - const fact = (Number(lastWindowStartAsMoment.format('mm')))%5 - lastWindowStartAsMoment.subtract(fact,'minutes') - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300*5,'minutes') - } - const out:any =[] - const curr = lastWindowStartAsMoment.clone() - if (type === 'HOURS_2'){ - while (curr.format('YMMDDHH') > firstDate.format('YMMDDHH')){ - out.push({ label:curr.toString() ,data:metrics?.find(d => { - return utc(d.windowStart).format('YMMDDHH') === curr.format('YMMDDHH') || moment(d.windowStart).format('YMMDDHH') === curr.clone().subtract(1,'hour').format('YMMDDHH') - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': 'CLUSTER_LEVEL_METRIC', - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(2,'hours') - } - } else if (type === 'DAYS_1'){ - while (curr.format('YMMDD') > firstDate.format('YMMDD')){ - out.push({ label:curr.toString() ,data:metrics?.find(d => { - return utc(d.windowStart).format('YMMDD') === curr.format('YMMDD') - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': 'CLUSTER_LEVEL_METRIC', - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(1,'days') - } - } else { - while (curr.format('YMMDDHHmm') > firstDate.format('YMMDDHHmm')){ - out.push({ label:curr.toString() ,data:metrics?.find(d => { - return utc(d.windowStart).format('YMMDDHHmm') === curr.format('YMMDDHHmm') - - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': 'CLUSTER_LEVEL_METRIC', - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(5,'minutes') - - - } - } - - return (out.reverse()) - - } - - const getData = async () => { - setIsLoading(true) - const res = await fetch('/api/metrics/taskDef',{ - method:'POST', - body: JSON.stringify({ - lastWindowStart, - numWindows: windowsNotOverpassing300, - taskDefName: 'CLUSTER_LEVEL_METRIC', - windowLength: type - }), - }) - if (res.ok){ - const content = await res.json() - setData( timeoutP(lastWindowStart,content.results)) - } - setIsLoading(false) - - } - - useEffect( () => { - getData() - },[ windowsNotOverpassing300, lastWindowStart, type ]) - - return ( -
-
-
-

Task Execution metrics

-

Cluster level

-
-
- - -
-
- - {isLoading ? ( - - ) : ( - -
- { - data.length > 0 ? <> - {chart === 'tasks' && } - {chart === 'latency' && } - :

No data available

- } -
- )} -
- ) -} diff --git a/dashboard/apps/web/app/(main)/components/metrics/WorkflowExecutionMetrics.tsx b/dashboard/apps/web/app/(main)/components/metrics/WorkflowExecutionMetrics.tsx deleted file mode 100644 index 51abbbdda..000000000 --- a/dashboard/apps/web/app/(main)/components/metrics/WorkflowExecutionMetrics.tsx +++ /dev/null @@ -1,169 +0,0 @@ -'use client' - -import { useEffect, useState } from 'react' -import moment, { utc } from 'moment' -import { Button, Loader } from 'ui' -import { WorkflowsChart } from '../../../../components/Charts/WorkflowsChart' -import { LatencyChart } from '../../../../components/Charts/LatencyChart' - -export interface TaskDefMetric { - windowStart: Date - type: string - totalStarted: string - totalScheduled: string - totalErrored: string - totalCompelted: string - taskDefName: string - startToCompleteMax: string - startToCompleteAvg: string - scheduleToStartMax: string - ScheduleToStartAvg: string -} - -interface WorkflowExecutionMetricsProps{ - type: string - windows: number - lastWindowStart: Date -} -export function WorkflowExecutionMetrics({ windows= 16, lastWindowStart=moment().toDate(), type='HOURS_2' }:WorkflowExecutionMetricsProps) { - const [ data, setData ] = useState([]) - const [ chart, setChart ] = useState('workflows') - const [ isLoading, setIsLoading ] = useState(false) - const windowsNotOverpassing300 = windows > 300 ? 300 : windows - - function timeoutP (_lastWindowStart:Date, metrics:any[]) { - const lastWindowStartAsMoment = moment(_lastWindowStart) - let firstDate:moment.Moment - if (type === 'HOURS_2'){ - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300*2,'hours') - } else if (type === 'DAYS_1'){ - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300,'days') - } else { - const fact = (Number(lastWindowStartAsMoment.format('mm')))%5 - - lastWindowStartAsMoment.subtract(fact,'minutes') - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300*5,'minutes') - } - const out:any[] =[] - const curr = lastWindowStartAsMoment.clone() - if (type === 'HOURS_2'){ - while (curr.format('YMMDDHH') > firstDate.format('YMMDDHH')){ - out.push({ label:curr.toString() ,data:metrics?.find( d => { - return utc(d.windowStart).format('YMMDDHH') === curr.format('YMMDDHH') || moment(d.windowStart).format('YMMDDHH') === curr.clone().subtract(1,'hour').format('YMMDDHH') - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': 'CLUSTER_LEVEL_METRIC', - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(2,'hours') - } - } else if (type === 'DAYS_1'){ - while (curr.format('YMMDD') > firstDate.format('YMMDD')){ - out.push({ label:curr.toString() ,data:metrics?.find( d => { - return utc(d.windowStart).format('YMMDD') === curr.format('YMMDD') - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': 'CLUSTER_LEVEL_METRIC', - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(1,'days') - } - } else { - while (curr.format('YMMDDHHmm') > firstDate.format('YMMDDHHmm')){ - out.push({ label:curr.toString() ,data:metrics?.find( d => { - return utc(d.windowStart).format('YMMDDHHmm') === curr.format('YMMDDHHmm') - - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': 'CLUSTER_LEVEL_METRIC', - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(5,'minutes') - - - } - } - - return (out.reverse()) - - } - - const getData = async () => { - setIsLoading(true) - const res = await fetch('./api/metrics/wfSpec',{ - method:'POST', - body: JSON.stringify({ - lastWindowStart, - numWindows: windowsNotOverpassing300, - wfSpecName: 'CLUSTER_LEVEL_METRIC', - majorVersion: 0, - revision: 0, - windowLength: type - }), - }) - if (res.ok){ - const content = await res.json() - setData( timeoutP(lastWindowStart,content.results)) - } - setIsLoading(false) - } - - useEffect( () => { - getData() - },[ windowsNotOverpassing300,lastWindowStart, type ]) - - return ( -
-
-
-

Workflow Execution metrics

-

Cluster level

-
-
- - -
-
- - {isLoading ? ( - - ) : ( - -
- { - data.length > 0 ? <> - {chart === 'workflows' && } - {chart === 'latency' && } - :

No data available

- } -
- )} -
- ) -} diff --git a/dashboard/apps/web/app/(main)/components/search/MetadataSearchTable.tsx b/dashboard/apps/web/app/(main)/components/search/MetadataSearchTable.tsx deleted file mode 100644 index 8be9fb527..000000000 --- a/dashboard/apps/web/app/(main)/components/search/MetadataSearchTable.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import Link from 'next/link' -import type { Result } from '../../sections/MetadataSearch' - - -interface MetadataSearchTableProps { - results :Result[] -} -export function MetadataSearchTable({ results }: MetadataSearchTableProps) { - - if (results.length === 0) { - return (
-

No data available

-
) - } - - return
- { results ? - - - - - - - - - {/* eslint-disable-next-line react/no-array-index-key */} - {results.map( (r:Result) => - - - - )} - -
NAME / IDTYPEVERSION
- {(r.type==='WfSpec') ? {r.name} : undefined} - {(r.type==='TaskDef') ? {r.name} : undefined} - {(r.type==='UserTaskDef') ? {r.name} : undefined} - {(r.type==='ExternalEventDef') ? r.name : undefined} - {r.type} {r.version}
: null } -
-} diff --git a/dashboard/apps/web/app/(main)/sections/MetadataSearch.tsx b/dashboard/apps/web/app/(main)/sections/MetadataSearch.tsx deleted file mode 100644 index d96eb0630..000000000 --- a/dashboard/apps/web/app/(main)/sections/MetadataSearch.tsx +++ /dev/null @@ -1,221 +0,0 @@ -'use client' -import { Button, Input, Label, LoadMoreButton, Loader, PerPage } from 'ui' -import { useEffect, useState } from 'react' -import { MetadataSearchTable } from '../components/search/MetadataSearchTable' - -export interface Result { - name: string - version?: number - type?: string -} - -const allLimit = 5 -const defaultLimit = 10 -const keyDownDelay = 1000 // miliseconds - -let myTimeout: NodeJS.Timeout - -export function MetadataSearch() { - let first = true - - const [ isLoading, setIsLoading ] = useState(false) - const [ firstLoad, setFirstLoad ] = useState(false) - const [ limit, setLimit ] = useState(defaultLimit) - const [ userTaskDefBookmark, setUserTaskDefBookmark ] = useState() - const [ taskDefBookmark, setTaskDefBookmark ] = useState() - const [ wfSpecBookmark, setWfSpecBookmark ] = useState() - const [ externalEventDefBookmark, setExternalEventDefBookmark ] = useState() - const [ metadataType, setMetadataType ] = useState('') - const [ prefix, setPrefix ] = useState('') - const [ metadataResults, setMetadataResults ] = useState([]) - - const fetchData = async (type: string, paginate = false, useLimit = true) => { - let bookmark: string | undefined - if (type === 'wfSpec') {bookmark = wfSpecBookmark} - if (type === 'taskDef') {bookmark = taskDefBookmark} - if (type === 'userTaskDef') {bookmark = userTaskDefBookmark} - if (type === 'externalEventDef') {bookmark = externalEventDefBookmark} - const filters: any = { limit: useLimit ? limit : allLimit } - if (prefix?.trim()) {filters.prefix = prefix.trim().toLocaleLowerCase()} - if (paginate && bookmark) {filters.bookmark = bookmark} - if (paginate && !bookmark) {return { status: 'done' }} - const res = await fetch(`./api/search/${type}`, { - method: 'POST', - body: JSON.stringify({ - ...filters - }), - }) - if (res.ok) { - const response = await res.json() - return { ...response, status: 'ok' } - } - } - const getData = async () => { - setIsLoading(true) - const { results, bookmark } = await fetchData(metadataType) - if (metadataType === 'wfSpec') {setWfSpecBookmark(bookmark)} - if (metadataType === 'taskDef') {setTaskDefBookmark(bookmark)} - if (metadataType === 'userTaskDef') {setUserTaskDefBookmark(bookmark)} - if (metadataType === 'externalEventDef') {setExternalEventDefBookmark(bookmark)} - setMetadataResults(results.map((v: Result) => ({ ...v, type: metadataType.charAt(0).toUpperCase() + metadataType.slice(1) }))) - setIsLoading(false) - } - const getMData = async () => { - setWfSpecBookmark(undefined) - setTaskDefBookmark(undefined) - setUserTaskDefBookmark(undefined) - setExternalEventDefBookmark(undefined) - if (metadataType) {return getData()} - - setIsLoading(true) - // setResults([]) - - const wfSpecs = await fetchData('wfSpec', false, false) - if (wfSpecs !== undefined && wfSpecs.results !== undefined) { - setWfSpecBookmark(wfSpecs.bookmark) - setMetadataResults(_ => wfSpecs.results.map((v: any) => ({ ...v, type: 'WfSpec' }))) - } - - // setResults(prev => [...prev, ...wfSpecs.metadataResults.map((v:any) => ({...v, metadataType:'WfSpec'}))]) - - const taskDefs = await fetchData('taskDef', false, false) - if (taskDefs !== undefined && taskDefs.results !== undefined) { - - setTaskDefBookmark(taskDefs.bookmark) - setMetadataResults(prev => [ ...prev, ...taskDefs.results.map((v: any) => ({ ...v, type: 'TaskDef' })) ]) - } - - const userTaskDefs = await fetchData('userTaskDef', false, false) - if (userTaskDefs !== undefined && userTaskDefs.results !== undefined) { - - - setTaskDefBookmark(userTaskDefs.bookmark) - setMetadataResults(prev => [ ...prev, ...userTaskDefs.results.map((v: any) => ({ ...v, type: 'UserTaskDef' })) ]) - } - - - const externalEventDefs = await fetchData('externalEventDef', false, false) - if (externalEventDefs !== undefined && externalEventDefs.results !== undefined) { - - setExternalEventDefBookmark(externalEventDefs.bookmark) - setMetadataResults(prev => [ ...prev, ...externalEventDefs.results.map((v: any) => ({ ...v, type: 'ExternalEventDef' })) ]) - } - - setFirstLoad(true) - setIsLoading(false) - } - const loadMMore = async () => { - if (metadataType) {return loadMore()} - setIsLoading(true) - - if (wfSpecBookmark) { - const wfSpecs = await fetchData('wfSpec', true, false) - if (wfSpecs.status !== 'done') { - setWfSpecBookmark(wfSpecs?.bookmark) - setMetadataResults(prev => [ ...prev, ...wfSpecs.results.map((v: any) => ({ ...v, type: 'WfSpec' })) ]) - } - } - - if (taskDefBookmark) { - const taskDefs = await fetchData('taskDef', true, false) - if (taskDefs.status !== 'done') { - if (taskDefs.results !== undefined) { - setTaskDefBookmark(taskDefs.bookmark) - setMetadataResults(prev => [ ...prev, ...taskDefs.results.map((v: any) => ({ ...v, type: 'TaskDef' })) ]) - } - } - } - if (userTaskDefBookmark) { - const userTaskDefs = await fetchData('userTaskDef', true, false) - if (userTaskDefs.status !== 'done') { - if (userTaskDefs.results !== undefined) { - setTaskDefBookmark(userTaskDefs.bookmark) - setMetadataResults(prev => [ ...prev, ...userTaskDefs.results.map((v: any) => ({ ...v, type: 'UserTaskDef' })) ]) - } - } - } - if (externalEventDefBookmark) { - const externalEventDefs = await fetchData('externalEventDef', true, false) - if (externalEventDefs.status !== 'done') { - if (externalEventDefs.results !== undefined) { - setExternalEventDefBookmark(externalEventDefs.bookmark) - setMetadataResults(prev => [ ...prev, ...externalEventDefs.results.map((v: any) => ({ - ...v, - type: 'ExternalEventDef' - })) ]) - } - } - } - - setIsLoading(false) - } - const loadMore = async () => { - setIsLoading(true) - - const { results, bookmark, status } = await fetchData(metadataType, true) - - if (status === 'done') {return} - - if (metadataType === 'wfSpec') {setWfSpecBookmark(bookmark)} - if (metadataType === 'taskDef') {setTaskDefBookmark(bookmark)} - if (metadataType === 'userTaskDef') {setUserTaskDefBookmark(bookmark)} - if (metadataType === 'externalEventDef') {setExternalEventDefBookmark(bookmark)} - setMetadataResults(prev => [ ...prev, ...results.map((v: any) => ({ - ...v, - type: metadataType.charAt(0).toUpperCase() + metadataType.slice(1) - })) ]) - setIsLoading(false) - } - - const keyDownHandler = (e: React.KeyboardEvent) => { - clearTimeout(myTimeout) - if (e.key === 'Enter') {return getMData()} - myTimeout = setTimeout(getMData, keyDownDelay) - } - - useEffect(() => { - if (firstLoad) {getMData()} - }, [ metadataType ]) - - useEffect(() => { - if (!first) {return} - first = false - getMData() - }, []) - return
- -
-

Metadata search

-
- { setPrefix(e.target.value) }} onKeyDown={keyDownHandler} placeholder="Search by name or ID" - type="text" value={prefix}/> - - - - - - -
-
-
- {!isLoading ? ( - - ) : ( - - )} -
- -
-
- {metadataType ? <> : undefined} - Load More -
-
-
- -} diff --git a/dashboard/apps/web/app/(main)/sections/Metrics.tsx b/dashboard/apps/web/app/(main)/sections/Metrics.tsx deleted file mode 100644 index 94bfcd299..000000000 --- a/dashboard/apps/web/app/(main)/sections/Metrics.tsx +++ /dev/null @@ -1,27 +0,0 @@ -'use client' -import { Calendar } from 'ui' -import { useState } from 'react' -import moment from 'moment' -import { WorkflowExecutionMetrics } from '../components/metrics/WorkflowExecutionMetrics' -import { TaskExecutionMetrics } from '../components/metrics/TaskExecutionMetrics' - -export function Metrics() { - const [ windowLength, setWindowLength ] = useState('HOURS_2') - const [ windows, setWindows ] = useState(24) - const [ lastDate, setLastDate ] = useState(moment().toDate()) - - return
-
-

Metrics

- -
- - - - -
-} diff --git a/dashboard/apps/web/app/layout.tsx b/dashboard/apps/web/app/layout.tsx deleted file mode 100644 index 25c54e2ee..000000000 --- a/dashboard/apps/web/app/layout.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import '../global.scss' -import 'ui/styles.scss' -import 'material-icons/iconfont/material-icons.css' -import { Container } from 'ui' -import Head from 'next/head' -import { Providers } from '../providers' -import { HeaderBar } from './(main)/components/HeaderBar' - -export const dynamic = 'force-dynamic' -export const metadata = { - title: 'Little Horse', - description: 'Copyright © 2023 LittleHorse Enterprises LLC. ', -} - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - - - - - - - - - {children} - - - - - ) -} diff --git a/dashboard/apps/web/app/page.tsx b/dashboard/apps/web/app/page.tsx deleted file mode 100644 index e04abb777..000000000 --- a/dashboard/apps/web/app/page.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { MetadataSearch } from './(main)/sections/MetadataSearch' -import { Metrics } from './(main)/sections/Metrics' - -export default function Page() { - - return ( - <> -

Cluster Overview

- - - - - ) -} diff --git a/dashboard/apps/web/app/taskdef/[id]/components/metrics/TaskExecutionMetrics.tsx b/dashboard/apps/web/app/taskdef/[id]/components/metrics/TaskExecutionMetrics.tsx deleted file mode 100644 index 6ca6cadfe..000000000 --- a/dashboard/apps/web/app/taskdef/[id]/components/metrics/TaskExecutionMetrics.tsx +++ /dev/null @@ -1,156 +0,0 @@ -'use client' - -import { useEffect, useState } from 'react' -import moment, { utc } from 'moment' -import { Button, Loader } from 'ui' -import { TaskChart } from '../../../../../components/Charts/TaskChart' -import { LatencyTaskChart } from '../../../../../components/Charts/LatencyTaskChart' - -export interface TaskDefMetric { - windowStart: Date - type: string - totalStarted: string - totalScheduled: string - totalErrored: string - totalCompelted: string - taskDefName: string - startToCompleteMax: string - startToCompleteAvg: string - scheduleToStartMax: string - ScheduleToStartAvg: string -} - -interface TaskExecutionMetricsProps{ - type: string - windows: number - lastWindowStart: Date - id: string -} -export function TaskExecutionMetrics({ id, windows= 16, lastWindowStart=moment().toDate(), type='HOURS_2' }:TaskExecutionMetricsProps) { - const [ data, setData ] = useState([]) - const [ chart, setChart ] = useState('tasks') - const windowsNotOverpassing300 = windows > 300 ? 300 : windows - - function timeoutP (_lastWindowStart:Date, metrics:any[]) { - const lastWindowStartAsMoment = moment(_lastWindowStart) - let firstDate:moment.Moment - if (type === 'HOURS_2'){ - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300*2,'hours') - } else if (type === 'DAYS_1'){ - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300,'days') - } else { - const fact = (Number(lastWindowStartAsMoment.format('mm')))%5 - - lastWindowStartAsMoment.subtract(fact,'minutes') - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300*5,'minutes') - } - const out:any =[] - const curr = lastWindowStartAsMoment.clone() - if (type === 'HOURS_2'){ - while (curr.format('YMMDDHH') > firstDate.format('YMMDDHH')){ - out.push({ label:curr.toString() ,data:metrics?.find( d => { - return utc(d.windowStart).format('YMMDDHH') === curr.format('YMMDDHH') || moment(d.windowStart).format('YMMDDHH') === curr.clone().subtract(1,'hour').format('YMMDDHH') - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': id, - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(2,'hours') - } - } else if (type === 'DAYS_1'){ - while (curr.format('YMMDD') > firstDate.format('YMMDD')){ - out.push({ label:curr.toString() ,data:metrics?.find( d => { - return utc(d.windowStart).format('YMMDD') === curr.format('YMMDD') - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': id, - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(1,'days') - } - } else { - while (curr.format('YMMDDHHmm') > firstDate.format('YMMDDHHmm')){ - out.push({ label:curr.toString() ,data:metrics?.find( d => { - return utc(d.windowStart).format('YMMDDHHmm') === curr.format('YMMDDHHmm') - - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': id, - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(5,'minutes') - - - } - } - - return (out.reverse()) - - } - - const getData = async () => { - const res = await fetch('/api/metrics/taskDef',{ - method:'POST', - body: JSON.stringify({ - lastWindowStart, - numWindows: windowsNotOverpassing300, - taskDefName: id, - windowLength: type - }), - }) - if (res.ok){ - const content = await res.json() - setData( timeoutP(lastWindowStart,content.results)) - } - - } - - useEffect( () => { - getData() - },[ windowsNotOverpassing300, lastWindowStart, type ]) - - return ( -
-
-
-
- - -
-
- -
{ - data.length > 0 ? <> - {chart === 'tasks' && } - {chart === 'latency' && } - : - }
-
- ) -} diff --git a/dashboard/apps/web/app/taskdef/[id]/components/search/TaskRunSearchTable.tsx b/dashboard/apps/web/app/taskdef/[id]/components/search/TaskRunSearchTable.tsx deleted file mode 100644 index 21031ae90..000000000 --- a/dashboard/apps/web/app/taskdef/[id]/components/search/TaskRunSearchTable.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import Link from 'next/link' -import type { Result } from '../../sections/TaskRunSearch' - -interface TaskRunSearchTableProps { - wfspec: string - results?: Result[] -} -export function TaskRunSearchTable({ results }: TaskRunSearchTableProps) { - return ( -
- {results ? - - - - - - - - {results.map((r: Result) => ( - - - - - ))} - -
NAME / IDSTATUS
- - {r.wfRunId.id} - - {r.status}
: null} -
- ) -} diff --git a/dashboard/apps/web/app/taskdef/[id]/page.tsx b/dashboard/apps/web/app/taskdef/[id]/page.tsx deleted file mode 100644 index 185213013..000000000 --- a/dashboard/apps/web/app/taskdef/[id]/page.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import Breadcrumbs from '../../../components/Breadcrumbs' -import { TaskDefSchemaInformation } from './sections/TaskDefSchemaInformation' -import { TaskExecutionMetrics } from './sections/TaskExecutionMetrics' -import { TaskRunSearch } from './sections/TaskRunSearch' - -function WfRun({ params }: { params: { id: string } }) { - return ( - <> -

- TaskDef{' '} - |{' '} - {params.id.charAt(0) + params.id.slice(1)}{' '} -

- - - - - - - - ) -} -export default WfRun diff --git a/dashboard/apps/web/app/taskdef/[id]/sections/TaskDefSchemaInformation.tsx b/dashboard/apps/web/app/taskdef/[id]/sections/TaskDefSchemaInformation.tsx deleted file mode 100644 index 8d6486729..000000000 --- a/dashboard/apps/web/app/taskdef/[id]/sections/TaskDefSchemaInformation.tsx +++ /dev/null @@ -1,72 +0,0 @@ -'use client' -import { useEffect, useState } from 'react' -import { Loading } from 'ui/components/Loading' -import type { VariableDef } from '../../../../littlehorse-public-api/common_wfspec' -import type { TaskDef } from '../../../../littlehorse-public-api/task_def' - -export function TaskDefSchemaInformation({ id }: { id: string }) { - const [ loadingInputVars, setLoadingInputVars ] = useState(true) - const [ inputVars, setInputVars ] = useState([]) - - const taskInformation = async () => { - const res = await fetch('/api/information/taskDef', { - method: 'POST', - body: JSON.stringify({ - id - }), - }) - if (res.ok) { - const data: TaskDef = await res.json() - setInputVars(data.inputVars) - setLoadingInputVars(false) - } - } - useEffect(() => { - taskInformation() - }, []) - - const renderInputVars = () => { - if (inputVars.length) { - // eslint-disable-next-line react/no-array-index-key -- we are using the name + index - return inputVars.map((row, index) => ( - {row.name} - {row.type} - )) - } - - if (loadingInputVars) { - return - - - - - } - - return - -
No variables required
- - - } - - return
-

TaskDef Schema Information

- -
- - - - - - - - - - {renderInputVars()} - -
Input Variables
NAMETYPE
-
-
-} diff --git a/dashboard/apps/web/app/taskdef/[id]/sections/TaskExecutionMetrics.tsx b/dashboard/apps/web/app/taskdef/[id]/sections/TaskExecutionMetrics.tsx deleted file mode 100644 index 23ae48dd8..000000000 --- a/dashboard/apps/web/app/taskdef/[id]/sections/TaskExecutionMetrics.tsx +++ /dev/null @@ -1,28 +0,0 @@ -'use client' -import { Calendar } from 'ui' -import { useState } from 'react' -import moment from 'moment' -import { TaskExecutionMetrics as TaskExecutionM } from '../components/metrics/TaskExecutionMetrics' - -interface TaskExecutionMetricsProps { - id:string -} -export function TaskExecutionMetrics({ id }:TaskExecutionMetricsProps) { - const [ windowLength, setWindowLength ] = useState('HOURS_2') - const [ windows, setWindows ] = useState(12) - const [ lastDate, setLastDate ] = useState(moment().toDate()) - - return
-
-

Task Execution metrics

- -
- - - -
-} diff --git a/dashboard/apps/web/app/taskdef/[id]/sections/TaskRunSearch.tsx b/dashboard/apps/web/app/taskdef/[id]/sections/TaskRunSearch.tsx deleted file mode 100644 index b8521eaf5..000000000 --- a/dashboard/apps/web/app/taskdef/[id]/sections/TaskRunSearch.tsx +++ /dev/null @@ -1,296 +0,0 @@ -'use client' -import { - Button, - CalendarB, - Label, - LoadMoreButton, - Loader, - PerPage, -} from 'ui' -import { useEffect, useState } from 'react' -import moment from 'moment' -import { TaskRunSearchTable } from '../components/search/TaskRunSearchTable' -import type { WfRunId } from '../../../../littlehorse-public-api/object_id' - -export interface Result { - wfRunId: WfRunId; - status?: string; -} - -const allLimit = 5 -const defaultLimit = 15 - -export function TaskRunSearch({ id }: any) { - let first = true - - const [ loading, setLoading ] = useState(false) - const [ firstLoad, setFirstLoad ] = useState(false) - const [ limit, setLimit ] = useState(defaultLimit) - - const [ startDt, setStartDt ] = useState( - moment().startOf('day').toDate() - ) - const [ endDt, setEndDt ] = useState(moment().toDate()) - - const [ errorBookmark, setErrorBookmark ] = useState() - const [ completedBookmark, setCompletedBookmark ] = useState() - const [ startingBookmark, setStartingBookmark ] = useState() - const [ runningBookmark, setRunningBookmark ] = useState() - - const [ type, setType ] = useState('') - const [ searchResults, setSearchResults ] = useState([]) - - const fetchData = async (taskStatus: string, paginate = false, useLimit = true) => { - let bookmark: string | undefined - if (taskStatus === 'TASK_FAILED') {bookmark = errorBookmark} - if (taskStatus === 'TASK_SUCCESS') {bookmark = completedBookmark} - if (taskStatus === 'TASK_SCHEDULED') {bookmark = startingBookmark} - if (taskStatus === 'TASK_RUNNING') {bookmark = runningBookmark} - //TASK_SCHEDULED - - // - TASK_SCHEDULED - // - TASK_RUNNING - // - TASK_SUCCESS - // - TASK_FAILED - // - TASK_TIMEOUT - // - TASK_OUTPUT_SERIALIZING_ERROR - // - TASK_INPUT_VAR_SUB_ERROR - - const filters: any = { - limit: useLimit ? limit : allLimit, - } - // if(prefix?.trim()) filters['prefix'] = prefix.trim().toLocaleLowerCase() - if (paginate && bookmark) {filters.bookmark = bookmark} - if (paginate && !bookmark) {return { status: 'done' }} - const res = await fetch('/api/search/taskRun', { - method: 'POST', - body: JSON.stringify({ - status: taskStatus, - taskDefName: id, - earliestStart: startDt, - latestStart: endDt, - ...filters, - }), - }) - if (res.ok) { - const response = await res.json() - return { ...response, status: 'ok' } - } - } - const getData = async () => { - setLoading(true) - const { results, bookmark } = await fetchData(type) - if (type === 'TASK_FAILED') {setErrorBookmark(bookmark)} - if (type === 'TASK_SUCCESS') {setCompletedBookmark(bookmark)} - if (type === 'TASK_SCHEDULED') {setStartingBookmark(bookmark)} - if (type === 'TASK_RUNNING') {setRunningBookmark(bookmark)} - setSearchResults(results.map((v: Result) => ({ ...v, status: type }))) - setLoading(false) - } - const getMData = async () => { - setErrorBookmark(undefined) - setCompletedBookmark(undefined) - setStartingBookmark(undefined) - setRunningBookmark(undefined) - if (type) {return getData()} - - setLoading(true) - setSearchResults([]) - - const starting = await fetchData('TASK_SCHEDULED', false, false) - setStartingBookmark(starting.bookmark) - setSearchResults((prev) => [ - ...prev, - ...starting.results?.map((v: any) => ({ ...v, status: 'TASK_SCHEDULED' })) || {}, - ]) - - const running = await fetchData('TASK_RUNNING', false, false) - setRunningBookmark(running.bookmark) - setSearchResults((prev) => [ - ...prev, - ...running.results.map((v: any) => ({ ...v, status: 'TASK_RUNNING' })), - ]) - - const completed = await fetchData('TASK_SUCCESS', false, false) - setCompletedBookmark(completed.bookmark) - setSearchResults((prev) => [ - ...prev, - ...completed.results.map((v: any) => ({ ...v, status: 'TASK_SUCCESS' })), - ]) - - const errors = await fetchData('TASK_FAILED', false, false) - setErrorBookmark(errors.bookmark) - setSearchResults((prev) => [ - ...prev, - ...errors.results.map((v: any) => ({ ...v, status: 'TASK_FAILED' })), - ]) - - setFirstLoad(true) - setLoading(false) - } - const loadMMore = async () => { - if (type) {return loadMore()} - setLoading(true) - - if (startingBookmark) { - const starting = await fetchData('TASK_SCHEDULED', true, false) - if (starting.status !== 'done') { - setStartingBookmark(starting.bookmark) - setSearchResults((prev) => [ - ...prev, - ...starting.results.map((v: any) => ({ ...v, status: 'TASK_SCHEDULED' })), - ]) - } - } - if (runningBookmark) { - const running = await fetchData('TASK_RUNNING', true, false) - if (running.status !== 'done') { - setRunningBookmark(running.bookmark) - setSearchResults((prev) => [ - ...prev, - ...running.results.map((v: any) => ({ ...v, status: 'TASK_RUNNING' })), - ]) - } - } - if (completedBookmark) { - const completed = await fetchData('TASK_SUCCESS', true, false) - if (completed.status !== 'done') { - setCompletedBookmark(completed.bookmark) - setSearchResults((prev) => [ - ...prev, - ...completed.results.map((v: any) => ({ ...v, status: 'TASK_SUCCESS' })), - ]) - } - } - if (errorBookmark) { - const tasks = await fetchData('TASK_FAILED', true, false) - if (tasks.status !== 'done') { - setErrorBookmark(tasks.bookmark) - setSearchResults((prev) => [ - ...prev, - ...tasks.results.map((v: any) => ({ ...v, status: 'TASK_FAILED' })), - ]) - } - } - - setLoading(false) - } - const loadMore = async () => { - setLoading(true) - - const { results, bookmark, status } = await fetchData(type, true) - - if (status === 'done') {return} - - if (type === 'TASK_FAILED') {setErrorBookmark(bookmark)} - if (type === 'TASK_SUCCESS') {setCompletedBookmark(bookmark)} - if (type === 'TASK_SCHEDULED') {setStartingBookmark(bookmark)} - if (type === 'TASK_RUNNING') {setRunningBookmark(bookmark)} - setSearchResults((prev) => [ - ...prev, - ...results.map((v: any) => ({ ...v, status: type })), - ]) - setLoading(false) - } - - // const keyDownHandler = (e:React.KeyboardEvent) => { - // clearTimeout(myTimeout) - // if( e.key == 'Enter' ) return getMData() - // myTimeout = setTimeout(getMData, keyDownDelay); - // } - - useEffect(() => { - if (firstLoad) {getMData()} - }, [ type ]) - - useEffect(() => { - if (firstLoad) {getMData()} - }, [ startDt, endDt ]) - - useEffect(() => { - if (!first) {return} - first = false - getMData() - }, []) - return ( -
-
-

TaskRun search

-
- - - - - - - -
-
-
- {searchResults.length > 0 ? ( - - ) : ( - - )} -
-
-
- {type ? ( - <> - - {' '} - - ) : undefined} - - Load More - -
-
-
- ) -} diff --git a/dashboard/apps/web/app/usertaskdef/[id]/[version]/components/VersionChanger.tsx b/dashboard/apps/web/app/usertaskdef/[id]/[version]/components/VersionChanger.tsx deleted file mode 100644 index 2e3eac633..000000000 --- a/dashboard/apps/web/app/usertaskdef/[id]/[version]/components/VersionChanger.tsx +++ /dev/null @@ -1,42 +0,0 @@ -'use client' -import { useRouter } from 'next/navigation' -import { useEffect, useState } from 'react' -import { Label } from 'ui' - -interface VersionChangerProps{ - version:string - id: string -} -export function VersionChanger({ version, id }:VersionChangerProps) { - const router = useRouter() - - const [ versions, setVersions ] = useState([ version ]) - const getVersions = async () => { - const res = await fetch('/api/search/userTaskDef',{ - method:'POST', - body: JSON.stringify({ - prefix:id - }), - }) - if (res.ok){ - const { results } = await res.json() - setVersions(results.map( (r:any) => r.version)) - } - - } - const changeV = (selectedVersion: string) => { - router.push(`/usertaskdef/${id}/${selectedVersion}`) - } - useEffect( () => { - getVersions() - },[]) - return
- -
- - -
-
-} diff --git a/dashboard/apps/web/app/usertaskdef/[id]/[version]/page.tsx b/dashboard/apps/web/app/usertaskdef/[id]/[version]/page.tsx deleted file mode 100644 index 5e98a84c0..000000000 --- a/dashboard/apps/web/app/usertaskdef/[id]/[version]/page.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import Breadcrumbs from '../../../../components/Breadcrumbs' -import { UserTaskDefSchemaInformation } from './sections/userTaskDefSchemaInformation' -import { UserTaskRunSearch } from './sections/userTaskRunSearch' - -function WfRun({ - params, -}: { - params: { id: string; version: string; name: string }; -}) { - return ( - <> -

- UserTaskDef{' '} - |{' '} - {params.id.charAt(0) + params.id.slice(1)}{' '} -

- - - - - - - - ) -} -export default WfRun diff --git a/dashboard/apps/web/app/usertaskdef/[id]/[version]/search/userTaskRunSearchTable.tsx b/dashboard/apps/web/app/usertaskdef/[id]/[version]/search/userTaskRunSearchTable.tsx deleted file mode 100644 index 8b24ec55d..000000000 --- a/dashboard/apps/web/app/usertaskdef/[id]/[version]/search/userTaskRunSearchTable.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import Link from 'next/link' -import type { Result } from '../sections/userTaskRunSearch' - -interface UserTaskRunSearchTableProps { - wfspec: string; - results?: Result[]; -} -export function UserTaskRunSearchTable({ results }: UserTaskRunSearchTableProps) { - return ( -
- {results ? - - - - - - - - - {results.map((r: Result) => ( - - - - - - ))} - -
NAME / IDGUIDSTATUS
- - {r?.wfRunId.id} - - {r?.userTaskGuid} {r?.status}
: null} -
- ) -} diff --git a/dashboard/apps/web/app/usertaskdef/[id]/[version]/sections/userTaskDefSchemaInformation.tsx b/dashboard/apps/web/app/usertaskdef/[id]/[version]/sections/userTaskDefSchemaInformation.tsx deleted file mode 100644 index cc04a2fae..000000000 --- a/dashboard/apps/web/app/usertaskdef/[id]/[version]/sections/userTaskDefSchemaInformation.tsx +++ /dev/null @@ -1,103 +0,0 @@ -'use client' -import { useEffect, useState } from 'react' -import { Loading } from 'ui/components/Loading' -import { VersionChanger } from '../components/VersionChanger' - -export function UserTaskDefSchemaInformation({ - id, - version, -}: { - id: string; - version: string; -}) { - const [ loadingInputVars, setLoadingInputVars ] = useState(true) - const [ fieldsInputs, setFieldsInputs ] = useState([]) - - const taskInformation = async () => { - const res = await fetch('/api/information/userTaskDef', { - method: 'POST', - body: JSON.stringify({ - id, - version, - }), - }) - if (res.ok) { - res.json().then((data) => { - setFieldsInputs(data.fields) - setLoadingInputVars(false) - }) - } - } - - useEffect(() => { - taskInformation() - }, []) - - const renderFieldInputs = () => { - if (fieldsInputs.length) { - return fieldsInputs.map((fields, index) => ( - - - {fields.name} - - - {fields.displayName} - - - {fields.type} - - - )) - } - - if (loadingInputVars) { - return - - - - - } - - return - -
- No variables required -
- - - } - - return ( -
-
-

UserTaskDef Schema Information

- -
- -
- - - - - - - - - - - {renderFieldInputs()} - -
Input Variables
NAMEDISPLAY NAMETYPE
-
-
- ) -} diff --git a/dashboard/apps/web/app/usertaskdef/[id]/[version]/sections/userTaskRunSearch.tsx b/dashboard/apps/web/app/usertaskdef/[id]/[version]/sections/userTaskRunSearch.tsx deleted file mode 100644 index 801e61321..000000000 --- a/dashboard/apps/web/app/usertaskdef/[id]/[version]/sections/userTaskRunSearch.tsx +++ /dev/null @@ -1,346 +0,0 @@ -'use client' -import { - Button, - CalendarB, - Input, - Label, - LoadMoreButton, - Loader, - PerPage, -} from 'ui' -import { useEffect, useState } from 'react' -import moment from 'moment' -import { UserTaskRunSearchTable } from '../search/userTaskRunSearchTable' -import type { WfRunId } from '../../../../../littlehorse-public-api/object_id' - -export interface Result { - id: any; - wfRunId: WfRunId; - userTaskGuid: string; - status?: string; -} - -const allLimit = 5 -const defaultLimit = 15 -const keyDownDelay = 1000 // miliseconds - -let myTimeout: NodeJS.Timeout - -export function UserTaskRunSearch({ id }: any) { - let first = true - - const [ userId, setUserId ] = useState('') - const keyDownHandler = (e: React.KeyboardEvent) => { - clearTimeout(myTimeout) - if (e.key === 'Enter') {return getMData()} - myTimeout = setTimeout(getMData, keyDownDelay) - } - - const [ loading, setLoading ] = useState(false) - const [ firstLoad, setFirstLoad ] = useState(false) - const [ limit, setLimit ] = useState(defaultLimit) - - const [ startDt, setStartDt ] = useState( - moment().startOf('day').toDate() - ) - const [ endDt, setEndDt ] = useState(moment().toDate()) - const [ assignedBookmark, setAssignedBookmark ] = useState() - const [ unAssignedBookmark, setUnAssignedBookmark ] = useState() - const [ doneBookmark, setDoneBookmark ] = useState() - const [ cancelledBookmark, setCancelledBookmark ] = useState() - - const [ type, setType ] = useState('') - const [ userTaskSearchResults, setUserTaskSearchResults ] = useState([]) - - const fetchData = async ( - userTaskStatus: string, - paginate = false, - useLimit = true - ) => { - let bookmark: string | undefined - if (userTaskStatus === 'ASSIGNED') {bookmark = assignedBookmark} - if (userTaskStatus === 'UNASSIGNED') {bookmark = unAssignedBookmark} - if (userTaskStatus === 'DONE') {bookmark = doneBookmark} - if (userTaskStatus === 'CANCELLED') {bookmark = cancelledBookmark} - - const filters: any = { - limit: useLimit ? limit : allLimit, - } - if (paginate && bookmark) {filters.bookmark = bookmark} - if (paginate && !bookmark) {return { status: 'done' }} - if (userId) {filters.user = { id: userId }} - - const res = await fetch('/api/search/userTaskRun', { - method: 'POST', - body: JSON.stringify({ - status: userTaskStatus, - userTaskDefName: id, - // userGroup: "string", - earliestStart: startDt, - latestStart: endDt, - - ...filters, - }), - }) - if (res.ok) { - const response = await res.json() - return { ...response, status: 'ok' } - } - } - const getData = async () => { - setLoading(true) - const { results, bookmark } = await fetchData(type) - if (type === 'ASSIGNED') {setAssignedBookmark(bookmark)} - if (type === 'UNASSIGNED') {setUnAssignedBookmark(bookmark)} - if (type === 'DONE') {setDoneBookmark(bookmark)} - if (type === 'CANCELLED') {setCancelledBookmark(bookmark)} - - setUserTaskSearchResults(results.map((v: Result) => ({ ...v, status: type }))) - setLoading(false) - } - const getMData = async () => { - setAssignedBookmark(undefined) - setUnAssignedBookmark(undefined) - setDoneBookmark(undefined) - setCancelledBookmark(undefined) - if (type) {return getData()} - - setLoading(true) - setUserTaskSearchResults([]) - - const assigned = await fetchData('ASSIGNED', false, false) - setAssignedBookmark(assigned.bookmark) - setUserTaskSearchResults((prev) => [ - ...prev, - ...assigned.results?.map((v: any) => ({ - ...v, - status: 'ASSIGNED', - })) || {}, - ]) - - const unassigned = await fetchData('UNASSIGNED', false, false) - setUnAssignedBookmark(unassigned.bookmark) - setUserTaskSearchResults((prev) => [ - ...prev, - ...unassigned.results?.map((v: any) => ({ - ...v, - status: 'UNASSIGNED', - })) || {}, - ]) - - const done = await fetchData('DONE', false, false) - setDoneBookmark(done.bookmark) - setUserTaskSearchResults((prev) => [ - ...prev, - ...done.results?.map((v: any) => ({ - ...v, - status: 'DONE', - })) || {}, - ]) - - const cancelled = await fetchData('CANCELLED', false, false) - setCancelledBookmark(cancelled.bookmark) - setUserTaskSearchResults((prev) => [ - ...prev, - ...cancelled.results?.map((v: any) => ({ - ...v, - status: 'CANCELLED', - })) || {}, - ]) - - setFirstLoad(true) - setLoading(false) - } - const loadMMore = async () => { - if (type) {return loadMore()} - setLoading(true) - - if (assignedBookmark) { - const tasks = await fetchData('ASSIGNED', true, false) - if (tasks.status !== 'done') { - setAssignedBookmark(tasks.bookmark) - setUserTaskSearchResults((prev) => [ - ...prev, - ...tasks.results.map((v: any) => ({ - ...v, - status: 'ASSIGNED', - })), - ]) - } - } - - if (unAssignedBookmark) { - const tasks = await fetchData('UNASSIGNED', true, false) - if (tasks.status !== 'done') { - setUnAssignedBookmark(tasks.bookmark) - setUserTaskSearchResults((prev) => [ - ...prev, - ...tasks.results.map((v: any) => ({ - ...v, - status: 'UNASSIGNED', - })), - ]) - } - } - - if (doneBookmark) { - const tasks = await fetchData('DONE', true, false) - if (tasks.status !== 'done') { - setDoneBookmark(tasks.bookmark) - setUserTaskSearchResults((prev) => [ - ...prev, - ...tasks.results.map((v: any) => ({ - ...v, - status: 'DONE', - })), - ]) - } - } - - if (cancelledBookmark) { - const tasks = await fetchData('CANCELLED', true, false) - if (tasks.status !== 'done') { - setCancelledBookmark(tasks.bookmark) - setUserTaskSearchResults((prev) => [ - ...prev, - ...tasks.results.map((v: any) => ({ - ...v, - status: 'CANCELLED', - })), - ]) - } - } - - setLoading(false) - } - const loadMore = async () => { - setLoading(true) - - const { results, bookmark, status } = await fetchData(type, true) - - if (status === 'done') {return} - - if (type === 'ASSIGNED') {setAssignedBookmark(bookmark)} - if (type === 'UNASSIGNED') {setUnAssignedBookmark(bookmark)} - if (type === 'DONE') {setDoneBookmark(bookmark)} - if (type === 'CANCELLED') {setCancelledBookmark(bookmark)} - - setUserTaskSearchResults((prev) => [ - ...prev, - ...results.map((v: any) => ({ ...v, status: type })), - ]) - setLoading(false) - } - - // const keyDownHandler = (e:React.KeyboardEvent) => { - // clearTimeout(myTimeout) - // if( e.key == 'Enter' ) return getMData() - // myTimeout = setTimeout(getMData, keyDownDelay); - // } - - useEffect(() => { - if (firstLoad) {getMData()} - }, [ type ]) - - useEffect(() => { - if (firstLoad) {getMData()} - }, [ startDt, endDt ]) - - useEffect(() => { - if (!first) {return} - first = false - getMData() - }, []) - return ( -
-

UserTaskRun Search

- { setUserId(e.target.value) }} - onKeyDown={keyDownHandler} - placeholder="Search by assigned User ID or User Group" - type="text" - value={userId} - /> -
-
- - - - - - - -
-
-
- {userTaskSearchResults.length > 0 ? ( - - ) : ( - - )} -
-
-
- {type ? ( - <> - - {' '} - - ) : undefined} - - Load More - -
-
-
- ) -} diff --git a/dashboard/apps/web/app/wfrun/[id]/components/visualizer/TaskNode.tsx b/dashboard/apps/web/app/wfrun/[id]/components/visualizer/TaskNode.tsx deleted file mode 100644 index 143b3ff9f..000000000 --- a/dashboard/apps/web/app/wfrun/[id]/components/visualizer/TaskNode.tsx +++ /dev/null @@ -1,29 +0,0 @@ -export function TaskNode({ d, run }:{ d:any, run?:any }) { - // const [loops, setLoops] = useState([]) - - - // useEffect( () => { - // console.log('dsadasd') - // if(d.loop) getLoops() - // },[]) - - - - return
-
-
- {d.type} - {Boolean(d.node?.failureHandlers?.length) && {d.type}} - -
- {d.name?.split('-').slice(1,-1).join('-')} -
- {(d.name?.split('-')[0] === run.currentNodePosition) && run.status === 'ERROR' && {d.type}} - {(d.name?.split('-')[0] === run.currentNodePosition) && {d.type}} - {/* {loops ? 'y': 'n'} */} - {d.loop ? {d.type} : null} -
-
- {/* {JSON.stringify(d)} */} -
-} diff --git a/dashboard/apps/web/app/wfrun/[id]/components/visualizer/WfRunVisualizer.tsx b/dashboard/apps/web/app/wfrun/[id]/components/visualizer/WfRunVisualizer.tsx deleted file mode 100644 index c2e90357b..000000000 --- a/dashboard/apps/web/app/wfrun/[id]/components/visualizer/WfRunVisualizer.tsx +++ /dev/null @@ -1,164 +0,0 @@ -'use client' -import React, { useEffect, useState } from 'react' -import { Loader } from 'ui' -import WFRunInformationSideBar from '../../../../../components/WFRunInformationSideBar' -import type { ThreadRunNameWithRunNumber } from '../../../../../components/Drawer/DrawerComponent' -import { DrawerComponent } from '../../../../../components/Drawer/DrawerComponent' -import { Drawer } from '../../../../../components/Drawer/Drawer' -import { nodeTypes, } from '../../../../../components/Drawer/internals/drawerInternals' -import { WfSpecGraph } from '../../../../wfspec/[id]/[version]/components/visualizer/WfSpecGraph' -import type { ReactFlowGraph } from '../../../../wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter' - -export function WfRunVisualizer({ - wfRunId -}: { - wfRunId: string; -}) { - const [ wfSpec, setWfSpec ] = useState([]) - const [ selectedNodeName, setSelectedNodeName ] = useState() - const [ nodeType, setNodeType ] = useState() - const [ loading, setLoading ] = useState(true) - - const [ language, setLanguage ] = useState() - const [ showError, setShowError ] = useState(false) - const [ toggleSideBar, setToggleSideBar ] = useState(false) - const [ sideBarData, setSideBarData ] = useState('') - const [ wfSpecMajorVersion, setWfSpecMajorVersion ] = useState(0) - const [ wfSpecRevision, setWfSpecRevision ] = useState(0) - const [ wfSpecName, setWfSpecName ] = useState() - const [ graphLayout, setGraphLayout ] = useState() - const [ threadRunSpecWithNumber, setThreadRunSpecWithNumber ] - = useState({ threadSpecName: 'entrypoint', threadRunNumber: 0 }) - - const setGraphWithNodeRunPosition = (graph) => { - setGraphLayout({ ...graph }) - } - // const getLoops = async (taskDefName, wfRunId) => { - // const res = await fetch('/api/loops/taskRun', { - // method: 'POST', - // body: JSON.stringify({ - // taskDefName, - // wfRunId - // }), - // }) - // if (res.ok) { - // const results = await res.json() - // console.log('RESS', results.length) - // - // return results.length > 1 - // // setLoops(results) - // } - // } - - const [ run, setRun ] = useState() - const [ runs, setRuns ] = useState([]) - const setThreads = (data: any) => { - getWfSpec(data.wfSpecId.name, data.wfSpecId.majorVersion, data.wfSpecId.revision) - setWfSpecMajorVersion(data.wfSpecId.majorVersion) - setWfSpecRevision(data.wfSpecId.revision) - setRun(data.threadRuns[0]) - setRuns(data.threadRuns) - setWfSpecName(data.wfSpecId.name) - } - - const getWfSpec = async (wfSpecNameToSearchFor: string, majorVersion: number, revision: number) => { - const wfSpecResponse = await fetch('/api/visualization/wfSpec', { - method: 'POST', - body: JSON.stringify({ - id: wfSpecNameToSearchFor, - majorVersion, - revision - }), - }) - - if (wfSpecResponse.ok) { - const content = await wfSpecResponse.json() - - if (content) { - setWfSpec(content) - } - } - } - const getData = async () => { - const res = await fetch('/api/visualization/wfRun', { // TODO; new ALGO - method: 'POST', - body: JSON.stringify({ - wfRunId, - }), - }) - if (res.ok) { - const response = await res.json() - setThreads(response) - } - } - - const updateSelectedThreadRun = (threadRunNameWithRunNumber: ThreadRunNameWithRunNumber) => { - setThreadRunSpecWithNumber({ ...threadRunNameWithRunNumber }) - setSelectedNodeName(undefined) - } - - useEffect(() => { - getData() - setLoading(false) - }, []) - - useEffect(() => { - if (selectedNodeName) { - const nodeTypeFromName = selectedNodeName.split('-').reverse()[0] - - setNodeType(nodeTypes[nodeTypeFromName as keyof typeof nodeTypes]) - } - }, [ selectedNodeName ]) - - return ( -
-
- {loading ? ( - - ) : ( - - )} - -
- - - - - -
- ) -} diff --git a/dashboard/apps/web/app/wfrun/[id]/page.tsx b/dashboard/apps/web/app/wfrun/[id]/page.tsx deleted file mode 100644 index fa3fe5348..000000000 --- a/dashboard/apps/web/app/wfrun/[id]/page.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react' -import Breadcrumbs from '../../../components/Breadcrumbs' -import { WfRunVisualization } from './sections/WfRunVisualization' - -function WfRun({ params }: { params: { id: string } }) { - return ( - <> -

- WfRun{' '} - |{' '} - {params.id.charAt(0) + params.id.slice(1)}{' '} -

- - - - - ) -} -export default WfRun diff --git a/dashboard/apps/web/app/wfrun/[id]/sections/WfRunVisualization.tsx b/dashboard/apps/web/app/wfrun/[id]/sections/WfRunVisualization.tsx deleted file mode 100644 index 96d33bb69..000000000 --- a/dashboard/apps/web/app/wfrun/[id]/sections/WfRunVisualization.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { WfRunVisualizer } from '../components/visualizer/WfRunVisualizer' - -export function WfRunVisualization({ id }: any) { - return ( -
-
-

WfRun visualization

-
- - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/VersionChanger.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/VersionChanger.tsx deleted file mode 100644 index 6b4fd3cbd..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/VersionChanger.tsx +++ /dev/null @@ -1,42 +0,0 @@ -'use client' -import { useRouter } from 'next/navigation' -import { useEffect, useState } from 'react' -import { Label } from 'ui' - -interface VersionChangerProps{ - version:string - id: string -} -export function VersionChanger({ version, id }:VersionChangerProps) { - const router = useRouter() - - const [ versions, setVersions ] = useState([ version ]) - const getVersions = async () => { - const res = await fetch('/api/search/wfSpec',{ - method:'POST', - body: JSON.stringify({ - prefix:id - }), - }) - if (res.ok){ - const { results } = await res.json() - setVersions(results.map( (r:any) => r.version)) - } - - } - const changeV = (wfSpecVersion:string) => { - router.push(`/wfspec/${id}/${wfSpecVersion}`) - } - useEffect( () => { - getVersions() - },[]) - return
- -
- - -
-
-} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/common/VersionExtractor.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/common/VersionExtractor.ts deleted file mode 100644 index b3e8ab066..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/common/VersionExtractor.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const getVersionFromFormattedString = (formattedVersion: string) => { - const versionValues = formattedVersion.split('.') - return { - majorVersion: versionValues[0], - revision: versionValues[1] - } -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/metrics/WorkflowExecutionMetrics.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/metrics/WorkflowExecutionMetrics.tsx deleted file mode 100644 index 0e1ecef1e..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/metrics/WorkflowExecutionMetrics.tsx +++ /dev/null @@ -1,161 +0,0 @@ -'use client' - -import { useEffect, useState } from 'react' -import moment, { utc } from 'moment' -import { Button, Loader } from 'ui' -import { WorkflowsChart } from '../../../../../../components/Charts/WorkflowsChart' -import { LatencyChart } from '../../../../../../components/Charts/LatencyChart' -import { getVersionFromFormattedString } from '../common/VersionExtractor' - -export interface TaskDefMetric { - windowStart: Date - type: string - totalStarted: string - totalScheduled: string - totalErrored: string - totalCompelted: string - taskDefName: string - startToCompleteMax: string - startToCompleteAvg: string - scheduleToStartMax: string - ScheduleToStartAvg: string -} - -interface WorkflowExecutionMetricsProps{ - type: string - windows: number - lastWindowStart: Date - id: string - version?: number -} -export function WorkflowExecutionMetrics({ id, version, windows= 16, lastWindowStart=moment().toDate(), type='HOURS_2' }:WorkflowExecutionMetricsProps) { - const [ data, setData ] = useState([]) - const [ chart, setChart ] = useState('workflows') - const windowsNotOverpassing300 = windows > 300 ? 300 : windows - - function timeoutP (_lastWindowStart:Date, metrics:any[]) { - const lastWindowStartAsMoment = moment(_lastWindowStart) - let firstDate:moment.Moment - if (type === 'HOURS_2'){ - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300*2,'hours') - } else if (type === 'DAYS_1'){ - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300,'days') - } else { - const fact = (Number(lastWindowStartAsMoment.format('mm')))%5 - - lastWindowStartAsMoment.subtract(fact,'minutes') - firstDate = lastWindowStartAsMoment.clone().subtract(windowsNotOverpassing300*5,'minutes') - } - const out:any[] =[] - const curr = lastWindowStartAsMoment.clone() - if (type === 'HOURS_2'){ - while (curr.format('YMMDDHH') > firstDate.format('YMMDDHH')){ - out.push({ label:curr.toString() ,data:metrics?.find( d => { - return utc(d.windowStart).format('YMMDDHH') === curr.format('YMMDDHH') || moment(d.windowStart).format('YMMDDHH') === curr.clone().subtract(1,'hour').format('YMMDDHH') - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': id, - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(2,'hours') - } - } else if (type === 'DAYS_1'){ - while (curr.format('YMMDD') > firstDate.format('YMMDD')){ - out.push({ label:curr.toString() ,data:metrics?.find( d => { - return utc(d.windowStart).format('YMMDD') === curr.format('YMMDD') - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': id, - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(1,'days') - } - } else { - while (curr.format('YMMDDHHmm') > firstDate.format('YMMDDHHmm')){ - out.push({ label:curr.toString() ,data:metrics?.find( d => { - return utc(d.windowStart).format('YMMDDHHmm') === curr.format('YMMDDHHmm') - - }) || { - 'windowStart': curr.toString(), - type, - 'taskDefName': id, - 'scheduleToStartMax': '0', - 'scheduleToStartAvg': '0', - 'startToCompleteMax': '0', - 'startToCompleteAvg': '0', - 'totalCompleted': '0', - 'totalErrored': '0', - 'totalStarted': '0', - 'totalScheduled': '0' - } }) - curr.subtract(5,'minutes') - - - } - } - - return (out.reverse()) - - } - - const getData = async () => { - const { majorVersion, revision } = getVersionFromFormattedString(version ? version.toString() : '0.0') - const res = await fetch('/api/metrics/wfSpec',{ - method:'POST', - body: JSON.stringify({ - lastWindowStart, - numWindows: windowsNotOverpassing300, - wfSpecName: id, - majorVersion, - revision, - windowLength: type - }), - }) - if (res.ok){ - const content = await res.json() - setData( timeoutP(lastWindowStart,content.results)) - } - } - - useEffect( () => { - getData() - },[ windowsNotOverpassing300,lastWindowStart, type ]) - - return ( -
-
-
-
- - -
-
- -
{ - data.length > 0 ? - <> - {chart === 'workflows' && } - {chart === 'latency' && } - : - }
-
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/search/WfRunSearchTable.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/search/WfRunSearchTable.tsx deleted file mode 100644 index 4bd4a66c4..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/search/WfRunSearchTable.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import Link from 'next/link' -import type { Result } from '../../sections/WfRunSearch' - -interface WfRunSearchTableProps { - wfspec: string - results?: Result[] -} -export function WfRunSearchTable({ results }: WfRunSearchTableProps) { - return ( -
- {results ? - - - - - - - - {results.map((r: Result) => ( - - - - - ))} - -
NAME / IDSTATUS
- {r.id} - {r.status}
: null} -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/EdgeTypesEnum.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/EdgeTypesEnum.ts deleted file mode 100644 index 4730dee54..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/EdgeTypesEnum.ts +++ /dev/null @@ -1,7 +0,0 @@ -enum EdgeTypes { - SmartEdgeType = 'smartEdge', - SmartStepType = 'SMART_STEP_TYPE', - CustomSmartEdgeType = 'CUSTOM_SMART_EDGE_TYPE' -} - -export default EdgeTypes diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/LabelsUtils.test.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/LabelsUtils.test.ts deleted file mode 100644 index 862f1dde8..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/LabelsUtils.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import LabelsUtils from './LabelsUtils' - -describe('labels Utils', () => { - it('should extract label to be shown in the the screen from node name', () => { - const label = LabelsUtils.extractLabel('2-exit-EXIT') - - expect(label).toEqual('exit') - }) -}) diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/LabelsUtils.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/LabelsUtils.ts deleted file mode 100644 index 49d9fa099..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/LabelsUtils.ts +++ /dev/null @@ -1,9 +0,0 @@ -const extractLabel = (nodeName: string) => { - return nodeName.split('-').slice(1,-1).join('-') -} - -const LabelsUtils = { - extractLabel -} - -export default LabelsUtils diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/TaskNode.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/TaskNode.tsx deleted file mode 100644 index 792e6c7e9..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/TaskNode.tsx +++ /dev/null @@ -1,14 +0,0 @@ -export function TaskNode({ d }:{ d:any }) { - - return
-
-
- {d.type} - {Boolean(d.node.failureHandlers?.length) && {d.type}} -
- {d.name.split('-').slice(1,-1).join('-')} -
-
-
-
-} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/WfSpecGraph.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/WfSpecGraph.tsx deleted file mode 100644 index a4b797027..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/WfSpecGraph.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import type { MouseEvent as ReactMouseEvent } from 'react' -import { useEffect, useMemo, useState } from 'react' -import type { Edge } from 'reactflow' -import { ReactFlow } from 'reactflow' -import 'reactflow/dist/style.css' -import { SmartBezierEdge, SmartStepEdge } from '@tisoap/react-flow-smart-edge' -import EntrypointNodeType from './nodeTypes/EntrypointNodeType' -import ExitNodeType from './nodeTypes/ExitNodeType' -import NopNodeType from './nodeTypes/NopNodeType' -import TaskNodeType from './nodeTypes/TaskNodeType' -import SpawnThreadNodeType from './nodeTypes/SpawnThreadNodeType' -import WaitForThreadsNodeType from './nodeTypes/WaitForThreadsNodeType' -import EdgeTypesEnum from './EdgeTypesEnum' -import ExternalEventNodeType from './nodeTypes/ExternalEventNodeType' -import SleepNodeType from './nodeTypes/SleepNodeType' -import SpawnMultipleThreadsNodeType from './nodeTypes/SpawnMultipleThreadsNodeType' -import UserTaskNodeType from './nodeTypes/UserTaskNodeType' -import { CustomSmartEdgeType } from './edgeTypes/CustomSmartEdgeType' -import type { ReactFlowNodeWithLHInfo } from './mappers/GraphLayouter' - -interface WfSpecGraphProps { - wfSpecName: string | undefined, - wfSpecMajorVersion: number, - wfSpecRevision: number, - setSelectedNodeName: any, - threadSpec: string, - threadRunNumber: number | null, - isWfSpecVisualization: boolean, - wfRunId: string | null, - setGraphWithNodeRunPosition: any - -} - -export function WfSpecGraph({ - wfSpecName, - wfSpecMajorVersion, - wfSpecRevision, - setSelectedNodeName, - threadSpec, - threadRunNumber, - isWfSpecVisualization, - wfRunId, - setGraphWithNodeRunPosition -}: WfSpecGraphProps) { - const nodeTypes = useMemo(() => ({ - 'entrypointNodeType': EntrypointNodeType, - 'taskNodeType': TaskNodeType, - 'nopNodeType': NopNodeType, - 'exitNodeType': ExitNodeType, - 'spawnThreadNodeType': SpawnThreadNodeType, - 'waitForThreadsNodeType': WaitForThreadsNodeType, - 'externalEventNodeType': ExternalEventNodeType, - 'sleepNodeType': SleepNodeType, - 'spawnMultipleThreadsNodeType': SpawnMultipleThreadsNodeType, - 'userTaskNodeType': UserTaskNodeType - }), []) - - const edgeTypes = useMemo(() => ({ - [EdgeTypesEnum.SmartEdgeType]: SmartBezierEdge, - [EdgeTypesEnum.CustomSmartEdgeType]: CustomSmartEdgeType, - [EdgeTypesEnum.SmartStepType]: SmartStepEdge - }), []) - - const [ reactFlowGraphLayouted, setReactFlowGraphLayouted ] = useState({ - nodes: [] as ReactFlowNodeWithLHInfo[], - edges: [] as Edge[] - }) - - const getLayoutedGraph = async () => { - if (wfSpecMajorVersion !== undefined && wfSpecRevision !== undefined && wfSpecName !== undefined && threadSpec !== undefined) { - const layoutedGraphResponse = await fetch('/api/visualization/workflowLayoutedGraph', { - method: 'POST', - body: JSON.stringify({ - wfSpecName, - majorVersion: wfSpecMajorVersion, - revision: wfSpecRevision, - threadSpec, - threadRunNumber, - isWfSpecVisualization, - wfRunId - }) - }) - - if (layoutedGraphResponse.ok) { - layoutedGraphResponse.json().then((layoutedGraph) => { - if (layoutedGraph !== undefined && layoutedGraph.nodes !== undefined) { - layoutedGraph.nodes = layoutedGraph.nodes.map(node => { - return { ...node, data: { ...node.data, isWfSpecVisualization } } - }) - - setReactFlowGraphLayouted(layoutedGraph) - setGraphWithNodeRunPosition(layoutedGraph) - } - }) - } - } - } - - useEffect(() => { - getLayoutedGraph() - }, [ wfSpecName, wfSpecRevision, wfSpecMajorVersion, threadSpec, threadRunNumber ]) - - const onNodeClick = (_: ReactMouseEvent, node: ReactFlowNodeWithLHInfo) => { - setSelectedNodeName(node.id) - } - - return ( -
- -
- ) - -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/WfSpecVisualizer.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/WfSpecVisualizer.tsx deleted file mode 100644 index 8fc68d843..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/WfSpecVisualizer.tsx +++ /dev/null @@ -1,138 +0,0 @@ -'use client' -import React, { useEffect, useState } from 'react' -import { Loader } from 'ui' -import { Drawer } from '../../../../../../components/Drawer/Drawer' -import { getMainDrawerData, nodeTypes } from '../../../../../../components/Drawer/internals/drawerInternals' -import WFRunInformationSideBar from '../../../../../../components/WFRunInformationSideBar' -import { WfSpecDrawerComponent } from '../../../../../../components/Drawer/WfSpecDrawerComponent' -import { WfSpecGraph } from './WfSpecGraph' -import { getVersionFromFormattedString } from '../common/VersionExtractor' - -interface WfSpecVisualizerProps { - id: string - version: string -} - -export function WfSpecVisualizer({ id, version }: WfSpecVisualizerProps) { - - const [ rawData, setRawData ] = useState([]) - const [ wfSpec, setWfSpec ] = useState([]) - const [ drawerData, setDrawerData ] = useState() - const [ selectedNodeName, setSelectedNodeName ] = useState() - const [ nodeType, setNodeType ] = useState() - const [ loading, setLoading ] = useState(true) - - const [ language, setLanguage ] = useState() - const [ showError, setShowError ] = useState(false) - const [ toggleSideBar, setToggleSideBar ] = useState(false) - const [ sideBarData, setSideBarData ] = useState('') - const [ threadSpec, setThreadSpec ] = useState('entrypoint') - const [ graphLayout, setGraphLayout ] = useState() - - const setGraphWithNodeRunPosition = (graph) => { - setGraphLayout({ ...graph }) - } - - const mapData = (data: any, thread?: string) => { - const threads = Object.keys(data?.threadSpecs) - const printThread = thread || threads[0] - const entries = Object.entries(data?.threadSpecs?.[printThread]?.nodes) - const mappedData: any = entries.map((e: any) => ({ - name: e[0], - type: e[0].split('-').pop(), - position: e[0].split('-').shift(), - node: e[1], - childs: e[1].outgoingEdges.map(outgoingEdge => outgoingEdge.sinkNodeName), - level: 0, - closer: false, - while: false, - px: 'center' - })) - - setLoading(false) - - return mappedData - } - const getWfSpec = async () => { - const res = await fetch('/api/visualization/wfSpec', { - method: 'POST', - body: JSON.stringify({ - id, - version - }) - }) - if (res.ok) { - const foundWfSpec = await res.json() - setRawData(foundWfSpec) - setWfSpec(mapData(foundWfSpec)) - } - } - const setThread = (thread: string) => { - setSelectedNodeName(undefined) - setWfSpec(mapData(rawData, thread)) - setThreadSpec(thread) - } - - useEffect(() => { - if (drawerData === undefined) {getMainDrawerData(id, setDrawerData)} - - if (selectedNodeName) { - const nodePostFix = selectedNodeName.split('-').reverse()[0] - - setNodeType(nodeTypes[nodePostFix as keyof typeof nodeTypes]) - } - }, [ drawerData, selectedNodeName ]) - - useEffect(() => { - getWfSpec() - }, []) - - return ( - -
-
- - {loading ? ( - - ) : ( - - - ) - } -
- - - - - - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/edgeTypes/CustomSmartEdgeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/edgeTypes/CustomSmartEdgeType.tsx deleted file mode 100644 index f1e0354c0..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/edgeTypes/CustomSmartEdgeType.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { getSmartEdge } from '@tisoap/react-flow-smart-edge' -import { BezierEdge, useNodes } from 'reactflow' - - -export function CustomSmartEdgeType(props) { - const NODE_PADDING_THAT_SHOW_EDGES_IN_A_REASONABLE_POSITION_IN_THE_SCREEN = 60 - - const { - sourcePosition, - targetPosition, - sourceX, - sourceY, - targetX, - targetY, - style, - markerStart, - markerEnd, - label - } = props - - const nodes = useNodes() - const getSmartEdgeResponse = getSmartEdge({ - sourcePosition, - targetPosition, - sourceX, - sourceY, - targetX, - targetY, - nodes, - options: { - nodePadding: NODE_PADDING_THAT_SHOW_EDGES_IN_A_REASONABLE_POSITION_IN_THE_SCREEN, - gridRatio: 10 - } - }) - - // If the value returned is null, it means "getSmartEdge" was unable to find - // a valid path, and you should do something else instead - if (getSmartEdgeResponse === null) { - return - } - - const { edgeCenterX, edgeCenterY, svgPathString } = getSmartEdgeResponse - - return ( - <> - - -
{label}
-
- - ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/extractors/EdgeLabelExtractor.test.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/extractors/EdgeLabelExtractor.test.ts deleted file mode 100644 index f221ec30c..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/extractors/EdgeLabelExtractor.test.ts +++ /dev/null @@ -1,694 +0,0 @@ -import { faker } from '@faker-js/faker' -import { VariableType } from '../../../../../../../littlehorse-public-api/common_enums' -import { Comparator } from '../../../../../../../littlehorse-public-api/common_wfspec' -import { Edge } from '../../../../../../../littlehorse-public-api/wf_spec' -import EdgeLabelExtractor from './EdgeLabelExtractor' - -describe('extracts edge label out of a LH Node', () => { - - it('label should be empty if the edge does not have a condition', () => { - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK' - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual('') - }) - - describe('when a variable is on the left side', () => { - it.each([ - [ Comparator.GREATER_THAN, '>' ], - [ Comparator.LESS_THAN, '<' ], - [ Comparator.GREATER_THAN_EQ, '>=' ], - [ Comparator.LESS_THAN_EQ, '<=' ], - [ Comparator.EQUALS, '=' ], - [ Comparator.NOT_EQUALS, '!=' ], - ])('a NULL when literal value type is NULL', (comparator: Comparator, comparatorSymbol: string) => { - const variableName = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - comparator, - 'left': { - variableName - }, - 'right': { - 'literalValue': {} - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${variableName} ${comparatorSymbol} NULL`) - }) - - it('a > b conditional when json path is provided and the literal value is of type NULL', () => { - const jsonPath = `$.${faker.lorem.word()}` - const variableName = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.GREATER_THAN, - 'left': { - jsonPath, - variableName - }, - 'right': { - 'literalValue': {} - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${jsonPath} within ${variableName} > NULL`) - }) - - it('a > b conditional when json path is provided', () => { - const jsonPath = `$.${faker.lorem.word()}` - const variableName = faker.lorem.word() - const literalValue = Math.floor(Math.random() * 10) - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.GREATER_THAN, - 'left': { - jsonPath, - variableName - }, - 'right': { - 'literalValue': { - 'type': VariableType.INT, - 'int': literalValue - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${jsonPath} within ${variableName} > ${literalValue}`) - }) - - it.each([ - [ Comparator.GREATER_THAN, '>', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.GREATER_THAN, '>', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.GREATER_THAN, '>', 'str', VariableType.STR, 'a word' ], - [ Comparator.LESS_THAN, '<', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.LESS_THAN, '<', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.LESS_THAN, '<', 'str', VariableType.STR, 'a word' ], - [ Comparator.GREATER_THAN_EQ, '>=', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.GREATER_THAN_EQ, '>=', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.GREATER_THAN_EQ, '>=', 'str', VariableType.STR, 'a word' ], - [ Comparator.LESS_THAN_EQ, '<=', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.LESS_THAN_EQ, '<=', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.LESS_THAN_EQ, '<=', 'str', VariableType.STR, 'a word' ], - [ Comparator.EQUALS, '=', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.EQUALS, '=', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.EQUALS, '=', 'str', VariableType.STR, 'a word' ], - [ Comparator.EQUALS, '=', 'bool', VariableType.BOOL, true ], - [ Comparator.EQUALS, '=', 'bool', VariableType.BOOL, false ], - [ Comparator.NOT_EQUALS, '!=', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.NOT_EQUALS, '!=', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.NOT_EQUALS, '!=', 'str', VariableType.STR, 'a word' ], - [ Comparator.NOT_EQUALS, '!=', 'bool', VariableType.BOOL, true ], - [ Comparator.NOT_EQUALS, '!=', 'bool', VariableType.BOOL, false ], - ])('a %s b with type: %s and value: %s', (comparator: Comparator, comparatorSymbol: string, literalValueType: string, variableType: VariableType, variableValue: any) => { - const variableName = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - comparator, - 'left': { - variableName - }, - 'right': { - 'literalValue': { - 'type': variableType, - [literalValueType]: variableValue - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${variableName} ${comparatorSymbol} ${variableValue}`) - }) - - it.each([ - [ [ 1.1, 2.1, 3.3 ] ], - [ [ 1, 2, 3 ] ], - [ [ '1', '2', '3' ] ] - ])('a IN b with for array: %s', (variableValue: []) => { - const variableName = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.IN, - 'left': { - variableName - }, - 'right': { - 'literalValue': { - 'type': 'JSON_ARR', - 'jsonArr': `[${variableValue}]` - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${variableName} IN [${variableValue}]`) - }) - - it.each([ - [ [ 1.1, 2.1, 3.3 ] ], - [ [ 1, 2, 3 ] ], - [ [ '1', '2', '3' ] ] - ])('a NOT IN b with for array: %s', (variableValue: []) => { - const variableName = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.NOT_IN, - 'left': { - variableName - }, - 'right': { - 'literalValue': { - 'type': 'JSON_ARR', - 'jsonArr': `[${variableValue}]` - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${variableName} NOT IN [${variableValue}]`) - }) - }) - - describe('when a variable is on the right side', () => { - it.each([ - [ Comparator.GREATER_THAN, '>' ], - [ Comparator.LESS_THAN, '<' ], - [ Comparator.GREATER_THAN_EQ, '>=' ], - [ Comparator.LESS_THAN_EQ, '<=' ], - [ Comparator.EQUALS, '=' ], - [ Comparator.NOT_EQUALS, '!=' ], - ])('a %s NULL when literal value type is NULL', (comparator: Comparator, comparatorSymbol: string) => { - const variableName = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - comparator, - 'left': { - 'literalValue': {} - }, - 'right': { - variableName - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`NULL ${comparatorSymbol} ${variableName}`) - }) - - it('a > b conditional when json path is provided and the literal value is of type NULL', () => { - const jsonPath = `$.${faker.lorem.word()}` - const variableName = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.GREATER_THAN, - 'left': { - 'literalValue': {} - }, - 'right': { - jsonPath, - variableName - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`NULL > ${jsonPath} within ${variableName}`) - }) - - it.each([ - [ Comparator.GREATER_THAN, '>', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.GREATER_THAN, '>', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.GREATER_THAN, '>', 'str', VariableType.STR, 'a word' ], - [ Comparator.LESS_THAN, '<', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.LESS_THAN, '<', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.LESS_THAN, '<', 'str', VariableType.STR, 'a word' ], - [ Comparator.GREATER_THAN_EQ, '>=', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.GREATER_THAN_EQ, '>=', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.GREATER_THAN_EQ, '>=', 'str', VariableType.STR, 'a word' ], - [ Comparator.LESS_THAN_EQ, '<=', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.LESS_THAN_EQ, '<=', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.LESS_THAN_EQ, '<=', 'str', VariableType.STR, 'a word' ], - [ Comparator.EQUALS, '=', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.EQUALS, '=', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.EQUALS, '=', 'str', VariableType.STR, 'a word' ], - [ Comparator.NOT_EQUALS, '!=', 'double', VariableType.DOUBLE, Math.random() * 10 ], - [ Comparator.NOT_EQUALS, '!=', 'int', VariableType.INT, Math.floor(Math.random() * 10) ], - [ Comparator.NOT_EQUALS, '!=', 'str', VariableType.STR, 'a word' ], - ])('a %s b with type: %s and value: %s', (comparator: Comparator, comparatorSymbol: string, literalValueType: string, variableType: VariableType, variableValue: any) => { - const variableName = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - comparator, - 'left': { - 'literalValue': { - 'type': variableType, - [literalValueType]: variableValue - } - - }, - 'right': { - variableName - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${variableValue} ${comparatorSymbol} ${variableName}`) - }) - - - it('a > b conditional when json path is provided', () => { - const jsonPath = `$.${faker.lorem.word()}` - const variableName = faker.lorem.word() - const literalValue = Math.floor(Math.random() * 10) - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.GREATER_THAN, - 'left': { - 'literalValue': { - 'type': VariableType.INT, - 'int': literalValue - } - }, - 'right': { - jsonPath, - variableName - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${literalValue} > ${jsonPath} within ${variableName}`) - }) - - it.each([ - [ [ 1.1, 2.1, 3.3 ] ], - [ [ 1, 2, 3 ] ], - [ [ '1', '2', '3' ] ] - ])('a IN b with for array: %s', (variableValue: []) => { - const variableName = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '3-task-b-TASK', - 'condition': { - 'comparator': Comparator.IN, - 'left': { - 'literalValue': { - 'type': 'JSON_ARR', - 'jsonArr': `[${variableValue}]` - } - }, - 'right': { - variableName - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`[${variableValue}] IN ${variableName}`) - }) - - it.each([ - [ [ 1.1, 2.1, 3.3 ] ], - [ [ 1, 2, 3 ] ], - [ [ '1', '2', '3' ] ] - ])('a NOT IN b with for array: %s', (variableValue: []) => { - const variableName = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '3-task-b-TASK', - 'condition': { - 'comparator': Comparator.IN, - 'left': { - 'literalValue': { - 'type': 'JSON_ARR', - 'jsonArr': `[${variableValue}]` - } - }, - 'right': { - variableName - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`[${variableValue}] IN ${variableName}`) - }) - }) - - describe('when a variable is on both sides', () => { - - it.each([ - [ Comparator.GREATER_THAN, '>' ], - [ Comparator.GREATER_THAN_EQ, '>=' ], - [ Comparator.LESS_THAN, '<' ], - [ Comparator.LESS_THAN_EQ, '<=' ], - [ Comparator.EQUALS, '=' ], - [ Comparator.NOT_EQUALS, '!=' ], - [ Comparator.IN, 'IN' ], - [ Comparator.NOT_IN, 'NOT IN' ] - ])('a %s conditional', (comparator: Comparator, comparatorSymbol: string) => { - const varOnTheLeft = faker.lorem.word() - const varOnTheRight = faker.lorem.word() - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - comparator, - 'left': { - 'variableName': varOnTheLeft - }, - 'right': { - 'variableName': varOnTheRight - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${varOnTheLeft} ${comparatorSymbol} ${varOnTheRight}`) - }) - - it('a > b conditional when json path is provided', () => { - const leftJsonPath = `$.${faker.lorem.word()}` - const leftVariableName = faker.lorem.word() - const rightJsonPath = `$.${faker.lorem.word()}` - const rightVariableName = faker.lorem.word() - - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.GREATER_THAN, - 'left': { - 'jsonPath': leftJsonPath, - 'variableName': leftVariableName - }, - 'right': { - 'jsonPath': rightJsonPath, - 'variableName': rightVariableName - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${leftJsonPath} within ${leftVariableName} > ${rightJsonPath} within ${rightVariableName}`) - }) - }) - - describe('when a literal is on both sides', () => { - it.each([ - [ 'double', VariableType.DOUBLE, 2.1, 1.1 ], - [ 'int', VariableType.INT, 2, 1 ], - [ 'str', VariableType.STR, 'a', 'b' ] - ])('a > b with type: %s and value: %s', (literalValueType: string, variableType: VariableType, leftVariableValue: any, rightVariableValue: any) => { - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.GREATER_THAN, - 'left': { - 'literalValue': { - 'type': variableType, - [literalValueType]: leftVariableValue - } - }, - 'right': { - 'literalValue': { - 'type': variableType, - [literalValueType]: rightVariableValue - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${leftVariableValue} > ${rightVariableValue}`) - }) - - it.each([ - [ 'double', VariableType.DOUBLE, 1.1, 2.1 ], - [ 'int', VariableType.INT, 1, 2 ], - [ 'str', VariableType.STR, 'b', 'a' ] - ])('a < b with type: %s and value: %s', (literalValueType: string, variableType: VariableType, leftVariableValue: any, rightVariableValue: any) => { - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.LESS_THAN, - 'left': { - 'literalValue': { - 'type': variableType, - [literalValueType]: leftVariableValue - } - }, - 'right': { - 'literalValue': { - 'type': variableType, - [literalValueType]: rightVariableValue - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${leftVariableValue} < ${rightVariableValue}`) - }) - - it.each([ - [ 'double', VariableType.DOUBLE, 1.1, 2.1 ], - [ 'int', VariableType.INT, 1, 1 ], - [ 'str', VariableType.STR, 'b', 'a' ] - ])('a <= b with type: %s and value: %s', (literalValueType: string, variableType: VariableType, leftVariableValue: any, rightVariableValue: any) => { - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.LESS_THAN_EQ, - 'left': { - 'literalValue': { - 'type': variableType, - [literalValueType]: leftVariableValue - } - }, - 'right': { - 'literalValue': { - 'type': variableType, - [literalValueType]: rightVariableValue - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${leftVariableValue} <= ${rightVariableValue}`) - }) - - it.each([ - [ 'double', VariableType.DOUBLE, 2.1, 1.1 ], - [ 'int', VariableType.INT, 2, 1 ], - [ 'str', VariableType.STR, 'a', 'b' ] - ])('a >= b with type: %s and value: %s', (literalValueType: string, variableType: VariableType, leftVariableValue: any, rightVariableValue: any) => { - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.GREATER_THAN_EQ, - 'left': { - 'literalValue': { - 'type': variableType, - [literalValueType]: leftVariableValue - } - }, - 'right': { - 'literalValue': { - 'type': variableType, - [literalValueType]: rightVariableValue - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${leftVariableValue} >= ${rightVariableValue}`) - }) - - - it.each([ - [ 'double', VariableType.DOUBLE, 1.1, 1.1 ], - [ 'int', VariableType.INT, 1, 1 ], - [ 'str', VariableType.STR, 'a', 'a' ] - ])('a = b with type: %s and value: %s', (literalValueType: string, variableType: VariableType, leftVariableValue: any, rightVariableValue: any) => { - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.EQUALS, - 'left': { - 'literalValue': { - 'type': variableType, - [literalValueType]: leftVariableValue - } - }, - 'right': { - 'literalValue': { - 'type': variableType, - [literalValueType]: rightVariableValue - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${leftVariableValue} = ${rightVariableValue}`) - }) - - it.each([ - [ 'double', VariableType.DOUBLE, 2.1, 1.1 ], - [ 'int', VariableType.INT, 2, 1 ], - [ 'str', VariableType.STR, 'a', 'b' ] - ])('a != b with type: %s and value: %s', (literalValueType: string, variableType: VariableType, leftVariableValue: any, rightVariableValue: any) => { - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.NOT_EQUALS, - 'left': { - 'literalValue': { - 'type': variableType, - [literalValueType]: leftVariableValue - } - }, - 'right': { - 'literalValue': { - 'type': variableType, - [literalValueType]: rightVariableValue - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${leftVariableValue} != ${rightVariableValue}`) - }) - - it.each([ - [ VariableType.INT, VariableType.JSON_ARR, 'int', 'jsonArr', 1.1, '[1.1, 2.1, 3.3]' ], - [ VariableType.INT, VariableType.JSON_ARR, 'int', 'jsonArr', 1, '[1, 2, 3]' ], - [ VariableType.INT, VariableType.JSON_ARR, 'str', 'jsonArr', '1', '["1", "2", "3"]' ], - [ VariableType.STR, VariableType.STR, 'str', 'str', '1', '1234' ], - [ VariableType.INT, VariableType.STR, 'int', 'str', 1, '1234' ], - [ VariableType.DOUBLE, VariableType.STR, 'double', 'str', 1.0, '1.0234' ], - [ VariableType.JSON_OBJ, VariableType.JSON_OBJ, 'jsonObj', 'jsonObj', '{"a":1}', '{"a":1}' ], - [ VariableType.STR, VariableType.JSON_OBJ, 'str', 'jsonObj', 'a', '{"a":1}' ], - [ VariableType.JSON_ARR, VariableType.JSON_ARR, 'jsonArr', 'jsonArr', '[1,2]', '[1,2]' ], - ])('a IN b with for array: %s', (leftLiteralValueType: VariableType, rightLiteralValueType: VariableType, leftLiteralValueKey: string, rightLiteralValueKey: string, leftLiteralValue: any, rightLiteralValue: string) => { - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.IN, - 'left': { - 'literalValue': { - 'type': leftLiteralValueType, - [leftLiteralValueKey]: leftLiteralValue - } - }, - 'right': { - 'literalValue': { - 'type': rightLiteralValueType, - [rightLiteralValueKey]: rightLiteralValue - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${leftLiteralValue} IN ${rightLiteralValue}`) - }) - - it.each([ - [ VariableType.INT, VariableType.JSON_ARR, 'int', 'jsonArr', 1.1, '[1.1, 2.1, 3.3]' ], - [ VariableType.INT, VariableType.JSON_ARR, 'int', 'jsonArr', 1, '[1, 2, 3]' ], - [ VariableType.INT, VariableType.JSON_ARR, 'str', 'jsonArr', '1', '["1", "2", "3"]' ], - [ VariableType.STR, VariableType.STR, 'str', 'str', '1', '1234' ], - [ VariableType.INT, VariableType.STR, 'int', 'str', 1, '1234' ], - [ VariableType.DOUBLE, VariableType.STR, 'double', 'str', 1.0, '1.0234' ], - [ VariableType.JSON_OBJ, VariableType.JSON_OBJ, 'jsonObj', 'jsonObj', '{"a":1}', '{"a":1}' ], - [ VariableType.STR, VariableType.JSON_OBJ, 'str', 'jsonObj', 'a', '{"a":1}' ], - [ VariableType.JSON_ARR, VariableType.JSON_ARR, 'jsonArr', 'jsonArr', '[1,2]', '[1,2]' ], - ])('a NOT IN b with for array: %s', (leftLiteralValueType: VariableType, rightLiteralValueType: VariableType, leftLiteralValueKey: string, rightLiteralValueKey: string, leftLiteralValue: any, rightLiteralValue: string) => { - - const edge: Edge = Edge.fromJSON({ - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.NOT_IN, - 'left': { - 'literalValue': { - 'type': leftLiteralValueType, - [leftLiteralValueKey]: leftLiteralValue - } - }, - 'right': { - 'literalValue': { - 'type': rightLiteralValueType, - [rightLiteralValueKey]: rightLiteralValue - } - } - } - }) - - const label = EdgeLabelExtractor.extract(edge) - - expect(label).toEqual(`${leftLiteralValue} NOT IN ${rightLiteralValue}`) - }) - - - }) -}) diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/extractors/EdgeLabelExtractor.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/extractors/EdgeLabelExtractor.ts deleted file mode 100644 index be56c364d..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/extractors/EdgeLabelExtractor.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { Comparator } from '../../../../../../../littlehorse-public-api/common_wfspec' -import type { Edge, EdgeCondition } from '../../../../../../../littlehorse-public-api/wf_spec' - -enum Side { - LEFT = 'left', - RIGHT = 'right' -} - -const signPerOperator = { - [Comparator.LESS_THAN]: '<', - [Comparator.LESS_THAN_EQ]: '<=', - [Comparator.GREATER_THAN]: '>', - [Comparator.GREATER_THAN_EQ]: '>=', - [Comparator.EQUALS]: '=', - [Comparator.NOT_EQUALS]: '!=', - [Comparator.IN]: 'IN', - [Comparator.NOT_IN]: 'NOT IN' -} - -const extract = (edge: Edge): string => { - const edgeCondition = edge.condition - - if (edgeCondition === undefined) { - return '' - } - - const conditionLeftSide = edgeCondition.left - const conditionRightSide = edgeCondition.right - - const hasVariablesOnBothSides = conditionLeftSide?.variableName !== undefined && conditionRightSide?.variableName !== undefined - - if (hasVariablesOnBothSides) { - return buildLabelForConditionalWithVariablesOnBothSides(edgeCondition) - } - - const hasVariableOnlyOnTheLeftSide = conditionLeftSide?.variableName !== undefined && conditionRightSide?.variableName === undefined - if (hasVariableOnlyOnTheLeftSide) { - return buildLabelForConditionalWithVariablesOnTheLeftSide(edgeCondition) - } - - const literalValueOnBothSides = conditionLeftSide?.literalValue !== undefined && conditionRightSide?.literalValue !== undefined - if (literalValueOnBothSides) { - return buildLabelForConditionalWithLiteralValuesOnBothSides(edgeCondition) - } - - return buildLabelForConditionalWithVariableOnlyOnTheRightSide(edgeCondition) -} - -const buildLabelForConditionalWithVariablesOnBothSides = (edgeCondition: EdgeCondition): string => { - const conditionLeftSide = edgeCondition.left - const conditionRightSide = edgeCondition.right - - const jsonPathOnBothSides = conditionLeftSide?.jsonPath !== undefined && conditionRightSide?.jsonPath !== undefined - - if (jsonPathOnBothSides) { - return `${conditionLeftSide?.jsonPath} within ${conditionLeftSide.variableName} ${signPerOperator[edgeCondition.comparator]} ${conditionRightSide?.jsonPath} within ${conditionRightSide.variableName}` - } - - return `${conditionLeftSide?.variableName} ${signPerOperator[edgeCondition.comparator]} ${conditionRightSide?.variableName}` -} - -const buildLabelForConditionalWithVariablesOnTheLeftSide = (edgeCondition: EdgeCondition): string => { - const jsonPathOnTheLeftSide = edgeCondition.left?.jsonPath !== undefined - const conditionLeftSide = edgeCondition.left - - if (jsonPathOnTheLeftSide) { - return `${conditionLeftSide?.jsonPath} within ${conditionLeftSide?.variableName} ${signPerOperator[edgeCondition.comparator]} ${getLiteralValue(edgeCondition, Side.RIGHT)}` - } - - return `${conditionLeftSide?.variableName} ${signPerOperator[edgeCondition.comparator]} ${getLiteralValue(edgeCondition, Side.RIGHT)}` -} - -const buildLabelForConditionalWithLiteralValuesOnBothSides = (edgeCondition: EdgeCondition): string => { - return `${getLiteralValue(edgeCondition, Side.LEFT)} ${signPerOperator[edgeCondition.comparator]} ${getLiteralValue(edgeCondition, Side.RIGHT)}` -} - -const buildLabelForConditionalWithVariableOnlyOnTheRightSide = (edgeCondition: EdgeCondition): string => { - if (edgeCondition.right?.jsonPath !== undefined) { - return `${getLiteralValue(edgeCondition, Side.LEFT)} ${signPerOperator[edgeCondition.comparator]} ${edgeCondition.right?.jsonPath} within ${edgeCondition.right.variableName}` - } - - return `${getLiteralValue(edgeCondition, Side.LEFT)} ${signPerOperator[edgeCondition.comparator]} ${edgeCondition.right?.variableName}` -} - -const getLiteralValue = (edgeCondition: EdgeCondition, side: Side) => { - const isItANumericalComparator = edgeCondition.comparator === Comparator.GREATER_THAN || - edgeCondition.comparator === Comparator.GREATER_THAN_EQ || - edgeCondition.comparator === Comparator.LESS_THAN || - edgeCondition.comparator === Comparator.LESS_THAN_EQ || - edgeCondition.comparator === Comparator.EQUALS || - edgeCondition.comparator === Comparator.NOT_EQUALS - - if (isItANumericalComparator) { - return getLiteralValueForNumericalComparator(edgeCondition, side) - } - - return getLiteralValueForInConditional(edgeCondition, side) -} - -const getLiteralValueForInConditional = (edgeCondition: EdgeCondition, side: Side) => { - if (edgeCondition[side]?.literalValue?.jsonArr !== undefined) { - return edgeCondition[side]?.literalValue?.jsonArr - } - - if (edgeCondition[side]?.literalValue?.str !== undefined) { - return edgeCondition[side]?.literalValue?.str - } - - if (edgeCondition[side]?.literalValue?.jsonObj !== undefined) { - return edgeCondition[side]?.literalValue?.jsonObj - } - - if (edgeCondition[side]?.literalValue?.double !== undefined) { - return edgeCondition[side]?.literalValue?.double - } - - return edgeCondition[side]?.literalValue?.int -} - -const getLiteralValueForNumericalComparator = (edgeCondition: EdgeCondition, side: Side) => { - if (edgeCondition[side]?.literalValue?.bool !== undefined) { - return edgeCondition[side]?.literalValue?.bool - } - - if (edgeCondition[side]?.literalValue?.int !== undefined) { - return edgeCondition[side]?.literalValue?.int - } - - if (edgeCondition[side]?.literalValue?.double !== undefined) { - return edgeCondition[side]?.literalValue?.double - } - - if (edgeCondition[side]?.literalValue?.str === undefined) { - return 'NULL' - } - - return edgeCondition[side]?.literalValue?.str -} - -const EdgeLabelExtractor = { - extract -} - -export default EdgeLabelExtractor diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ElkNodeMapper.test.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ElkNodeMapper.test.ts deleted file mode 100644 index c9ef86708..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ElkNodeMapper.test.ts +++ /dev/null @@ -1,98 +0,0 @@ -import type { ElkLabel, ElkNode } from 'elkjs' -import ElkNodeMapper from './ElkNodeMapper' - -describe('elk Node Mapper from LHNode', () => { - it.each([ - [ '0-entrypoint-ENTRYPOINT', { - id: '0-entrypoint-ENTRYPOINT', - labels: [ '0-entrypoint-ENTRYPOINT' ] as ElkLabel[], - x: 0, - y: 0, - width: 141, - height: 50 - } ], - [ '0-entrypoint-TASK', { - id: '0-entrypoint-TASK', - labels: [ '0-entrypoint-TASK' ] as ElkLabel[], - x: 0, - y: 0, - width: 287, - height: 50 - } ], - [ '0-a-name-EXIT', { - id: '0-a-name-EXIT', - labels: [ '0-a-name-EXIT' ] as ElkLabel[], - x: 0, - y: 0, - width: 237, - height: 50 - } ], - [ '0-a-name-NOP', { - id: '0-a-name-NOP', - labels: [ '0-a-name-NOP' ] as ElkLabel[], - x: 0, - y: 0, - width: 237, - height: 50 - } ], - [ '0-a-name-START_THREAD', { - id: '0-a-name-START_THREAD', - labels: [ '0-a-name-START_THREAD' ] as ElkLabel[], - x: 0, - y: 0, - width: 181, - height: 50 - } ], - [ '0-a-name-WAIT_FOR_THREADS', { - id: '0-a-name-WAIT_FOR_THREADS', - labels: [ '0-a-name-WAIT_FOR_THREADS' ] as ElkLabel[], - x: 0, - y: 0, - width: 121, - height: 50 - } ], - [ '0-a-name-EXTERNAL_EVENT', { - id: '0-a-name-EXTERNAL_EVENT', - labels: [ '0-a-name-EXTERNAL_EVENT' ] as ElkLabel[], - x: 0, - y: 0, - width: 237, - height: 50 - } ], - [ '0-a-name-SLEEP', { - id: '0-a-name-SLEEP', - labels: [ '0-a-name-SLEEP' ] as ElkLabel[], - x: 0, - y: 0, - width: 237, - height: 50 - } ], - [ '0-a-name-START_MULTIPLE_THREADS', { - id: '0-a-name-START_MULTIPLE_THREADS', - labels: [ '0-a-name-START_MULTIPLE_THREADS' ] as ElkLabel[], - x: 0, - y: 0, - width: 237, - height: 50 - } ], - [ '0-a-name-USER_TASK', { - id: '0-a-name-USER_TASK', - labels: [ '0-a-name-USER_TASK' ] as ElkLabel[], - x: 0, - y: 0, - width: 287, - height: 50 - } ], - [ 'an-invalid-task-type-INVALID', { - id: 'an-invalid-task-type-INVALID', - labels: [ 'an-invalid-task-type-INVALID' ] as ElkLabel[], - x: 0, - y: 0, - width: 300, - height: 50 - } ], - ]) ('maps %s elkNodeId as reactFlowNodeType', (lhNodeName: string, expectedNodeType: ElkNode | undefined) => { - - expect( ElkNodeMapper.fromLHNode(lhNodeName)).toEqual(expectedNodeType) - }) -}) diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ElkNodeMapper.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ElkNodeMapper.ts deleted file mode 100644 index 72f914697..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ElkNodeMapper.ts +++ /dev/null @@ -1,93 +0,0 @@ -import type { ElkLabel, ElkNode } from 'elkjs' - - -const fromLHNode = (lhNodeName: string): ElkNode => { - const INITIAL_X_POSITION = 0 - const INITIAL_Y_POSITION = 0 - const DEFAULT_WIDTH = 300 - const DEFAULT_HEIGHT = 50 - - /* - These values have been stablished by seeing what was the rendered width on the screen for each node type - the width for each one is defined in the _visualizer.scss file, then the parent elements adds extra width to it, - you should pick the viznode-canvas computed width to be here. - That will help ELK algorithm to determine the correct position of the nodes on the screen because that depends - on the node width. - If you change the values here, the values on _visualizer.scss should be adjusted as well. - */ - const ENTRYPOINT_NODE_WIDTH_WHEN_DRAWN = 141 - const TASK_NODE_WIDTH_WHEN_DRAWN = 287 - const EXIT_NODE_WIDTH_WHEN_DRAWN = 237 - const NOP_NODE_WIDTH_WHEN_DRAWN = 237 - const START_THREAD_NODE_WIDTH_WHEN_DRAWN = 181 - const WAIT_FOR_THREADS_NODE_WIDTH_WHEN_DRAWN = 121 - const EXTERNAL_EVENT_NODE_WIDTH_WHEN_DRAWN = 237 - const SLEEP_WIDTH_WHEN_DRAWN = 237 - const START_MULTIPLE_THREADS_NODE_WIDTH_WHEN_DRAWN = 237 - const USER_TASK_NODE_WIDTH_WHEN_DRAWN = 287 - - const defaultElkNode = { - id: lhNodeName, - labels: [ lhNodeName ] as ElkLabel[], - x: INITIAL_X_POSITION, - y: INITIAL_Y_POSITION, - width: DEFAULT_WIDTH, - height: DEFAULT_HEIGHT - } - - if (lhNodeName.includes('ENTRYPOINT')) { - return { ...defaultElkNode, width: ENTRYPOINT_NODE_WIDTH_WHEN_DRAWN } - } - - if (lhNodeName.includes('-TASK')) { - return { ...defaultElkNode, width: TASK_NODE_WIDTH_WHEN_DRAWN } - } - - if (lhNodeName.includes('EXIT')) { - return { ...defaultElkNode, width: EXIT_NODE_WIDTH_WHEN_DRAWN } - } - - - if (lhNodeName.includes('NOP')) { - return { ...defaultElkNode, width: NOP_NODE_WIDTH_WHEN_DRAWN } - } - - if (lhNodeName.includes('START_THREAD')) { - return { ...defaultElkNode, width: START_THREAD_NODE_WIDTH_WHEN_DRAWN } - } - - if (lhNodeName.includes('WAIT_FOR_THREADS')) { - return { ...defaultElkNode, width: WAIT_FOR_THREADS_NODE_WIDTH_WHEN_DRAWN } - } - - if (lhNodeName.includes('EXTERNAL_EVENT')) { - return { ...defaultElkNode, width: EXTERNAL_EVENT_NODE_WIDTH_WHEN_DRAWN } - } - - if (lhNodeName.includes('SLEEP')) { - return { ...defaultElkNode, width: SLEEP_WIDTH_WHEN_DRAWN } - } - - if (lhNodeName.includes('START_MULTIPLE_THREADS')) { - return { ...defaultElkNode, width: START_MULTIPLE_THREADS_NODE_WIDTH_WHEN_DRAWN } - } - - if (lhNodeName.includes('USER_TASK')) { - return { ...defaultElkNode, width: USER_TASK_NODE_WIDTH_WHEN_DRAWN } - } - - return { - id: lhNodeName, - labels: [ lhNodeName ] as ElkLabel[], - x: INITIAL_X_POSITION, - y: INITIAL_Y_POSITION, - width: DEFAULT_WIDTH, - height: DEFAULT_HEIGHT - } -} - -const ELKNodeMapper = { - fromLHNode -} - -export default ELKNodeMapper diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter.test.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter.test.ts deleted file mode 100644 index 1c76948db..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter.test.ts +++ /dev/null @@ -1,3137 +0,0 @@ -import type { Edge, Node } from 'reactflow' -import { MarkerType } from 'reactflow' -import ElkConstructor from 'elkjs/lib/elk.bundled.js' -import type { ExitNode, UserTaskNode, WfSpec } from '../../../../../../../littlehorse-public-api/wf_spec' -import { FailureHandlerDef_LHFailureType, Node as LHNode, WfRunVariableAccessLevel } from '../../../../../../../littlehorse-public-api/wf_spec' -import { - LHStatus, - MetadataStatus, - VariableType, -} from '../../../../../../../littlehorse-public-api/common_enums' -import type { - TaskNode, - VariableMutation } from '../../../../../../../littlehorse-public-api/common_wfspec' -import { - Comparator, - VariableMutationType -} from '../../../../../../../littlehorse-public-api/common_wfspec' -import EdgeLabelExtractor from '../extractors/EdgeLabelExtractor' -import type { WfRun } from '../../../../../../../littlehorse-public-api/wf_run' -import { ThreadType } from '../../../../../../../littlehorse-public-api/wf_run' -import { NodeRun } from '../../../../../../../littlehorse-public-api/node_run' -import LHClient from '../../../../../../../pages/api/LHClient' -import type { ReactFlowGraph, ReactFlowNodeWithLHInfo } from './GraphLayouter' -import GraphLayouter from './GraphLayouter' - -jest.mock('../../../../../../../pages/api/LHClient') - -const elk = new ElkConstructor() -const labelExtractor = EdgeLabelExtractor.extract -const wfSpecName = '123' - -describe('Layouting graph from LH Nodes', () => { - describe('mapping WfSpec nodes from proto to react flow structure', () => { - it('should return a graph for the entrypoint thread spec if the provided one was not found', async () => { - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'entrypoint': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName, 'invalid-thread-spec') - - expect(wfSpecInReactFlowFormat.nodes[0].lhNode).toEqual(LHNode.fromJSON( - { - 'outgoingEdges': [], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - } - ) - ) - }) - - it('should return a graph for the entrypoint thread spec when thread spec was not provided at all', async () => { - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'entrypoint': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName) - - expect(wfSpecInReactFlowFormat.nodes[0].lhNode).toEqual(LHNode.fromJSON( - { - 'outgoingEdges': [], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - } - ) - ) - }) - - it('should return the graph for the provided threadSpec', async () => { - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'entrypoint': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - }, - 'another-thread-spec': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-exit-EXIT': { - 'outgoingEdges': [], - - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const expectedNodesForAnotherThreadSpec: ReactFlowNodeWithLHInfo[] = [ - { - id: '0-entrypoint-ENTRYPOINT', - data: { label: '0-entrypoint-ENTRYPOINT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'entrypointNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [ - { - 'sinkNodeName': '1-exit-EXIT' - } - ], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - }) - }, - { - id: '1-exit-EXIT', - data: { label: '1-exit-EXIT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'exitNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [], - 'variableMutations': [], - 'failureHandlers': [], - 'exit': {} - }) - } - ] - - const expectedEdges: Edge[] = [ - { - 'animated': true, - 'id': '0-entrypoint-ENTRYPOINT-1-exit-EXIT', - 'label': '', - 'markerEnd': { - 'type': MarkerType.ArrowClosed, - }, - 'source': '0-entrypoint-ENTRYPOINT', - 'target': '1-exit-EXIT', - 'type': 'CUSTOM_SMART_EDGE_TYPE', - } - ] - - const desiredThreadSpec = 'another-thread-spec' - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName, desiredThreadSpec) - - expect(wfSpecInReactFlowFormat.nodes).toEqual(expectedNodesForAnotherThreadSpec) - expect(wfSpecInReactFlowFormat.edges).toEqual(expectedEdges) - - - }) - - it('each node should have its LHNode information', async () => { - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'entrypoint': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName) - - expect(wfSpecInReactFlowFormat.nodes[0].lhNode).toEqual(LHNode.fromJSON( - { - 'outgoingEdges': [], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - } - ) - ) - }) - - it('should map an entry point with no edges when a single threadSpec was provided', async () => { - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'entrypoint': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const expectedNodes: ReactFlowNodeWithLHInfo[] = [ - { - id: '0-entrypoint-ENTRYPOINT', - data: { label: '0-entrypoint-ENTRYPOINT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'entrypointNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - }) - } - ] - - const expectedEdges: Edge[] = [] - - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName) - const nodes: ReactFlowNodeWithLHInfo[] = wfSpecInReactFlowFormat.nodes - const edges: Edge[] = wfSpecInReactFlowFormat.edges - - expect(wfSpecInReactFlowFormat.nodes.length).toEqual(1) - expect(nodes).toEqual(expectedNodes) - expect(wfSpecInReactFlowFormat.edges.length).toEqual(0) - expect(edges).toEqual(expectedEdges) - }) - - it('should map an entry point with an edge', async () => { - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-exit-EXIT', - 'variableMutations': [], - - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const expectedNodes: ReactFlowNodeWithLHInfo[] = [ - { - id: '0-entrypoint-ENTRYPOINT', - data: { label: '0-entrypoint-ENTRYPOINT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'entrypointNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [ - { - 'sinkNodeName': '1-exit-EXIT' - } - ], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - }) - }, - { - id: '1-exit-EXIT', - data: { label: '1-exit-EXIT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'exitNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [], - 'variableMutations': [], - 'failureHandlers': [], - 'exit': {} - }) - } - ] - - const expectedEdges: Edge[] = [ - { - id: '0-entrypoint-ENTRYPOINT-1-exit-EXIT', - source: '0-entrypoint-ENTRYPOINT', - target: '1-exit-EXIT', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: '' - } - ] - - const mapper = new GraphLayouter(elk, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName) - const nodes: Node[] = wfSpecInReactFlowFormat.nodes - const edges: Edge[] = wfSpecInReactFlowFormat.edges - - expect(wfSpecInReactFlowFormat.nodes.length).toEqual(2) - expect(nodes).toEqual(expectedNodes) - expect(wfSpecInReactFlowFormat.edges.length).toEqual(1) - expect(edges).toEqual(expectedEdges) - }) - - it('should map nodes that have edges each one', async () => { - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-evaluate-risk-of-decision-TASK', - 'variableMutations': [] - } - ], - - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-evaluate-risk-of-decision-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-exit-EXIT', - 'variableMutations': [] - } - ], - - 'failureHandlers': [], - 'entrypoint': {} - }, - '2-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const expectedNodes: ReactFlowNodeWithLHInfo[] = [ - { - id: '0-entrypoint-ENTRYPOINT', - data: { label: '0-entrypoint-ENTRYPOINT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'entrypointNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [ - { - 'sinkNodeName': '1-evaluate-risk-of-decision-TASK' - } - ], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - }) - }, - { - id: '1-evaluate-risk-of-decision-TASK', - data: { label: '1-evaluate-risk-of-decision-TASK', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [ - { - 'sinkNodeName': '2-exit-EXIT' - } - ], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - }) - }, - { - id: '2-exit-EXIT', - data: { label: '2-exit-EXIT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'exitNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [], - 'variableMutations': [], - 'failureHandlers': [], - 'exit': {} - }) - }, - ] - - const expectedEdges: Edge[] = [ - { - id: '0-entrypoint-ENTRYPOINT-1-evaluate-risk-of-decision-TASK', - source: '0-entrypoint-ENTRYPOINT', - target: '1-evaluate-risk-of-decision-TASK', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: '' - }, - { - id: '1-evaluate-risk-of-decision-TASK-2-exit-EXIT', - source: '1-evaluate-risk-of-decision-TASK', - target: '2-exit-EXIT', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: '' - } - ] - - const mapper = new GraphLayouter(elk, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName) - const nodes: Node[] = wfSpecInReactFlowFormat.nodes - const edges: Edge[] = wfSpecInReactFlowFormat.edges - - expect(wfSpecInReactFlowFormat.nodes.length).toEqual(3) - expect(nodes).toEqual(expectedNodes) - expect(wfSpecInReactFlowFormat.edges.length).toEqual(2) - expect(edges).toEqual(expectedEdges) - }) - - it('should map nodes that have more than one edge', async () => { - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - frozenVariables: [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-evaluate-risk-of-decision-TASK', - 'variableMutations': [], - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-evaluate-risk-of-decision-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-nop-NOP', - 'variableMutations': [ - { - 'lhsName': 'was-it-a-risky-decision', - 'operation': VariableMutationType.ASSIGN, - 'nodeOutput': {} - } - ], - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'evaluate-risk-of-decision', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - } - ] - } - }, - '2-nop-NOP': { - 'outgoingEdges': [ - { - 'sinkNodeName': '3-save-risk-evaluation-results-TASK', - 'condition': { - 'comparator': Comparator.EQUALS, - 'left': { - 'variableName': 'was-it-a-risky-decision' - }, - 'right': { - 'literalValue': { - 'bool': false - } - } - }, - 'variableMutations': [], - }, - { - 'sinkNodeName': '5-fraud-detection-fraud-form-2-USER_TASK', - 'condition': { - 'comparator': Comparator.NOT_EQUALS, - 'left': { - 'variableName': 'was-it-a-risky-decision' - }, - 'right': { - 'literalValue': { - 'bool': false - } - } - }, - 'variableMutations': [], - } - ], - - 'failureHandlers': [], - 'nop': {} - }, - '3-save-risk-evaluation-results-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '4-nop-NOP', - 'variableMutations': [], - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'save-risk-evaluation-results', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - }, - { - 'variableName': 'was-it-a-risky-decision' - } - ] - } - }, - '4-nop-NOP': { - 'outgoingEdges': [ - { - 'sinkNodeName': '7-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - }, - '5-fraud-detection-fraud-form-2-USER_TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '6-save-risk-evaluation-results-TASK', - 'variableMutations': [ - { - 'lhsName': 'is-risk-approved', - 'operation': VariableMutationType.ASSIGN, - 'nodeOutput': { - 'jsonpath': '$.isApproved' - } - } - ] - } - ], - 'failureHandlers': [], - 'userTask': { - 'userTaskDefName': 'fraud-detection-fraud-form-2', - 'userGroup': { - 'literalValue': { - 'str': 'fraud-detection' - } - }, - 'actions': [], - 'userTaskDefVersion': 2 - } - }, - '6-save-risk-evaluation-results-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '4-nop-NOP', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'save-risk-evaluation-results', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - }, - { - 'variableName': 'is-risk-approved' - } - ] - } - }, - '7-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [ - { - searchable: true, - required: true, - 'varDef': { - 'type': VariableType.STR, - 'name': 'request-id', - 'defaultValue': undefined, - }, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - 'jsonIndexes': [], - }, - { - searchable: true, - required: true, - 'varDef': { - 'type': VariableType.BOOL, - 'name': 'was-it-a-risky-decision', - 'defaultValue': undefined, - }, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - 'jsonIndexes': [], - }, - { - searchable: true, - required: true, - 'varDef': { - 'type': VariableType.BOOL, - 'name': 'is-risk-approved', - 'defaultValue': undefined, - }, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - 'jsonIndexes': [], - } - ], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - - const expectedNodes: ReactFlowNodeWithLHInfo[] = [ - { - id: '0-entrypoint-ENTRYPOINT', - data: { label: '0-entrypoint-ENTRYPOINT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'entrypointNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-evaluate-risk-of-decision-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - } as LHNode - }, - { - id: '1-evaluate-risk-of-decision-TASK', - data: { label: '1-evaluate-risk-of-decision-TASK', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-nop-NOP', - 'variableMutations': [ - { - 'lhsName': 'was-it-a-risky-decision', - 'operation': VariableMutationType.ASSIGN, - nodeOutput: {} - } - ] as VariableMutation[] - } - ], - 'failureHandlers': [], - 'task': { - taskDefId: { - name: 'evaluate-risk-of-decision' - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - } - ] - } as TaskNode, - } as LHNode - }, - { - id: '2-nop-NOP', - data: { label: '2-nop-NOP', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'nopNodeType', - lhNode:{ - 'outgoingEdges': [ - { - 'sinkNodeName': '3-save-risk-evaluation-results-TASK', - 'condition': { - 'comparator': Comparator.EQUALS, - 'left': { - 'variableName': 'was-it-a-risky-decision' - }, - 'right': { - literalValue: { - 'bool': false - } - } - }, - 'variableMutations': [] - }, - { - 'sinkNodeName': '5-fraud-detection-fraud-form-2-USER_TASK', - 'condition': { - 'comparator': Comparator.NOT_EQUALS, - 'left': { - 'variableName': 'was-it-a-risky-decision' - }, - 'right': { - literalValue: { - 'bool': false - } - } - }, - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - } as LHNode - }, - { - id: '3-save-risk-evaluation-results-TASK', - data: { label: '3-save-risk-evaluation-results-TASK', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '4-nop-NOP', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'task': { - taskDefId: { - name: 'save-risk-evaluation-results' - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - }, - { - 'variableName': 'was-it-a-risky-decision' - } - ] - } as TaskNode - } as LHNode - }, - { - id: '4-nop-NOP', - data: { label: '4-nop-NOP', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'nopNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '7-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - } as LHNode - }, - { - id: '5-fraud-detection-fraud-form-2-USER_TASK', - data: { label: '5-fraud-detection-fraud-form-2-USER_TASK', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'userTaskNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '6-save-risk-evaluation-results-TASK', - 'variableMutations': [ - { - 'lhsName': 'is-risk-approved', - 'operation': VariableMutationType.ASSIGN, - 'nodeOutput': { - 'jsonpath': '$.isApproved' - } - } - ] - } - ], - 'failureHandlers': [], - 'userTask': { - 'userTaskDefName': 'fraud-detection-fraud-form-2', - 'userGroup': { - 'literalValue': { - 'str': 'fraud-detection' - } - }, - 'actions': [], - 'userTaskDefVersion': 2 - } as UserTaskNode - } as LHNode - }, - { - id: '6-save-risk-evaluation-results-TASK', - data: { label: '6-save-risk-evaluation-results-TASK', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '4-nop-NOP', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'save-risk-evaluation-results', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - }, - { - 'variableName': 'is-risk-approved' - } - ] - } - } as LHNode - }, - { - id: '7-exit-EXIT', - data: { label: '7-exit-EXIT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'exitNodeType', - lhNode: { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} as ExitNode - } as LHNode - } - ] - - const expectedEdges: Edge[] = [ - { - id: '0-entrypoint-ENTRYPOINT-1-evaluate-risk-of-decision-TASK', - source: '0-entrypoint-ENTRYPOINT', - target: '1-evaluate-risk-of-decision-TASK', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: '' - }, - { - id: '1-evaluate-risk-of-decision-TASK-2-nop-NOP', - source: '1-evaluate-risk-of-decision-TASK', - target: '2-nop-NOP', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: '' - }, - { - id: '2-nop-NOP-3-save-risk-evaluation-results-TASK', - source: '2-nop-NOP', - target: '3-save-risk-evaluation-results-TASK', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: 'was-it-a-risky-decision = false' - }, - { - id: '2-nop-NOP-5-fraud-detection-fraud-form-2-USER_TASK', - source: '2-nop-NOP', - target: '5-fraud-detection-fraud-form-2-USER_TASK', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: 'was-it-a-risky-decision != false' - }, - { - id: '3-save-risk-evaluation-results-TASK-4-nop-NOP', - source: '3-save-risk-evaluation-results-TASK', - target: '4-nop-NOP', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: '' - }, - { - id: '4-nop-NOP-7-exit-EXIT', - source: '4-nop-NOP', - target: '7-exit-EXIT', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: '' - }, - { - id: '5-fraud-detection-fraud-form-2-USER_TASK-6-save-risk-evaluation-results-TASK', - source: '5-fraud-detection-fraud-form-2-USER_TASK', - target: '6-save-risk-evaluation-results-TASK', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: '' - }, - { - id: '6-save-risk-evaluation-results-TASK-4-nop-NOP', - source: '6-save-risk-evaluation-results-TASK', - target: '4-nop-NOP', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - type: 'CUSTOM_SMART_EDGE_TYPE', - label: '' - } - ] - - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName) - const nodes: Node[] = wfSpecInReactFlowFormat.nodes - const edges: Edge[] = wfSpecInReactFlowFormat.edges - - expect(wfSpecInReactFlowFormat.nodes.length).toEqual(8) - expect(nodes).toEqual(expectedNodes) - expect(wfSpecInReactFlowFormat.edges.length).toEqual(8) - expect(edges).toEqual(expectedEdges) - }) - - it('should layout the graph in vertical position having nodes that dont overlap with each other', async () => { - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-evaluate-risk-of-decision-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-evaluate-risk-of-decision-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-nop-NOP', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '2-nop-NOP': { - 'outgoingEdges': [ - { - 'sinkNodeName': '3-save-risky-decision-TASK', - 'variableMutations': [] - }, - { - 'sinkNodeName': '4-save-not-risky-decision-TASK', - 'variableMutations': [] - } - ], - - 'failureHandlers': [], - 'nop': {} - }, - '3-save-risky-decision-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '5-nop-NOP', - 'variableMutations': [] - } - ], - 'failureHandlers': [] - }, - '4-save-not-risky-decision-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '5-nop-NOP', - 'variableMutations': [] - } - ], - 'failureHandlers': [] - }, - '5-nop-NOP': { - 'outgoingEdges': [ - { - 'sinkNodeName': '6-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - }, - '6-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const expectedReactFlowNodes: ReactFlowNodeWithLHInfo[] = [ - { - id: '0-entrypoint-ENTRYPOINT', - data: { label: '0-entrypoint-ENTRYPOINT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'entrypointNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-evaluate-risk-of-decision-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - } - }, - { - id: '1-evaluate-risk-of-decision-TASK', - data: { label: '1-evaluate-risk-of-decision-TASK', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [ - { - 'sinkNodeName': '2-nop-NOP' - } - ], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - }) - }, - { - id: '2-nop-NOP', - data: { label: '2-nop-NOP', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'nopNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '3-save-risky-decision-TASK', - 'variableMutations': [] - }, - { - 'sinkNodeName': '4-save-not-risky-decision-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - } - }, - { - id: '3-save-risky-decision-TASK', - data: { label: '3-save-risky-decision-TASK', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [ - { - 'sinkNodeName': '5-nop-NOP' - } - ], - 'variableMutations': [], - 'failureHandlers': [] - }) - }, - { - id: '4-save-not-risky-decision-TASK', - data: { label: '4-save-not-risky-decision-TASK', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [ - { - 'sinkNodeName': '5-nop-NOP' - } - ], - 'variableMutations': [], - 'failureHandlers': [] - }) - }, - { - id: '5-nop-NOP', - data: { label: '5-nop-NOP', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'nopNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [ - { - 'sinkNodeName': '6-exit-EXIT' - } - ], - 'variableMutations': [], - 'failureHandlers': [], - 'nop': {} - }) - }, - { - id: '6-exit-EXIT', - data: { label: '6-exit-EXIT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'exitNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [], - 'variableMutations': [], - 'failureHandlers': [], - 'exit': {} - }) - }, - ] - - const layoutOptions = { - 'elk.algorithm': 'layered', - 'elk.spacing.nodeNode': '400', - 'spacing.edgeNode': '300', - 'elk.direction': 'DOWN', - 'spacing.nodeNodeBetweenLayers': '160', - 'elk.layered.nodePlacement.strategy': 'SIMPLE' - } - - const elkInstance = new ElkConstructor() - const elkSpyOnLayout = jest.spyOn(elkInstance, 'layout') - - const mapper = new GraphLayouter(elkInstance, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName) - - const argsSendToLayoutLib = elkSpyOnLayout.mock.calls[0][0] - - expect(argsSendToLayoutLib.id).toEqual(wfSpecName) - expect(argsSendToLayoutLib.layoutOptions).toEqual(layoutOptions) - - const nodes: Node[] = wfSpecInReactFlowFormat.nodes - - expect(nodes).toEqual(expectedReactFlowNodes) - }) - it('should set failure handlers property on node if present', async () => { - const wfSpec: WfSpec = { - id: { - 'name': 'example-exception-handler', - 'majorVersion': 0, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-17T17:02:53.770Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-fail-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-fail-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-my-task-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [ - { - 'handlerSpecName': 'exn-handler-1-fail-TASK-FAILURE_TYPE_ERROR', - /* - eslint-disable-next-line camelcase - */ - 'anyFailureOfType': FailureHandlerDef_LHFailureType.FAILURE_TYPE_ERROR - } - ], - 'task': { - 'taskDefId': { - 'name': 'fail', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [] - } - }, - '2-my-task-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '3-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'my-task', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [] - } - }, - '3-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - }, - 'exn-handler-1-fail-TASK-FAILURE_TYPE_ERROR': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-my-task-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-my-task-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'my-task', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [] - } - }, - '2-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName) - - const nodes: Node[] = wfSpecInReactFlowFormat.nodes - - const nodeWithFailureHandler = nodes.find(node => node.data.label === '1-fail-TASK') - - expect(nodeWithFailureHandler?.data.failureHandlers).toEqual([ { - 'handlerSpecName': 'exn-handler-1-fail-TASK-FAILURE_TYPE_ERROR', - /* - eslint-disable-next-line camelcase - */ - 'anyFailureOfType': FailureHandlerDef_LHFailureType.FAILURE_TYPE_ERROR - } ]) - }) - - it('should map a while loop flow edges correctly positioned including their labels', async () => { - const wfSpec: WfSpec = { - id: { - 'name': 'example-conditionals-while', - 'majorVersion': 0, - 'revision': 0, - }, - 'frozenVariables': [], - 'createdAt': '2023-10-16T16:37:18.380Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-nop-NOP', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-nop-NOP': { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-eating-donut-TASK', - 'condition': { - 'comparator': Comparator.GREATER_THAN, - 'left': { - 'variableName': 'number-of-donuts' - }, - 'right': { - 'literalValue': { - 'int': 0 - } - } - }, - 'variableMutations': [] - }, - { - 'sinkNodeName': '3-nop-NOP', - 'condition': { - 'comparator': Comparator.LESS_THAN_EQ, - 'left': { - 'variableName': 'number-of-donuts' - }, - 'right': { - 'literalValue': { - 'int': 0 - } - } - }, - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - }, - '2-eating-donut-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '3-nop-NOP', - 'variableMutations': [ - { - 'lhsName': 'number-of-donuts', - 'operation': VariableMutationType.SUBTRACT, - 'literalValue': { - 'int': 1 - } - } - ] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'eating-donut', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'number-of-donuts' - } - ] - } - }, - '3-nop-NOP': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-nop-NOP', - 'condition': { - 'comparator': Comparator.GREATER_THAN, - 'left': { - 'variableName': 'number-of-donuts' - }, - 'right': { - 'literalValue': { - 'int': 0 - } - } - }, - 'variableMutations': [] - }, - { - 'sinkNodeName': '4-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - }, - '4-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [ - { - 'varDef': { - 'type': VariableType.INT, - 'name': 'number-of-donuts', - 'defaultValue': undefined, - }, - 'jsonIndexes': [], - required: true, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - searchable: true - } - ], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraph(wfSpec, wfSpecName) - - const expectedEdges = [ - { - id: '0-entrypoint-ENTRYPOINT-1-nop-NOP', - source: '0-entrypoint-ENTRYPOINT', - type: 'CUSTOM_SMART_EDGE_TYPE', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - target: '1-nop-NOP', - label: '' - }, - { - id: '1-nop-NOP-2-eating-donut-TASK', - source: '1-nop-NOP', - type: 'CUSTOM_SMART_EDGE_TYPE', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - target: '2-eating-donut-TASK', - label: 'number-of-donuts > 0' - }, - { - id: '1-nop-NOP-3-nop-NOP', - source: '1-nop-NOP', - type: 'CUSTOM_SMART_EDGE_TYPE', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - target: '3-nop-NOP', - sourceHandle: 'sourceLeft', - targetHandle: 'targetLeft', - label: 'number-of-donuts <= 0' - }, - { - id: '2-eating-donut-TASK-3-nop-NOP', - source: '2-eating-donut-TASK', - type: 'CUSTOM_SMART_EDGE_TYPE', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - target: '3-nop-NOP', - label: '' - }, - { - id: '3-nop-NOP-1-nop-NOP', - source: '3-nop-NOP', - type: 'CUSTOM_SMART_EDGE_TYPE', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - target: '1-nop-NOP', - sourceHandle: 'sourceRight', - targetHandle: 'targetRight', - label: 'number-of-donuts > 0' - }, - { - id: '3-nop-NOP-4-exit-EXIT', - source: '3-nop-NOP', - type: 'CUSTOM_SMART_EDGE_TYPE', - animated: true, - markerEnd: { type: MarkerType.ArrowClosed }, - target: '4-exit-EXIT', - label: '' - } - ] - - expect(wfSpecInReactFlowFormat.edges).toEqual(expectedEdges) - }) - }) - - describe('layout WfRuns highlighting the executed nodes from the wfRun', () => { - beforeEach(() => { - jest.clearAllMocks() - }) - - it('when wfRun is in ERROR status and we are not able to get the latest nodeRun, that nodeRun is marked as it has not run', async () => { - const WF_RUN_ID = '61e8c3cdba664d929c3c99d2d1a4e91a' - - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ { - 'sinkNodeName': '8-exit-EXIT', - 'variableMutations': [] - } ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '8-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const wfRun: WfRun = { - 'id': { - 'id': WF_RUN_ID - }, - 'wfSpecId': { - 'name': 'example-interrupt-handler', - 'majorVersion': 0 , - 'revision': 0 - }, - 'greatestThreadrunNumber': 0, - 'oldWfSpecVersions': [], - 'status': LHStatus.ERROR, - 'startTime': '2023-10-26T19:26:59.700Z', - 'endTime': '2023-10-26T19:26:59.701Z', - 'threadRuns': [ - { - 'number': 0, - 'wfSpecId': { - 'name': 'example-interrupt-handler', - 'majorVersion': 0 , - 'revision': 0 - }, - 'status': LHStatus.ERROR, - 'threadSpecName': 'entrypoint', - 'startTime': '2023-10-26T19:26:59.701Z', - 'endTime': '2023-10-26T19:26:59.701Z', - 'errorMessage': 'Failed calculating maturation for timer: Cant convert NULL to INT', - 'childThreadIds': [], - 'haltReasons': [], - 'currentNodePosition': 1, - 'handledFailedChildren': [], - 'type': ThreadType.ENTRYPOINT - } - ], - 'pendingInterrupts': [], - 'pendingFailures': [] - } - - const spy = jest.spyOn(LHClient, 'getInstance') - spy.mockImplementationOnce(() => ({ - getWfRun: (_: any): Promise => { - return Promise.resolve(wfRun) - }, - getNodeRun: (getNodeRunRequest: any): Promise => { - if (getNodeRunRequest.position === 0) { - return Promise.resolve(NodeRun.fromJSON({ - 'wfRunId': '56021fd8a2054563b25b595e6162b00c', - 'threadRunNumber': 1, - 'position': 0, - 'status': 'COMPLETED', - 'arrivalTime': '2023-10-24T16:56:36.191Z', - 'endTime': '2023-10-24T16:56:36.191Z', - 'wfSpecId': { - 'name': 'example-child-thread', - 'version': 0 - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '0-entrypoint-ENTRYPOINT', - 'failures': [], - 'entrypoint': {}, - 'failureHandlerIds': [] - })) - } - - if (getNodeRunRequest.position === 1) { - throw new Error('not found') - } - - return Promise.reject(new Error('Node position not present in wf Run')) - } - } as any)) - - - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor, LHClient.getInstance('ANY_TOKEN')) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraphForWfRun(wfSpec, wfSpecName, WF_RUN_ID, 0, 'invalid-thread-spec') - - expect(wfSpecInReactFlowFormat.nodes[0].data.nodeHasRun).toEqual(true) - expect(wfSpecInReactFlowFormat.nodes[1].data.nodeHasRun).toEqual(false) - }) - - it('should return a graph for the entrypoint thread spec if the provided one was not found', async () => { - const WF_RUN_ID = '61e8c3cdba664d929c3c99d2c1a4e91a' - - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'entrypoint': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const wfRun: WfRun = { - 'id': { - 'id': WF_RUN_ID - }, - 'wfSpecId': { - 'name': 'example-interrupt-handler', - 'majorVersion': 0 , - 'revision': 0 - }, - 'oldWfSpecVersions': [], - 'greatestThreadrunNumber': 0, - 'status': LHStatus.COMPLETED, - 'startTime': '2023-10-24T16:56:36.161Z', - 'endTime': '2023-10-24T16:56:36.211Z', - 'threadRuns': [ - { - 'wfSpecId': { - 'name': 'example-child-thread', - 'majorVersion': 0 , - 'revision': 0 - }, - 'number': 0, - 'status': LHStatus.COMPLETED, - 'threadSpecName': 'entrypoint', - 'startTime': '2023-10-24T16:56:36.163Z', - 'endTime': '2023-10-24T16:56:36.211Z', - 'childThreadIds': [], - 'haltReasons': [], - 'currentNodePosition': 0, - 'handledFailedChildren': [], - 'type': ThreadType.ENTRYPOINT - } - ], - 'pendingInterrupts': [], - 'pendingFailures': [] - } - - - const spy = jest.spyOn(LHClient, 'getInstance') - spy.mockImplementationOnce(() => ( - { - getWfRun: (_: any): Promise => { - return Promise.resolve(wfRun) - }, - getNodeRun: (getNodeRunRequest: { - wfRunId: string, - threadNumber: number, - position: number - }): Promise => { - if (getNodeRunRequest.position === 0) { - return Promise.resolve({ - id: { - wfRunId: { - id: '56021fd8a2054563b25b595e6162b00c' - }, - threadRunNumber: 1, - position: 0 - }, - 'status': 'COMPLETED', - 'arrivalTime': '2023-10-24T16:56:36.191Z', - 'endTime': '2023-10-24T16:56:36.191Z', - 'wfSpecId': { - name: 'example-child-thread', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '0-entrypoint-ENTRYPOINT', - 'failures': [], - 'entrypoint': {}, - 'failureHandlerIds': [] - } as NodeRun) - } - - return Promise.reject(new Error('Node position not present in wf Run')) - } - } as any)) - - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor, LHClient.getInstance('ANY_TOKEN')) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraphForWfRun(wfSpec, wfSpecName, WF_RUN_ID, 0, 'invalid-thread-spec') - - expect(wfSpecInReactFlowFormat.nodes[0]).toEqual({ - id: '0-entrypoint-ENTRYPOINT', - data: { label: '0-entrypoint-ENTRYPOINT', failureHandlers: [], nodeHasRun: true }, - position: { x: expect.any(Number), y: expect.any(Number) }, - positionInThreadRun: 0, - type: 'entrypointNodeType', - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - }) - }) - }) - - it('should return a graph for the entrypoint thread spec when thread spec was not provided at all', async () => { - const WF_RUN_ID = '61e8c3cdba664d929c3c99d2c1a4e91a' - - const wfSpec: WfSpec = { - 'id': { - 'name': 'evaluate-transaction', - 'majorVersion': 1, - 'revision': 0 - }, - 'frozenVariables': [], - 'createdAt': '2023-10-12T15:40:16.573Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'entrypoint': {} - } - }, - 'variableDefs': [], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const wfRun: WfRun = { - 'id': { - 'id': WF_RUN_ID - }, - 'wfSpecId': { - 'name': 'example-child-threadr', - 'majorVersion': 0 , - 'revision': 0 - }, - 'oldWfSpecVersions': [], - 'greatestThreadrunNumber': 0, - 'status': LHStatus.COMPLETED, - 'startTime': '2023-10-24T16:56:36.161Z', - 'endTime': '2023-10-24T16:56:36.211Z', - 'threadRuns': [ - { - 'wfSpecId': { - 'name': 'example-child-thread', - 'majorVersion': 0, - 'revision': 0 - }, - 'number': 0, - 'status': LHStatus.COMPLETED, - 'threadSpecName': 'entrypoint', - 'startTime': '2023-10-24T16:56:36.163Z', - 'endTime': '2023-10-24T16:56:36.211Z', - 'childThreadIds': [], - 'haltReasons': [], - 'currentNodePosition': 0, - 'handledFailedChildren': [], - 'type': ThreadType.ENTRYPOINT - } - ], - 'pendingInterrupts': [], - 'pendingFailures': [] - } - - const spy = jest.spyOn(LHClient, 'getInstance') - spy.mockImplementationOnce(() => ( - { - getWfRun: (_: any): Promise => { - return Promise.resolve(wfRun) - }, - getNodeRun: (getNodeRunRequest: { - wfRunId: string, - threadNumber: number, - position: number - }): Promise => { - if (getNodeRunRequest.position === 0) { - return Promise.resolve({ - id: { - wfRunId: { - id: '56021fd8a2054563b25b595e6162b00c' - }, - 'threadRunNumber': 1, - 'position': 0, - }, - 'status': 'COMPLETED', - 'arrivalTime': '2023-10-24T16:56:36.191Z', - 'endTime': '2023-10-24T16:56:36.191Z', - 'wfSpecId': { - name: 'example-child-thread', - majorVersion: 0, - revision: 0 - - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '0-entrypoint-ENTRYPOINT', - 'failures': [], - 'entrypoint': {}, - 'failureHandlerIds': [] - } as NodeRun - ) - } - - return Promise.reject(new Error('Node position not present in wf Run')) - } - } as any)) - - const mapper: GraphLayouter = new GraphLayouter(elk, labelExtractor, LHClient.getInstance('ANY_TOKEN')) - const wfSpecInReactFlowFormat: ReactFlowGraph = await mapper.getLayoutedGraphForWfRun(wfSpec, wfSpecName, WF_RUN_ID, 0) - - expect(wfSpecInReactFlowFormat.nodes[0]).toEqual({ - id: '0-entrypoint-ENTRYPOINT', - data: { label: '0-entrypoint-ENTRYPOINT', failureHandlers: [], nodeHasRun: true }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'entrypointNodeType', - positionInThreadRun: 0, - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - }) - }) - }) - - it('nodes that were already executed for the wfRun should be marked as so on a RUNNING task', async () => { - const wfSpec: WfSpec = { - id: { - 'name': 'evaluate-ai-decision', - majorVersion: 0, - revision: 0 - }, - frozenVariables: [], - 'createdAt': '2023-10-23T19:50:53.488Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-evaluate-risk-of-decision-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-evaluate-risk-of-decision-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-nop-NOP', - 'variableMutations': [ - { - 'lhsName': 'was-it-a-risky-decision', - 'operation': VariableMutationType.ASSIGN, - 'nodeOutput': {} - } - ] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'evaluate-risk-of-decision', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - } - ] - } - }, - '2-nop-NOP': { - 'outgoingEdges': [ - { - 'sinkNodeName': '3-save-risk-evaluation-results-TASK', - 'condition': { - 'comparator': Comparator.EQUALS, - 'left': { - 'variableName': 'was-it-a-risky-decision' - }, - 'right': { - 'literalValue': { - 'bool': false - } - } - }, - 'variableMutations': [] - }, - { - 'sinkNodeName': '5-explain-decision-TASK', - 'condition': { - 'comparator': Comparator.NOT_EQUALS, - 'left': { - 'variableName': 'was-it-a-risky-decision' - }, - 'right': { - 'literalValue': { - 'bool': false - } - } - }, - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - }, - '3-save-risk-evaluation-results-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '4-nop-NOP', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'save-risk-evaluation-results', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - }, - { - 'variableName': 'was-it-a-risky-decision' - } - ] - } - }, - '4-nop-NOP': { - 'outgoingEdges': [ - { - 'sinkNodeName': '8-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - }, - '5-explain-decision-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '6-risk-approval-form-USER_TASK', - 'variableMutations': [ - { - 'lhsName': 'decision-explanation', - 'operation': VariableMutationType.ASSIGN, - 'nodeOutput': {} - } - ] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'explain-decision', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - } - ] - } - }, - '6-risk-approval-form-USER_TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '7-save-risk-evaluation-results-TASK', - 'variableMutations': [ - { - 'lhsName': 'is-risk-approved', - 'operation': VariableMutationType.ASSIGN, - 'nodeOutput': { - 'jsonpath': '$.isApproved' - } - } - ] - } - ], - 'failureHandlers': [], - 'userTask': { - 'userTaskDefName': 'risk-approval-form', - 'userGroup': { - 'literalValue': { - 'str': 'risk-management' - } - }, - 'actions': [], - 'userTaskDefVersion': 1 - } - }, - '7-save-risk-evaluation-results-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '4-nop-NOP', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'save-risk-evaluation-results', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - }, - { - 'variableName': 'is-risk-approved' - } - ] - } - }, - '8-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [ - { - searchable: true, - required: true, - 'varDef': { - 'type': VariableType.STR, - 'name': 'request-id', - 'defaultValue': undefined, - }, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - 'jsonIndexes': [], - }, - { - searchable: true, - required: true, - 'varDef': { - 'type': VariableType.BOOL, - 'name': 'was-it-a-risky-decision', - 'defaultValue': undefined, - }, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - 'jsonIndexes': [], - }, - { - searchable: true, - required: true, - 'varDef': { - 'type': VariableType.STR, - 'name': 'decision-explanation', - 'defaultValue': undefined, - }, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - 'jsonIndexes': [], - }, - { - searchable: true, - required: true, - 'varDef': { - 'type': VariableType.BOOL, - 'name': 'is-risk-approved', - 'defaultValue': undefined, - }, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - 'jsonIndexes': [], - } - ], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const CURRENT_NODE_POSITION = 4 - const WF_RUN_ID = '61e8c3cdba664d929c3c99d2c1a4e91a' - - const wfRun: WfRun = { - 'id': { - 'id': WF_RUN_ID - }, - 'wfSpecId': { - 'name': 'evaluate-ai-decision', - 'majorVersion': 0, - 'revision': 0 - }, - 'greatestThreadrunNumber': 0, - 'oldWfSpecVersions': [], - 'status': LHStatus.COMPLETED, - 'startTime': '2023-10-23T19:55:42.243Z', - 'endTime': '2023-10-23T19:56:38.251Z', - 'threadRuns': [ - { - 'wfSpecId': { - 'name': 'evaluate-ai-decision', - 'majorVersion': 0, - 'revision': 0 - }, - 'number': 0, - 'status': LHStatus.COMPLETED, - 'threadSpecName': 'entrypoint', - 'startTime': '2023-10-23T19:55:42.245Z', - 'endTime': '2023-10-23T19:56:38.251Z', - 'childThreadIds': [], - 'haltReasons': [], - 'currentNodePosition': CURRENT_NODE_POSITION, - 'handledFailedChildren': [], - 'type': ThreadType.ENTRYPOINT - } - ], - 'pendingInterrupts': [], - 'pendingFailures': [] - } - - const expectedNodes: ReactFlowNodeWithLHInfo[] = [ - { - id: '0-entrypoint-ENTRYPOINT', - data: { label: '0-entrypoint-ENTRYPOINT', failureHandlers: [], nodeHasRun: true }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'entrypointNodeType', - positionInThreadRun: 0, - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-evaluate-risk-of-decision-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - } as LHNode - }, - { - id: '1-evaluate-risk-of-decision-TASK', - data: { label: '1-evaluate-risk-of-decision-TASK', failureHandlers: [], nodeHasRun: true }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - positionInThreadRun: 1, - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-nop-NOP', - 'variableMutations': [ - { - 'lhsName': 'was-it-a-risky-decision', - 'operation': VariableMutationType.ASSIGN, - nodeOutput: { - jsonpath: undefined - } - } - ] - } - ], - 'failureHandlers': [], - 'task': { - taskDefId: { - name: 'evaluate-risk-of-decision' - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - } - ] - } - } as LHNode - }, - { - id: '2-nop-NOP', - data: { label: '2-nop-NOP', failureHandlers: [], nodeHasRun: true }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'nopNodeType', - positionInThreadRun: 2, - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '3-save-risk-evaluation-results-TASK', - 'condition': { - 'comparator': Comparator.EQUALS, - 'left': { - 'variableName': 'was-it-a-risky-decision' - }, - 'right': { - 'literalValue': { - 'bool': false - } - } - }, - 'variableMutations': [] - }, - { - 'sinkNodeName': '5-explain-decision-TASK', - 'condition': { - 'comparator': Comparator.NOT_EQUALS, - 'left': { - 'variableName': 'was-it-a-risky-decision' - }, - 'right': { - 'literalValue': { - 'bool': false - } - } - }, - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - } as LHNode - }, - { - id: '3-save-risk-evaluation-results-TASK', - data: { label: '3-save-risk-evaluation-results-TASK', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '4-nop-NOP', - 'variableMutations': [], - } - ], - 'failureHandlers': [], - 'task': { - taskDefId: { - name: 'save-risk-evaluation-results' - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - }, - { - 'variableName': 'was-it-a-risky-decision' - } - ] - } - } as LHNode - }, - { - id: '4-nop-NOP', - data: { label: '4-nop-NOP', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'nopNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '8-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'nop': {} - } - }, - { - id: '5-explain-decision-TASK', - data: { label: '5-explain-decision-TASK', failureHandlers: [], nodeHasRun: true }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - positionInThreadRun: 3, - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '6-risk-approval-form-USER_TASK', - 'variableMutations': [ - { - 'lhsName': 'decision-explanation', - 'operation': VariableMutationType.ASSIGN, - 'nodeOutput': {} - } - ] - } - ], - 'failureHandlers': [], - 'task': { - taskDefId: { - name:'explain-decision' - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - } - ] - } - } as LHNode - }, - { - id: '6-risk-approval-form-USER_TASK', - data: { label: '6-risk-approval-form-USER_TASK', failureHandlers: [], nodeHasRun: true }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'userTaskNodeType', - positionInThreadRun: 4, - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '7-save-risk-evaluation-results-TASK', - 'variableMutations': [ - { - 'lhsName': 'is-risk-approved', - 'operation': VariableMutationType.ASSIGN, - 'nodeOutput': { - 'jsonpath': '$.isApproved' - } - } - ] - } - ], - 'failureHandlers': [], - 'userTask': { - 'userTaskDefName': 'risk-approval-form', - 'userGroup': { - 'literalValue': { - 'str': 'risk-management' - } - }, - 'actions': [], - 'userTaskDefVersion': 1 - } - } as LHNode - }, - { - id: '7-save-risk-evaluation-results-TASK', - data: { label: '7-save-risk-evaluation-results-TASK', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - lhNode: { - 'outgoingEdges': [ - { - 'sinkNodeName': '4-nop-NOP', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'task': { - taskDefId: { - name: 'save-risk-evaluation-results' - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'request-id' - }, - { - 'variableName': 'is-risk-approved' - } - ] - } - } as LHNode - }, - { - id: '8-exit-EXIT', - data: { label: '8-exit-EXIT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'exitNodeType', - lhNode: { - 'outgoingEdges': [], - 'failureHandlers': [], - exit: {} - } as LHNode - } - ] - - - const spy = jest.spyOn(LHClient, 'getInstance') - spy.mockImplementationOnce(() => ( - { - getWfRun: (_: any): Promise => { - return Promise.resolve(wfRun) - }, - getNodeRun: (getNodeRunRequest: { - wfRunId: string, - threadNumber: number, - position: number - }): Promise => { - if (getNodeRunRequest.position === 0) { - return Promise.resolve({ - id: { - wfRunId: { - id: WF_RUN_ID - }, - threadRunNumber: 0, - position: 0, - }, - 'status': 'COMPLETED', - 'arrivalTime': '2023-10-23T20:47:00.193Z', - 'endTime': '2023-10-23T20:47:00.193Z', - 'wfSpecId': { - name: 'evaluate-ai-decision', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '0-entrypoint-ENTRYPOINT', - 'failures': [], - 'entrypoint': {}, - 'failureHandlerIds': [] - } as NodeRun - ) - } - - if (getNodeRunRequest.position === 1) { - return Promise.resolve(NodeRun.fromJSON({ - id: { - wfRunId: { - id: WF_RUN_ID - }, - threadRunNumber: 0, - position: 1, - }, - 'status': 'COMPLETED', - 'arrivalTime': '2023-10-23T20:47:00.193Z', - 'endTime': '2023-10-23T20:47:00.198Z', - wfSpecId: { - name: 'evaluate-ai-decision', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '1-evaluate-risk-of-decision-TASK', - 'failures': [], - 'task': { - 'taskRunId': { - 'wfRunId': '61e8c3cdba664d929c3c99d2c1a4e91a', - 'taskGuid': '78205aeaf201429eaccfdacb24c7f61c' - } - }, - 'failureHandlerIds': [] - }) - ) - } - - if (getNodeRunRequest.position === 2) { - return Promise.resolve(NodeRun.fromJSON({ - id: { - wfRunId: { - id: WF_RUN_ID - }, - threadRunNumber: 0, - position: 2, - }, - 'status': 'COMPLETED', - 'arrivalTime': '2023-10-23T20:47:00.199Z', - 'endTime': '2023-10-23T20:47:00.199Z', - wfSpecId: { - name: 'evaluate-ai-decision', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '2-nop-NOP', - 'failures': [], - 'entrypoint': {}, - 'failureHandlerIds': [] - }) - ) - } - - if (getNodeRunRequest.position === 3) { - return Promise.resolve(NodeRun.fromJSON({ - id: { - wfRunId: { - id: WF_RUN_ID - }, - threadRunNumber: 0, - position: 3, - }, - 'status': 'COMPLETED', - 'arrivalTime': '2023-10-23T20:47:00.199Z', - 'endTime': '2023-10-23T20:47:00.203Z', - wfSpecId: { - name: 'evaluate-ai-decision', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '5-explain-decision-TASK', - 'failures': [], - 'task': { - 'taskRunId': { - 'wfRunId': '61e8c3cdba664d929c3c99d2c1a4e91a', - 'taskGuid': '1289cbce3eef4918b6b8e22da5f018e9' - } - }, - 'failureHandlerIds': [] - }) - ) - } - - if (getNodeRunRequest.position === 4) { - return Promise.resolve(NodeRun.fromJSON({ - id: { - wfRunId: { - id: WF_RUN_ID - }, - threadRunNumber: 0, - position: 4, - }, - 'status': 'RUNNING', - 'arrivalTime': '2023-10-23T20:47:00.207Z', - wfSpecId: { - name: 'evaluate-ai-decision', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '6-risk-approval-form-USER_TASK', - 'failures': [], - 'userTask': { - 'userTaskRunId': { - 'wfRunId': '61e8c3cdba664d929c3c99d2c1a4e91a', - 'userTaskGuid': 'cd2ec2ca428f4506bdc834707ddb7564' - } - }, - 'failureHandlerIds': [] - }) - ) - } - - return Promise.reject(new Error('Node position not present in wf Run')) - } - } as any)) - - const graphLayouter: GraphLayouter = new GraphLayouter(new ElkConstructor(), labelExtractor, LHClient.getInstance('ANY_TOKEN')) - const layoutedGraphForWfRun: ReactFlowGraph = await graphLayouter.getLayoutedGraphForWfRun(wfSpec, wfSpecName, WF_RUN_ID, 0) - - expect(layoutedGraphForWfRun.nodes).toEqual(expectedNodes) - }) - - it('should mark the nodes that has run for the desired Thread Spec + Thread Run Number combination', async () => { - const threadSpec = 'spawned-thread' - const wfSpec: WfSpec = { - id: { - name: 'example-child-thread', - majorVersion: 0, - revision: 0 - }, - frozenVariables: [], - 'createdAt': '2023-10-24T16:54:56.181Z', - 'status': MetadataStatus.ACTIVE, - 'threadSpecs': { - 'entrypoint': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-parent-task-1-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-parent-task-1-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-spawned-thread-START_THREAD', - 'variableMutations': [ - { - 'lhsName': 'parent-var', - 'operation': VariableMutationType.ASSIGN, - 'nodeOutput': {} - } - ] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'parent-task-1', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'parent-var' - } - ] - } - }, - '2-spawned-thread-START_THREAD': { - 'outgoingEdges': [ - { - 'sinkNodeName': '3-threads-WAIT_FOR_THREADS', - 'variableMutations': [ - { - 'lhsName': '2-spawned-thread-START_THREAD', - 'operation': VariableMutationType.ASSIGN, - 'nodeOutput': {} - } - ] - } - ], - 'failureHandlers': [], - 'startThread': { - 'threadSpecName': threadSpec, - 'variables': { - 'child-var': { - 'variableName': 'parent-var' - } - } - } - }, - '3-threads-WAIT_FOR_THREADS': { - 'outgoingEdges': [ - { - 'sinkNodeName': '4-parent-task-2-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'waitForThreads': { - 'threads': { - threads: [ - { - 'threadRunNumber': { - 'variableName': '2-spawned-thread-START_THREAD' - } - } - ] - }, - perThreadFailureHandlers: [] - } - }, - '4-parent-task-2-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '5-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'parent-task-2', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [] - } - }, - '5-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - exit: { - failureDef: undefined - } - } - }, - 'variableDefs': [ - { - searchable: true, - required: true, - 'varDef': { - 'type': VariableType.INT, - 'name': 'parent-var', - 'defaultValue': undefined, - }, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - 'jsonIndexes': [], - }, - { - searchable: true, - required: true, - 'varDef': { - 'type': VariableType.INT, - 'name': '2-spawned-thread-START_THREAD', - 'defaultValue': undefined, - }, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - 'jsonIndexes': [], - } - ], - 'interruptDefs': [] - }, - 'spawned-thread': { - 'nodes': { - '0-entrypoint-ENTRYPOINT': { - 'outgoingEdges': [ - { - 'sinkNodeName': '1-child-task-TASK', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'entrypoint': {} - }, - '1-child-task-TASK': { - 'outgoingEdges': [ - { - 'sinkNodeName': '2-exit-EXIT', - 'variableMutations': [] - } - ], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - 'name': 'child-task', - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'child-var' - } - ] - } - }, - '2-exit-EXIT': { - 'outgoingEdges': [], - 'failureHandlers': [], - 'exit': {} - } - }, - 'variableDefs': [ - { - searchable: true, - required: true, - 'varDef': { - 'type': VariableType.INT, - 'name': 'child-var', - 'defaultValue': undefined, - }, - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - 'jsonIndexes': [], - }, - ], - 'interruptDefs': [] - } - }, - 'entrypointThreadName': 'entrypoint', - - } - - const CURRENT_NODE_POSITION = 1 - const WF_RUN_ID = '56021fd8a2054563b25b595e6162b00c' - - const threadRunNumber = 2 - const wfRun: WfRun = { - 'id': { - 'id': '56021fd8a2054563b25b595e6162b00c' - }, - 'oldWfSpecVersions': [], - 'greatestThreadrunNumber': 2, - 'wfSpecId': { - 'name': 'example-child-thread', - 'majorVersion': 0, - 'revision': 0, - }, - 'status': LHStatus.COMPLETED, - 'startTime': '2023-10-24T16:56:36.161Z', - 'endTime': '2023-10-24T16:56:36.211Z', - 'threadRuns': [ - { - 'wfSpecId': { - 'name': 'example-child-thread', - 'majorVersion': 0, - 'revision': 0, - }, - 'number': 0, - 'status': LHStatus.COMPLETED, - 'threadSpecName': 'entrypoint', - 'startTime': '2023-10-24T16:56:36.163Z', - 'endTime': '2023-10-24T16:56:36.211Z', - 'childThreadIds': [ - 1 - ], - 'haltReasons': [], - 'currentNodePosition': 5, - 'handledFailedChildren': [], - 'type': ThreadType.ENTRYPOINT - }, - { - 'wfSpecId': { - 'name': 'example-child-thread', - 'majorVersion': 0, - 'revision': 0, - }, - 'number': 1, - 'status': LHStatus.COMPLETED, - 'threadSpecName': threadSpec, - 'startTime': '2023-10-24T16:56:36.191Z', - 'endTime': '2023-10-24T16:56:36.203Z', - 'childThreadIds': [], - 'parentThreadId': 0, - 'haltReasons': [], - 'currentNodePosition': 0, - 'handledFailedChildren': [], - 'type': ThreadType.CHILD - }, - { - 'wfSpecId': { - 'name': 'example-child-thread', - 'majorVersion': 0, - 'revision': 0, - }, - 'number': threadRunNumber, - 'status': LHStatus.COMPLETED, - 'threadSpecName': threadSpec, - 'startTime': '2023-10-24T16:56:36.191Z', - 'endTime': '2023-10-24T16:56:36.203Z', - 'childThreadIds': [], - 'parentThreadId': 0, - 'haltReasons': [], - 'currentNodePosition': CURRENT_NODE_POSITION, - 'handledFailedChildren': [], - 'type': ThreadType.CHILD - } - ], - 'pendingInterrupts': [], - 'pendingFailures': [] - } - - const expectedNodesForSpawnThreadRun2: ReactFlowNodeWithLHInfo[] = [ - { - id: '0-entrypoint-ENTRYPOINT', - data: { label: '0-entrypoint-ENTRYPOINT', failureHandlers: [], nodeHasRun: true }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'entrypointNodeType', - positionInThreadRun: 0, - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [ - { - 'sinkNodeName': '1-child-task-TASK' - } - ], - 'variableMutations': [], - 'failureHandlers': [], - 'entrypoint': {} - }) - }, - { - id: '1-child-task-TASK', - data: { label: '1-child-task-TASK', failureHandlers: [], nodeHasRun: true }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'taskNodeType', - positionInThreadRun: 1, - lhNode: LHNode.fromJSON({ - 'outgoingEdges': [ - { - 'sinkNodeName': '2-exit-EXIT' - } - ], - 'variableMutations': [], - 'failureHandlers': [], - 'task': { - 'taskDefId': { - name: 'child-task' - }, - 'timeoutSeconds': 15, - 'retries': 0, - 'variables': [ - { - 'variableName': 'child-var' - } - ] - } - }) - }, - { - id: '2-exit-EXIT', - data: { label: '2-exit-EXIT', failureHandlers: [], nodeHasRun: false }, - position: { x: expect.any(Number), y: expect.any(Number) }, - type: 'exitNodeType', - lhNode: { - outgoingEdges: [], - failureHandlers: [], - exit: {} - } - }, - ] - - - const spy = jest.spyOn(LHClient, 'getInstance') - spy.mockImplementationOnce(() => ( - { - getWfRun: (_: any): Promise => { - return Promise.resolve(wfRun) - }, - getNodeRun: (getNodeRunRequest: { - wfRunId: string, - threadNumber: number, - position: number - }): Promise => { - if (getNodeRunRequest.position === 0) { - return Promise.resolve({ - id: { - wfRunId: { - id: '56021fd8a2054563b25b595e6162b00c' - }, - position: 0, - threadRunNumber: 1 - }, - 'status': 'COMPLETED', - 'arrivalTime': '2023-10-24T16:56:36.191Z', - 'endTime': '2023-10-24T16:56:36.191Z', - 'wfSpecId': { - name: 'example-child-thread', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': threadSpec, - 'nodeName': '0-entrypoint-ENTRYPOINT', - 'failures': [], - 'entrypoint': {}, - 'failureHandlerIds': [] - } as NodeRun - ) - } - - if (getNodeRunRequest.position === 1) { - return Promise.resolve({ - id: { - wfRunId: { - id: '56021fd8a2054563b25b595e6162b00c' - }, - position: 1, - threadRunNumber: 1 - }, - 'status': 'COMPLETED', - 'arrivalTime': '2023-10-24T16:56:36.191Z', - 'endTime': '2023-10-24T16:56:36.200Z', - wfSpecId: { - name: 'example-child-thread', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': threadSpec, - 'nodeName': '1-child-task-TASK', - 'failures': [], - 'task': { - 'taskRunId': { - 'wfRunId': { - id: '56021fd8a2054563b25b595e6162b00c' - }, - 'taskGuid': 'a86ea08caf4c40bfaf3c2f93ac404285' - } - }, - 'failureHandlerIds': [] - } as NodeRun) - } - - return Promise.reject(new Error('Node position not present in wf Run')) - } - } as any)) - - const graphLayouter: GraphLayouter = new GraphLayouter(new ElkConstructor(), labelExtractor, LHClient.getInstance('ANY_TOKEN')) - const layoutedGraphForSpawnThreadsRun2: ReactFlowGraph = await graphLayouter.getLayoutedGraphForWfRun(wfSpec, wfSpecName, WF_RUN_ID, threadRunNumber, threadSpec) - - expect(layoutedGraphForSpawnThreadsRun2.nodes).toEqual(expectedNodesForSpawnThreadRun2) - }) - }) -}) diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter.ts deleted file mode 100644 index 8f43b3acb..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter.ts +++ /dev/null @@ -1,200 +0,0 @@ -import type { Edge, Node } from 'reactflow' -import type { ELK as ELKType, ElkExtendedEdge, ElkNode } from 'elkjs/lib/elk.bundled.js' -import type { ElkLabel } from 'elkjs' -import type { Client } from 'nice-grpc/src/client/Client' -import type { ThreadRun, WfRun } from '../../../../../../../littlehorse-public-api/wf_run' -import type { Edge as LHEdge, Node as LHNode, WfSpec } from '../../../../../../../littlehorse-public-api/wf_spec' -import type { LittleHorseDefinition } from '../../../../../../../littlehorse-public-api/service' -import type { NodeRun } from '../../../../../../../littlehorse-public-api/node_run' -import EdgeHandler from './ReactFlowEdgeHandler' -import ELKNodeMapper from './ElkNodeMapper' -import NodeTypeMapper from './NodeTypeMapper' - -export interface ReactFlowGraph { - nodes: ReactFlowNodeWithLHInfo[], - edges: Edge[] -} - -export interface ReactFlowNodeWithLHInfo extends Node { - lhNode: LHNode, - positionInThreadRun?: number -} - -const defaultThreadSpec = 'entrypoint' - -class GraphLayouter { - private elkJsInstance: ELKType - private readonly extractLabel: (edge: LHEdge) => (string | null) - private lhClient: Client | undefined - - constructor(elkJsInstance: ELKType, extractLabel: (edge: LHEdge) => string | null, lhClient?: Client) { - this.extractLabel = extractLabel - this.elkJsInstance = elkJsInstance - this.lhClient = lhClient - } - async getLayoutedGraphForWfRun(wfSpec: WfSpec, wfSpecName: string, wfRunId: string, threadRunNumber: number, threadSpec: string = defaultThreadSpec): Promise { - if (this.lhClient === undefined) { - throw Error('LH Client is needed to get the wfRun graph layout.') - } - - let threadSpecWithValidValue = threadSpec - if (wfSpec.threadSpecs[threadSpec] === undefined) { - threadSpecWithValidValue = defaultThreadSpec - } - - const wfRun: WfRun = await this.lhClient.getWfRun({ id: wfRunId } as any) - - const threadRunForThreadSpec: ThreadRun | undefined = wfRun - .threadRuns - .find(tr => tr.threadSpecName === threadSpecWithValidValue && tr.number === threadRunNumber) - - if (threadRunForThreadSpec === undefined) { - return Promise.reject(new Error('Not able to to find the corresponding thread run.')) - } - - const wfRunCurrentPosition: number = threadRunForThreadSpec.currentNodePosition - - const layoutedWfSpec: ReactFlowGraph = await this.getLayoutedGraph(wfSpec, wfSpecName, threadSpecWithValidValue) - const nodeRuns: NodeRun[] = await this.getNodeRuns(wfRunCurrentPosition, wfRun, threadRunForThreadSpec) - - this.markNodeInWfSpecAsAlreadyExecuted(nodeRuns, layoutedWfSpec) - - return Promise.resolve(layoutedWfSpec) - } - - private markNodeInWfSpecAsAlreadyExecuted(nodeRuns: NodeRun[], layoutedWfSpec: ReactFlowGraph) { - nodeRuns.forEach((nodeRun: NodeRun) => { - const nodeRunName: string = nodeRun.nodeName - layoutedWfSpec.nodes.forEach(node => { - if (nodeRunName === node.id) { - node.data.nodeHasRun = true - node.positionInThreadRun = nodeRun.id?.position - } - }) - }) - } - - async getLayoutedGraph(wfSpec: WfSpec, wfSpecName: string, desiredThreadSpec: string = defaultThreadSpec): Promise { - const layoutOptions = { - 'elk.algorithm': 'layered', - 'elk.spacing.nodeNode': '400', - 'spacing.edgeNode': '300', - 'elk.direction': 'DOWN', - 'spacing.nodeNodeBetweenLayers': '160', - 'elk.layered.nodePlacement.strategy': 'SIMPLE' - } - - let desiredThreadSpecWithValidValue = desiredThreadSpec - if (wfSpec.threadSpecs[desiredThreadSpec] === undefined) { - desiredThreadSpecWithValidValue = defaultThreadSpec - } - - const lhNodes: [string, LHNode][] = Object - .entries(wfSpec.threadSpecs[desiredThreadSpecWithValidValue].nodes) - - const elkNodes: ElkNode[] = this.mapToElkNodes(lhNodes) - const elkEdges: ElkExtendedEdge[] = this.mapToElkEdges(lhNodes) - - const graphToBeLayouted = { - id: wfSpecName, - layoutOptions, - children: elkNodes, - edges: elkEdges, - } - - return this.elkJsInstance.layout(graphToBeLayouted).then(({ children, edges }) => { - return { - nodes: this.mapToReactFlowNodes(children ?? [], lhNodes), - edges: this.mapToReactFlowEdges(edges ?? []) - } - }) - } - - private mapToElkNodes(lhNodes: [string, LHNode][]): ElkNode[] { - return lhNodes.map((lhNode) => { - return ELKNodeMapper.fromLHNode(lhNode[0]) - }) - } - - private mapToElkEdges(lhNodes: [string, LHNode][]): ElkExtendedEdge[] { - let elkEdges: ElkExtendedEdge[] = [] - - lhNodes.forEach((lhNode: [string, LHNode]): ElkExtendedEdge[] => { - const nodeInformation: LHNode = lhNode[1] - const outgoingEdges: LHEdge[] = nodeInformation.outgoingEdges - const nodeName: string = lhNode[0] - - if (outgoingEdges.length <= 0) { - return [] as ElkExtendedEdge[] - } - - elkEdges = elkEdges.concat(outgoingEdges.map((outgoingEdge: LHEdge) => { - return { - id: `${nodeName}-${outgoingEdge.sinkNodeName}`, - sources: [ nodeName ], - targets: [ outgoingEdge.sinkNodeName ], - labels: [ { text: this.extractLabel(outgoingEdge) } as ElkLabel ] - } - })) - - return elkEdges - }) - - return elkEdges - } - - private mapToReactFlowNodes(elkNodes: ElkNode[], lhNodes: [string, LHNode][]): ReactFlowNodeWithLHInfo[] { - return elkNodes.map((elkNode: ElkNode) => { - const nodeType: string | undefined = NodeTypeMapper.map(elkNode.id) - const elkNodeLabel: ElkLabel = elkNode.labels ? elkNode.labels[0] : { text: '' } - - const currentLHNode = lhNodes.find(lhNode => { - const nodeName: string = lhNode[0] - return nodeName === elkNodeLabel - }) - - return { - id: elkNode.id, - data: { - label: elkNode.labels?.[0], - failureHandlers: currentLHNode ? currentLHNode[1].failureHandlers : [], - nodeHasRun: false - }, - position: { - x: elkNode.x, - y: elkNode.y - }, - type: nodeType, - lhNode: currentLHNode?.[1] - } as ReactFlowNodeWithLHInfo - }) - } - - private mapToReactFlowEdges(edges: ElkExtendedEdge[]): Edge[] { - return EdgeHandler.accommodateEdges(edges) - } - - private async getNodeRuns(wfRunCurrentPosition: number, wfRun: WfRun, threadRunForThreadSpec: ThreadRun): Promise { - if (this.lhClient === undefined) { - return Promise.reject(new Error('You need to provide a Little Horse Client.')) - } - - const nodeRunsPromises: Promise[] = [] - - for (let position = 0; position <= wfRunCurrentPosition; position++) { - try { - const nodeRun: Promise = this.lhClient.getNodeRun({ - wfRunId: wfRun.id, - threadRunNumber: threadRunForThreadSpec.number, - position - } as any) - nodeRunsPromises.push(nodeRun) - } catch (error) { - console.error(`GraphLayouter - Not able to get NodeRun for: wfRunId:${wfRun.id} threadRunNumber:${threadRunForThreadSpec.number} position: ${position}`) - } - } - return Promise.all(nodeRunsPromises) - } -} - -export default GraphLayouter diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/NodeTypeMapper.test.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/NodeTypeMapper.test.ts deleted file mode 100644 index af832ccd3..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/NodeTypeMapper.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import NodeTypeMapper from './NodeTypeMapper' - -describe('node Type Mapper from ELK to React Flow', () => { - it.each([ - [ '0-entrypoint-ENTRYPOINT', 'entrypointNodeType' ], - [ '0-entrypoint-TASK', 'taskNodeType' ], - [ '0-a-name-EXIT', 'exitNodeType' ], - [ '0-a-name-NOP', 'nopNodeType' ], - [ '0-a-name-START_THREAD', 'spawnThreadNodeType' ], - [ '0-a-name-WAIT_FOR_THREADS', 'waitForThreadsNodeType' ], - [ '0-a-name-EXTERNAL_EVENT', 'externalEventNodeType' ], - [ '0-a-name-SLEEP', 'sleepNodeType' ], - [ '0-a-name-START_MULTIPLE_THREADS', 'spawnMultipleThreadsNodeType' ], - [ '0-a-name-USER_TASK', 'userTaskNodeType' ], - [ 'an-invalid-task-type-INVALID', undefined ], - ]) ('maps %s elkNodeId as %s reactFlowNodeType', (elkNodeId: string, expectedNodeType: string) => { - expect(NodeTypeMapper.map(elkNodeId)).toEqual(expectedNodeType) - }) -}) diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/NodeTypeMapper.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/NodeTypeMapper.ts deleted file mode 100644 index d6f103897..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/NodeTypeMapper.ts +++ /dev/null @@ -1,49 +0,0 @@ -const fromNodeKeyName = (keyName: string) => { - if (keyName.includes('ENTRYPOINT')) { - return 'entrypointNodeType' - } - - if (keyName.includes('-TASK')) { - return 'taskNodeType' - } - - if (keyName.includes('EXIT')) { - return 'exitNodeType' - } - - if (keyName.includes('NOP')) { - return 'nopNodeType' - } - - if (keyName.includes('START_THREAD')) { - return 'spawnThreadNodeType' - } - - if (keyName.includes('WAIT_FOR_THREADS')) { - return 'waitForThreadsNodeType' - } - - if (keyName.includes('EXTERNAL_EVENT')) { - return 'externalEventNodeType' - } - - if (keyName.includes('SLEEP')) { - return 'sleepNodeType' - } - - if (keyName.includes('START_MULTIPLE_THREADS')) { - return 'spawnMultipleThreadsNodeType' - } - - if (keyName.includes('-USER_TASK')) { - return 'userTaskNodeType' - } - - return undefined -} - -const NodeTypeMapper = { - map: fromNodeKeyName -} - -export default NodeTypeMapper diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ReactFlowEdgeHandler.ts b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ReactFlowEdgeHandler.ts deleted file mode 100644 index ef7165a69..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/mappers/ReactFlowEdgeHandler.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { ElkExtendedEdge } from 'elkjs' -import type { Edge } from 'reactflow' -import { MarkerType } from 'reactflow' -import EdgeTypesEnum from '../EdgeTypesEnum' - -const accommodateEdges = (edges: ElkExtendedEdge[]) => { - let allConnectionsBetweenNodes: string[] = getAllConnectionsBetweenNodes(edges) - - const START_EDGE_ON_THE_LEFT = 'sourceLeft' - const START_EDGE_ON_THE_RIGHT = 'sourceRight' - const END_EDGE_ON_THE_LEFT = 'targetLeft' - const END_EDGE_ON_THE_RIGHT = 'targetRight' - - return edges.map((edge: ElkExtendedEdge) => { - const source: string = edge.sources[0] - const target: string = edge.targets[0] - - let label = '' - - if (edge.labels?.[0] !== undefined ) { - label = edge.labels[0].text ? edge.labels[0].text : '' - } - - - const baseReactFlowEdge: Edge = { - id: edge.id, - source, - type: EdgeTypesEnum.CustomSmartEdgeType, - animated: true, - markerEnd: { - type: MarkerType.ArrowClosed, - }, - target, - label - } - - let sameNodesOccurrences = 0 - - const stillNeedToProcessEdgesFromTheLoop = allConnectionsBetweenNodes.includes(`${source}${target}`) || allConnectionsBetweenNodes.includes(`${target}${source}`) - const isEdgePartOfALoop = source.includes('NOP') && target.includes('NOP') && (stillNeedToProcessEdgesFromTheLoop) - - if (isEdgePartOfALoop) { - const isEdgeIncludedInForwardDirection = allConnectionsBetweenNodes.includes(`${source}${target}`) - const isEdgeIncludedInReverseDirection = allConnectionsBetweenNodes.includes(`${target}${source}`) - - if (isEdgeIncludedInForwardDirection) { - sameNodesOccurrences += 1 - } - - if (isEdgeIncludedInReverseDirection) { - sameNodesOccurrences += 1 - } - - const nodesInvolvedIn2Edges = sameNodesOccurrences === 2 - - const reactFlowEdge = { - ...baseReactFlowEdge, - sourceHandle: nodesInvolvedIn2Edges ? START_EDGE_ON_THE_LEFT : START_EDGE_ON_THE_RIGHT, - targetHandle: nodesInvolvedIn2Edges ? END_EDGE_ON_THE_LEFT : END_EDGE_ON_THE_RIGHT, - } - - const connectionsAfterRemovingAlreadyProcessedEdge = allConnectionsBetweenNodes.filter(connection => connection !== `${source}${target}`) - allConnectionsBetweenNodes = connectionsAfterRemovingAlreadyProcessedEdge - return reactFlowEdge - } - - return baseReactFlowEdge - }) -} - -const getAllConnectionsBetweenNodes = (edges: ElkExtendedEdge[]) => { - const allConnectionsBetweenNodes: string[] = [] - - edges?.forEach(edge => { - allConnectionsBetweenNodes.push(`${edge.sources[0]}${edge.targets[0]}`) - }) - return allConnectionsBetweenNodes -} - -const ReactFlowEdgeHandler = { - accommodateEdges -} - -export default ReactFlowEdgeHandler diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/EntrypointNodeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/EntrypointNodeType.tsx deleted file mode 100644 index ddc24d4d3..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/EntrypointNodeType.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Handle, Position } from 'reactflow' -import LabelsUtils from '../LabelsUtils' - -export default function EntryPointNodeType({ data }) { - - return ( -
-
-
- entrypoint -
- {LabelsUtils.extractLabel(data.label)} -
-
-
- -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/ExitNodeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/ExitNodeType.tsx deleted file mode 100644 index f170744a3..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/ExitNodeType.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Handle, Position } from 'reactflow' -import LabelsUtils from '../LabelsUtils' - -export default function ExitNodeType({ data }) { - - return ( -
-
-
- Exit -
- {LabelsUtils.extractLabel(data.label)} -
-
-
- - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/ExternalEventNodeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/ExternalEventNodeType.tsx deleted file mode 100644 index 1ba026c5e..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/ExternalEventNodeType.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Handle, Position } from 'reactflow' -import LabelsUtils from '../LabelsUtils' - -export default function ExternalEventNodeType({ data }) { - - return ( -
-
-
- EXTERNAL_EVENT -
- {LabelsUtils.extractLabel(data.label)} -
-
-
- - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/NopNodeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/NopNodeType.tsx deleted file mode 100644 index 67c05887a..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/NopNodeType.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Handle, Position } from 'reactflow' -import LabelsUtils from '../LabelsUtils' - -export default function NopNodeType({ data }) { - - return ( -
-
-
- Nop -
- {LabelsUtils.extractLabel(data.label)} -
-
-
- - - - - - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SleepNodeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SleepNodeType.tsx deleted file mode 100644 index 3fef56e52..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SleepNodeType.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Handle, Position } from 'reactflow' -import LabelsUtils from '../LabelsUtils' - -export default function SleepNodeType({ data }) { - - return ( -
-
-
- SLEEP -
- {LabelsUtils.extractLabel(data.label)} -
-
-
- - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SpawnMultipleThreadsNodeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SpawnMultipleThreadsNodeType.tsx deleted file mode 100644 index 24ad2ef8e..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SpawnMultipleThreadsNodeType.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Handle, Position } from 'reactflow' -import LabelsUtils from '../LabelsUtils' - -export default function SpawnMultipleThreadsNodeType({ data }) { - - return ( -
-
-
- Start Thread -
- {LabelsUtils.extractLabel(data.label)} -
-
-
- - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SpawnThreadNodeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SpawnThreadNodeType.tsx deleted file mode 100644 index 1bfe85200..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/SpawnThreadNodeType.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Handle, Position } from 'reactflow' -import LabelsUtils from '../LabelsUtils' - -export default function SpawnThreadNodeType({ data }) { - - return ( -
-
-
- Start Thread -
- {LabelsUtils.extractLabel(data.label)} -
-
-
- - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/TaskNodeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/TaskNodeType.tsx deleted file mode 100644 index 419585864..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/TaskNodeType.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Handle, Position } from 'reactflow' -import LabelsUtils from '../LabelsUtils' - -export default function TaskNodeType({ data }) { - - return ( -
-
-
- Task - {Boolean(data.failureHandlers?.length) && Failure Handler Logo} -
- {LabelsUtils.extractLabel(data.label)} -
-
-
- - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/UserTaskNodeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/UserTaskNodeType.tsx deleted file mode 100644 index 3c251dba3..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/UserTaskNodeType.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Handle, Position } from 'reactflow' -import LabelsUtils from '../LabelsUtils' - -export default function UserTaskNodeType({ data }) { - - return ( -
-
-
- Task - {Boolean(data.failureHandlers?.length) && Failure Handler Logo} -
- {LabelsUtils.extractLabel(data.label)} -
-
-
- - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/WaitForThreadsNodeType.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/WaitForThreadsNodeType.tsx deleted file mode 100644 index c650581cc..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/components/visualizer/nodeTypes/WaitForThreadsNodeType.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Handle, Position } from 'reactflow' -import LabelsUtils from '../LabelsUtils' - -export default function WaitForThreadsNodeType({ data }) { - - return ( -
-
-
- Wait for Threads - {Boolean(data.failureHandlers?.length) && Failure Handler Logo} -
- {LabelsUtils.extractLabel(data.label)} -
-
-
- - -
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/page.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/page.tsx deleted file mode 100644 index 808178157..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/page.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import Breadcrumbs from '../../../../components/Breadcrumbs' -import { WorkflowExecutionMetrics } from './sections/WorkflowExecutionMetrics' -import { WfRunSearch } from './sections/WfRunSearch' -import { WfSpecVisualization } from './sections/WfSpecVisualization' - -function WfSpec({ params }: { params: { id: string; version: number } }) { - return ( - <> -

- WfSpec{' '} - |{' '} - {params.id.charAt(0) + params.id.slice(1)}{' '} -

- - - - - - - - - ) -} - -export default WfSpec diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/sections/WfRunSearch.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/sections/WfRunSearch.tsx deleted file mode 100644 index 22b817dce..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/sections/WfRunSearch.tsx +++ /dev/null @@ -1,348 +0,0 @@ -'use client' -import { - Button, - CalendarB, - Label, - LoadMoreButton, - Loader, - PerPage -} from 'ui' -import React, { useEffect, useState } from 'react' -import moment from 'moment' -import { WfRunSearchTable } from '../components/search/WfRunSearchTable' -import { getVersionFromFormattedString } from '../components/common/VersionExtractor' - -export interface Result { - id: string - status?: string -} - -const allLimit = 5 -const defaultLimit = 15 - -export function WfRunSearch({ id, version }: any) { - let first = true - - const [ loading, setLoading ] = useState(false) - const [ firstLoad, setFirstLoad ] = useState(false) - const [ limit, setLimit ] = useState(defaultLimit) - - const [ startDt, setStartDt ] = useState(moment().startOf('day').toDate()) - const [ endDt, setEndDt ] = useState(moment().toDate()) - - const [ errorBookmark, setErrorBookmark ] = useState() - const [ completedBookmark, setCompletedBookmark ] = useState() - // const [startingBookmark, setStartingBookmark] = useState() - const [ runningBookmark, setRunningBookmark ] = useState() - const [ haltingBookmark, setHaltingBookmark ] = useState() - const [ haltedBookmark, setHaltedBookmark ] = useState() - - const [ type, setType ] = useState('') - const [ wfRunSearchResults, setWfRunSearchResults ] = useState([]) - - const fetchData = async (wfRunStatus: string, paginate = false, useLimit = true) => { - let bookmark: string | undefined - if (wfRunStatus === 'ERROR') {bookmark = errorBookmark} - if (wfRunStatus === 'COMPLETED') {bookmark = completedBookmark} - // if(wfRunStatus === "STARTING") bookmark = startingBookmark - if (wfRunStatus === 'RUNNING') {bookmark = runningBookmark} - if (wfRunStatus === 'HALTING') {bookmark = haltingBookmark} - if (wfRunStatus === 'HALTED') {bookmark = haltedBookmark} - - const filters: any = { - limit: useLimit ? limit : allLimit - } - // if(prefix?.trim()) filters['prefix'] = prefix.trim().toLocaleLowerCase() - if (paginate && bookmark) {filters.bookmark = bookmark} - if (paginate && !bookmark) {return { status: 'done' }} - - const { majorVersion, revision } = getVersionFromFormattedString(version) - - const res = await fetch('/api/search/wfRun', { - method: 'POST', - body: JSON.stringify({ - status: wfRunStatus, - wfSpecName: id, - wfSpecMajorVersion: majorVersion, - wfSpecRevision: revision, - earliestStart: startDt, - latestStart: endDt, - ...filters - }) - }) - if (res.ok) { - const response = await res.json() - return { ...response, status: 'ok' } - } - } - const getData = async () => { - setLoading(true) - const { results, bookmark } = await fetchData(type) - if (type === 'ERROR') {setErrorBookmark(bookmark)} - if (type === 'COMPLETED') {setCompletedBookmark(bookmark)} - // if(type === "STARTING") setStartingBookmark(bookmark) - if (type === 'RUNNING') {setRunningBookmark(bookmark)} - if (type === 'HALTING') {setHaltingBookmark(bookmark)} - if (type === 'HALTED') {setHaltedBookmark(bookmark)} - setWfRunSearchResults(results.map((v: Result) => ({ ...v, status: type }))) - setLoading(false) - } - const getMData = async () => { - setErrorBookmark(undefined) - setCompletedBookmark(undefined) - // setStartingBookmark(undefined) - setRunningBookmark(undefined) - setHaltingBookmark(undefined) - setHaltedBookmark(undefined) - if (type) {return getData()} - - setLoading(true) - setWfRunSearchResults([]) - - // const starting = await fetchData('STARTING', false, false) - // setStartingBookmark(starting.bookmark) - // setResults(prev => [...prev, ...starting.wfRunSearchResults.map((v:any) => ({...v, status:'STARTING'}))]) - - const running = await fetchData('RUNNING', false, false) - if (running !== undefined && running.results !== undefined) { - setRunningBookmark(running.bookmark) - setWfRunSearchResults(prev => [ - ...prev, - ...running.results?.map((v: any) => ({ ...v, status: 'RUNNING' })) - ]) - } - - const completed = await fetchData('COMPLETED', false, false) - if (completed !== undefined && completed.results !== undefined) { - - - setCompletedBookmark(completed.bookmark) - setWfRunSearchResults(prev => [ - ...prev, - ...completed.results.map((v: any) => ({ ...v, status: 'COMPLETED' })) - ]) - } - - const errors = await fetchData('ERROR', false, false) - if (errors !== undefined && errors.results !== undefined) { - - setErrorBookmark(errors.bookmark) - setWfRunSearchResults(prev => [ - ...prev, - ...errors.results.map((v: any) => ({ ...v, status: 'ERROR' })) - ]) - } - - const haltings = await fetchData('HALTING', false, false) - if (haltings !== undefined && haltings.results !== undefined) { - - setHaltingBookmark(haltings.bookmark) - setWfRunSearchResults(prev => [ - ...prev, - ...haltings.results.map((v: any) => ({ ...v, status: 'HALTING' })) - ]) - } - - const halteds = await fetchData('HALTED', false, false) - if (halteds !== undefined && halteds.results !== undefined) { - - - setHaltedBookmark(halteds.bookmark) - setWfRunSearchResults(prev => [ - ...prev, - ...halteds.results.map((v: any) => ({ ...v, status: 'HALTED' })) - ]) - } - setFirstLoad(true) - setLoading(false) - } - const loadMMore = async () => { - if (type) {return loadMore()} - setLoading(true) - - // if(startingBookmark){ - // const starting = await fetchData('STARTING', true, false) - // if(starting.status!='done'){ - // setStartingBookmark(starting.bookmark) - // setResults(prev => [...prev, ...starting.wfRunSearchResults.map((v:any) => ({...v, status:'STARTING'}))]) - // } - // } - if (runningBookmark) { - const running = await fetchData('RUNNING', true, false) - if (running.status !== 'done') { - setRunningBookmark(running.bookmark) - setWfRunSearchResults(prev => [ - ...prev, - ...running.results.map((v: any) => ({ ...v, status: 'RUNNING' })) - ]) - } - } - if (completedBookmark) { - const completed = await fetchData('COMPLETED', true, false) - if (completed.status !== 'done') { - setCompletedBookmark(completed.bookmark) - setWfRunSearchResults(prev => [ - ...prev, - ...completed.results.map((v: any) => ({ ...v, status: 'COMPLETED' })) - ]) - } - } - if (errorBookmark) { - const tasks = await fetchData('ERROR', true, false) - if (tasks.status !== 'done') { - setErrorBookmark(tasks.bookmark) - setWfRunSearchResults(prev => [ - ...prev, - ...tasks.results.map((v: any) => ({ ...v, status: 'ERROR' })) - ]) - } - } - if (haltingBookmark) { - const haltings = await fetchData('HALTING', true, false) - if (haltings.status !== 'done') { - setHaltingBookmark(haltings.bookmark) - setWfRunSearchResults(prev => [ - ...prev, - ...haltings.results.map((v: any) => ({ ...v, status: 'HALTING' })) - ]) - } - } - if (haltedBookmark) { - const halteds = await fetchData('HALTED', true, false) - if (halteds.status !== 'done') { - setHaltedBookmark(halteds.bookmark) - setWfRunSearchResults(prev => [ - ...prev, - ...halteds.results.map((v: any) => ({ ...v, status: 'HALTED' })) - ]) - } - } - - setLoading(false) - } - const loadMore = async () => { - setLoading(true) - - const { results, bookmark, status } = await fetchData(type, true) - - if (status === 'done') {return} - - if (type === 'ERROR') {setErrorBookmark(bookmark)} - if (type === 'COMPLETED') {setCompletedBookmark(bookmark)} - // if(type === "STARTING") setStartingBookmark(bookmark) - if (type === 'RUNNING') {setRunningBookmark(bookmark)} - if (type === 'HALTING') {setHaltingBookmark(bookmark)} - if (type === 'HALTED') {setHaltedBookmark(bookmark)} - setWfRunSearchResults(prev => [ - ...prev, - ...results.map((v: any) => ({ ...v, status: type })) - ]) - setLoading(false) - } - - // const keyDownHandler = (e:React.KeyboardEvent) => { - // clearTimeout(myTimeout) - // if( e.key == 'Enter' ) return getMData() - // myTimeout = setTimeout(getMData, keyDownDelay); - // } - - useEffect(() => { - if (firstLoad) {getMData()} - }, [ type ]) - useEffect(() => { - if (firstLoad) {getMData()} - }, [ startDt, endDt ]) - - useEffect(() => { - if (!first) {return} - first = false - getMData() - }, []) - return ( -
-
-

WfRun search

-
- - - - {/* */} - - - - - -
-
-
- {wfRunSearchResults.length > 0 ? ( - - ) : ( - - )} -
- -
-
- {type ? ( - <> - - {' '} - - ) : undefined} - - Load More - -
-
-
- ) -} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/sections/WfSpecVisualization.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/sections/WfSpecVisualization.tsx deleted file mode 100644 index 7cd264125..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/sections/WfSpecVisualization.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { WfSpecVisualizer } from '../components/visualizer/WfSpecVisualizer' -import { VersionChanger } from '../components/VersionChanger' - -export function WfSpecVisualization({ id, version }:any) { - - - return
-
-

WfSpec visualization

- -
- - - -
-} diff --git a/dashboard/apps/web/app/wfspec/[id]/[version]/sections/WorkflowExecutionMetrics.tsx b/dashboard/apps/web/app/wfspec/[id]/[version]/sections/WorkflowExecutionMetrics.tsx deleted file mode 100644 index 2d583bb5c..000000000 --- a/dashboard/apps/web/app/wfspec/[id]/[version]/sections/WorkflowExecutionMetrics.tsx +++ /dev/null @@ -1,29 +0,0 @@ -'use client' -import { Calendar } from 'ui' -import { useState } from 'react' -import moment from 'moment' -import { WorkflowExecutionMetrics as WorkflowExecutionM } from '../components/metrics/WorkflowExecutionMetrics' - -interface WorkflowExecutionMetricsProps { - id:string - version?: number -} -export function WorkflowExecutionMetrics({ id,version }:WorkflowExecutionMetricsProps) { - const [ windowLength, setWindowLength ] = useState('HOURS_2') - const [ windows, setWindows ] = useState(12) - const [ lastDate, setLastDate ] = useState(moment().toDate()) - - return
-
-

Workflow Execution metrics

- -
- - - -
-} diff --git a/dashboard/apps/web/components/Breadcrumbs.tsx b/dashboard/apps/web/components/Breadcrumbs.tsx deleted file mode 100644 index 3612de263..000000000 --- a/dashboard/apps/web/components/Breadcrumbs.tsx +++ /dev/null @@ -1,45 +0,0 @@ -'use client' -import Link from 'next/link' -import { usePathname } from 'next/navigation' -import React, { useEffect, useState } from 'react' - -interface Kinds { - wfSpec: string - taskDef: string - userTaskDef: string -} - -const kinds: Kinds = { - wfSpec: 'WfSpec', - taskDef: 'TaskDef', - userTaskDef: 'UserTaskDef' -} - -function Breadcrumbs() { - const pathname = usePathname() - const [ run, setRun ] = useState(false) - const [ prev, setPrev ] = useState('') - - useEffect( () => { - if (pathname) { - const typeExtractedFromPathName = pathname.split('/')[1] - - if ([ 'wfspec', 'taskdef','usertaskdef' ].includes(typeExtractedFromPathName)){ - sessionStorage.setItem('prev',pathname) - - } else { - setRun(true) - setPrev(sessionStorage.getItem('prev') || '') - } - } - },[ pathname ]) - return
- Cluster Overview - {!run && pathname ?
/ {kinds[pathname?.split('/')[1]]}: {pathname?.split('/').slice(2).join(' / ')}
: null} - {run && prev ? / {kinds[prev?.split('/')[1]]}: {prev?.split('/').slice(2).join(' / ')} : null} - {run ?
/ WFRun: {pathname?.split('/').slice(2).join(' / ')}
: null} - -
-} - -export default Breadcrumbs diff --git a/dashboard/apps/web/components/Charts/LatencyChart.tsx b/dashboard/apps/web/components/Charts/LatencyChart.tsx deleted file mode 100644 index a8ba62738..000000000 --- a/dashboard/apps/web/components/Charts/LatencyChart.tsx +++ /dev/null @@ -1,373 +0,0 @@ -import * as d3 from 'd3' -import { useCallback, useEffect } from 'react' -import moment from 'moment' -import { NewScrollBar } from './NewScrollBar' - -const _WIDTH = 1360 - -const ttTemplate=` -
{HEADER}
-
-
{C}
-
{D}
-
-` - - -// .range(["#B769E8", '#4D8FD6','#27CBB8', '#E6527F' ]) -const updateToolTipContent = (data:any,template:string) => { - return template - .replace('{HEADER}',moment(data.windowStart).format('MMM DD, HH:00')) - .replace('{A}',`${(data.scheduleToStartAvg ? data.scheduleToStartAvg : 0).toFixed(1)}s` ) - .replace('{B}',`${(data.scheduleToStartMax ? data.scheduleToStartMax : 0).toFixed(1)}s` ) - .replace('{C}',`${(data.startToCompleteAvg ? data.startToCompleteAvg : 0).toFixed(1)}s` ) - .replace('{D}',`${(data.startToCompleteMax ? data.startToCompleteMax : 0).toFixed(1)}s` ) -} - -const margin = { top: 10, right: 30, bottom: 60, left: 50 }, - width = _WIDTH - margin.left - margin.right, - height = 400 - margin.top - margin.bottom -const maxWBar = 74 -const gap = 8 - -const visibleWindows = Math.ceil((width)/(maxWBar+gap)) -const ShadowLight100 = '#3D4149' - -let datam:any[] = [] -let groups:any[] = [] -let _d3:d3.Selection -let svg:d3.Selection - -interface LatencyChartProps { - data:any[] - type:string -} - -export function LatencyChart({ data, type }:LatencyChartProps) { - - - const onMoveScroll = (ix:number) => { - if (!svg) {return null} - const num = (ix+1) - - - ///YELLOW LINE - - // .attr("x1", (_d, ix) => { - // let val = ((ix-1) * (maxWBar + gap))+(maxWBar/2) - // return val < 0 ? -800 : val - // } ) - // .attr("x2", (_d, ix) => { - // let val = ((ix) * (maxWBar + gap))+(maxWBar/2) - // return val < 0 ? -800 : val - // } ) - - - - svg.selectAll('.line-complete-yellow') - .data(datam) - // eslint-disable-next-line @typescript-eslint/no-shadow -- rework is needed in this code to make this rule to pass - .attr('stroke', (_d, ix) => { - const val = (((ix-1-(num-1))) * (maxWBar + gap))+(maxWBar/2) - if (val > (width-20)) {return 'transparent'} - return val < 0 ? 'transparent' : '#FFCC00' - } ) - // eslint-disable-next-line @typescript-eslint/no-shadow -- rework is needed in this code to make this rule to pass - .attr('x1', (_d, ix) => { - const val = (((ix-1-(num-1))) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - // eslint-disable-next-line @typescript-eslint/no-shadow -- rework is needed in this code to make this rule to pass - .attr('x2', (_d, ix) => { - const val = (((ix-(num-1))) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - svg.selectAll('.line-complete') - .data(datam) - // eslint-disable-next-line @typescript-eslint/no-shadow -- rework is needed in this code to make this rule to pass - .attr('x1', (_d, ix) => { - const val = (((ix-(num-1))) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - // eslint-disable-next-line @typescript-eslint/no-shadow -- rework is needed in this code to make this rule to pass - .attr('x2', (_d, ix) => { - const val = (((ix-(num-1))) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - - - svg.selectAll('.dot-complete-max') - .data(datam) - // eslint-disable-next-line @typescript-eslint/no-shadow -- rework is needed in this code to make this rule to pass - .attr('cx', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - svg.selectAll('.dot-complete-avg') - .data(datam) - // eslint-disable-next-line @typescript-eslint/no-shadow -- rework is needed in this code to make this rule to pass - .attr('cx', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - - - svg.select('g.xa').selectAll('text') - .data(groups) - // eslint-disable-next-line @typescript-eslint/no-shadow -- rework is needed in this code to make this rule to pass - .attr('x', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - svg.selectAll('.hours') - .data(groups) - // eslint-disable-next-line @typescript-eslint/no-shadow -- rework is needed in this code to make this rule to pass - .attr('x', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - svg.selectAll('.shadow') - .data(datam) - .attr('x', (_d, i) => { - const val = ((maxWBar+gap) * (i-(num-1))) - return val < 0 ? -800 : val - }) - } - - - - const drawChart = useCallback((dataForChart:any[], windowType:string) => { - - - datam = dataForChart.map(d => ({ - a:Number(d.data.totalScheduled) || 0, - b:Number(d.data.totalStarted) || 0, - c:Number(d.data.totalCompleted) || 0, - d:Number(d.data.totalErrored) || 0, - windowStart:d.label, - scheduleToStartMax: Number(d.data.scheduleToStartMax) ? Number(d.data.scheduleToStartMax)/1000 : 0, - scheduleToStartAvg: Number(d.data.scheduleToStartAvg) ? Number(d.data.scheduleToStartAvg)/1000 : 0, - startToCompleteMax: Number(d.data.startToCompleteMax) ? Number(d.data.startToCompleteMax)/1000 : 0, - startToCompleteAvg: Number(d.data.startToCompleteAvg) ? Number(d.data.startToCompleteAvg)/1000 : 0 - })) - // let groups = dates.reverse() - groups = dataForChart.map(d => ({ - l1:moment(d.label).format(`MMM DD${windowType==='DAYS_1' ? '' : ','}`), - l2:moment(d.label).format(`HH:${windowType==='HOURS_2' ? '00' : 'mm'}`), - })) - - - const he = datam.map(values => Math.max(values.scheduleToStartMax, values.startToCompleteMax)) - let maxH = Math.max(...he) > 9 ? Math.max(...he)+10 : 10 - maxH = maxH * 1.1 - - // const groups = ["1","2","3","4"] - - - // append the svg object to the body of the page - _d3.select('svg').remove() - svg = _d3.append('svg') - .attr('width', width + margin.left + margin.right) - .attr('height', height + margin.top + margin.bottom) - .append('g') - .attr('transform', - `translate(${margin.left},${margin.top})`) - - // Add Y axis - const y = d3.scaleLinear() - .domain([ 0, maxH ]) - .range([ height, 0 ]) - svg.append('g') - .call(d3.axisLeft(y)) - - - - svg.append('g') - .selectAll('g') - .data(datam) - .enter().append('rect').classed('shadow', true) - .style('opacity', 0) - .attr('fill', ShadowLight100) - .attr('x', (_d, i) => { - const val = ((maxWBar+gap) * (i)) - return val < 10 ? -800 : val - }) - .attr('y', 0 ) - .attr('width', maxWBar) - .attr('height', height) - - const dotg = svg.append('g').classed('dots', true) - .style('pointer-events', 'none') - .selectAll('g') - - - - dotg.data(datam) - .enter().append('line').classed('line-complete', true) - .attr('stroke', '#FFCC00') - .style('stroke-dasharray', ('6, 4')) - .attr('x1', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('x2', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('y1', d => y(d.startToCompleteMax) ) - .attr('y2', d => y(d.startToCompleteAvg) ) - - - ///YELLOW LINE - dotg.data(datam) - .enter().append('line').classed('line-complete-yellow', true) - .attr('stroke', (_d, ix) => { - const val = ((ix-1) * (maxWBar + gap))+(maxWBar/2) - if (!ix) {return 'transparent'} - if (ix+1 === _d.length) {return 'transparent'} - if (val > (width-20)) {return 'transparent'} - return val < 0 ? 'transparent' : '#FFCC00' - } ) - .attr('x1', (_d, ix) => { - const val = ((ix-1) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('x2', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('y1', (d,i) => { - if (!i) {return 0} - return y (datam[i-1]?.startToCompleteAvg) - // return y (datam[i-1]?.startToCompleteMax) - }) - // .attr("y2", d => y(d.startToCompleteMax) ) - .attr('y2', d => y(d.startToCompleteAvg) ) - - dotg.data(datam) - .enter().append('circle').classed('dot-complete-max', true) - .attr('fill', '#FDBB45') - .attr('stroke', '#FFCC00') - .attr('cx', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('cy', d => y(d.startToCompleteMax) ) - .attr('r',6) - - dotg.data(datam) - .enter().append('circle').classed('dot-complete-avg', true) - .attr('fill', '#FDBB45') - .attr('stroke', '#EDEEF0') - .attr('cx', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('cy', d => y(d.startToCompleteAvg) ) - .attr('r',6) - - - - const xA = svg.append('g').classed('xa',true) - xA.append('line') - .style('stroke', 'white') - .style('stroke-width', 1) - .attr('x1', 0) - .attr('y1', height+1) - .attr('x2', width+(gap*visibleWindows)) - .attr('y2', height+1) - svg.select('.xa').selectAll('line') - .data(groups) - .enter().append('line') - .style('stroke', 'white') - .style('stroke-width', 1) - .attr('x1', (d,ix) => (ix * (maxWBar + gap))-(gap/2) ) - .attr('y1', height+1) - .attr('x2', (_d, ix) => (ix * (maxWBar + gap))-(gap/2) ) - .attr('y2', height+5) - svg.select('.xa').selectAll('text') - .data(groups) - .enter().append('text') - .text( d => d.l1 ) - .attr('text-anchor', 'middle') - .style('fill', 'white') - .style('font-size', '10px') - .attr('x', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('y', height+15) - - if (windowType !== 'DAYS_1'){ - svg.select('.xa').append('g').selectAll('text') - .data(groups) - .enter().append('text').classed('hours',true) - .text( d => d.l2 ) - .attr('text-anchor', 'middle') - .style('fill', 'white') - .style('font-size', '10px') - .attr('x', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('y', height+30) - } - - d3.select('#wf-latency-chart-tooltip').html(updateToolTipContent({},ttTemplate)) - - - - svg.selectAll('.shadow') - .on('mouseover', () => { - d3.select(this).transition() - .ease(d3.easeLinear) - .duration(250) - .style('opacity', 1) - d3.select('#wf-latency-chart-tooltip').style('visibility', 'visible') - }) - .on('mousemove', (e,d) => { - d3.select('#wf-latency-chart-tooltip').html(updateToolTipContent(d,ttTemplate)) - .style('top',`${e.layerY+10}px`) - .style('left',() => { - if (e.layerX > width){ - return `${e.layerX-160}px` - } - return `${e.layerX+10}px` - }) - - }) - .on('mouseout', () => { - d3.select(this).transition() - .ease(d3.easeLinear) - .duration(250) - .style('opacity', 0) - d3.select('#wf-latency-chart-tooltip').style('visibility', 'hidden') - }) - - },[]) - - - const setD3 = useCallback((latencyData:any[], windowType:string) => { - _d3 = d3.select('#wf-latency-chart') - drawChart(latencyData,windowType) - },[ drawChart ]) - - useEffect( () => { - setD3(data, type) - },[ data, setD3, type ]) - - useEffect( () => { - return () => { - _d3.select('svg').remove() - } - },[]) - - return <> -
-
-
-
- -
- -} diff --git a/dashboard/apps/web/components/Charts/LatencyTaskChart.tsx b/dashboard/apps/web/components/Charts/LatencyTaskChart.tsx deleted file mode 100644 index 0c8408a50..000000000 --- a/dashboard/apps/web/components/Charts/LatencyTaskChart.tsx +++ /dev/null @@ -1,378 +0,0 @@ -/* - eslint '@typescript-eslint/no-shadow': 'off' -- disabling as a re work is needed to make it pass -*/ - -import * as d3 from 'd3' -import { useCallback, useEffect } from 'react' -import moment from 'moment' -import { NewScrollBar } from './NewScrollBar' - -const _WIDTH = 1360 - -const ttTemplate=` -
{HEADER}
-
-
Scheduled to Start
-
{A}
-
{B}
-
Start to Finish
-
{C}
-
{D}
-
-` - - -// .range(["#B769E8", '#4D8FD6','#27CBB8', '#E6527F' ]) -const updateToolTipContent = (data:any,template:string) => { - return template - .replace('{HEADER}',moment(data.windowStart).format('MMM DD, HH:00')) - .replace('{A}',`${(data.scheduleToStartAvg ? data.scheduleToStartAvg : 0).toFixed(1)}s` ) - .replace('{B}',`${(data.scheduleToStartMax ? data.scheduleToStartMax : 0).toFixed(1)}s` ) - .replace('{C}',`${(data.startToCompleteAvg ? data.startToCompleteAvg : 0).toFixed(1)}s` ) - .replace('{D}',`${(data.startToCompleteMax ? data.startToCompleteMax : 0).toFixed(1)}s` ) -} - -const margin = { top: 10, right: 30, bottom: 60, left: 50 }, - width = _WIDTH - margin.left - margin.right, - height = 400 - margin.top - margin.bottom -const maxWBar = 74 - -const gap = 8 -const visibleWindows = Math.ceil((width)/(maxWBar+gap)) -const ShadowLight100 = '#3D4149' - -let datam:any[] = [] -let groups:any[] = [] -let _d3:d3.Selection -let svg:d3.Selection - -interface LatencyTaskChartProps { - data:any[] - type:string -} - -export function LatencyTaskChart({ data, type }:LatencyTaskChartProps) { - - - const onMoveScroll = (ix:number) => { - if (!svg) {return null} - const num = (ix+1) - - svg.selectAll('.line-start') - .data(datam) - .attr('x1', (_d, ix) => { - const val = (((ix-(num-1))) * (maxWBar + gap))+(maxWBar/2)-16 - return val < 0 ? -800 : val - } ) - .attr('x2', (_d, ix) => { - const val = (((ix-(num-1))) * (maxWBar + gap))+(maxWBar/2)-16 - return val < 0 ? -800 : val - } ) - svg.selectAll('.line-complete') - .data(groups) - .attr('x1', (_d, ix) => { - const val = (((ix-(num-1))) * (maxWBar + gap))+(maxWBar/2)+16 - return val < 0 ? -800 : val - } ) - .attr('x2', (_d, ix) => { - const val = (((ix-(num-1))) * (maxWBar + gap))+(maxWBar/2)+16 - return val < 0 ? -800 : val - } ) - - svg.selectAll('.dot-start-max') - .data(datam) - .attr('cx', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2)-16 - return val < 0 ? -800 : val - } ) - - svg.selectAll('.dot-start-avg') - .data(datam) - .attr('cx', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2)-16 - return val < 0 ? -800 : val - } ) - svg.selectAll('.dot-complete-max') - .data(datam) - .attr('cx', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2)+16 - return val < 0 ? -800 : val - } ) - svg.selectAll('.dot-complete-avg') - .data(datam) - .attr('cx', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2)+16 - return val < 0 ? -800 : val - } ) - - - svg.select('g.xa').selectAll('text') - .data(groups) - .attr('x', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - svg.selectAll('.hours') - .data(groups) - .attr('x', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - svg.selectAll('.shadow') - .data(datam) - .attr('x', (_d, i) => { - const val = ((maxWBar+gap) * (i-(num-1))) - return val < 0 ? -800 : val - }) - } - - - - const drawChart = useCallback((data:any[], type:string) => { - - - datam = data.map(d => ({ - a:Number(d.data.totalScheduled) || 0, - b:Number(d.data.totalStarted) || 0, - c:Number(d.data.totalCompleted) || 0, - d:Number(d.data.totalErrored) || 0, - windowStart:d.label, - scheduleToStartMax: Number(d.data.scheduleToStartMax) ? Number(d.data.scheduleToStartMax)/1000 : 0, - scheduleToStartAvg: Number(d.data.scheduleToStartAvg) ? Number(d.data.scheduleToStartAvg)/1000 : 0, - startToCompleteMax: Number(d.data.startToCompleteMax) ? Number(d.data.startToCompleteMax)/1000 : 0, - startToCompleteAvg: Number(d.data.startToCompleteAvg) ? Number(d.data.startToCompleteAvg)/1000 : 0 - })) - - - groups = data.map(d => ({ - l1:moment(d.label).format(`MMM DD${type==='DAYS_1' ? '' : ','}`), - l2:moment(d.label).format(`HH:${type==='HOURS_2' ? '00' : 'mm'}`), - })) - - - const he = datam.map(values => Math.max(values.scheduleToStartMax, values.startToCompleteMax)) - let maxH = Math.max(...he) > 9 ? Math.max(...he)+10 : 10 - maxH = maxH * 1.1 - - // const groups = ["1","2","3","4"] - - - // append the svg object to the body of the page - _d3.select('svg').remove() - svg = _d3.append('svg') - .attr('width', width + margin.left + margin.right) - .attr('height', height + margin.top + margin.bottom) - .append('g') - .attr('transform', - `translate(${margin.left},${margin.top})`) - - // Add Y axis - const y = d3.scaleLinear() - .domain([ 0, maxH ]) - .range([ height, 0 ]) - svg.append('g') - .call(d3.axisLeft(y)) - - - - svg.append('g') - .selectAll('g') - .data(datam) - .enter().append('rect').classed('shadow', true) - .style('opacity', 0) - .attr('fill', ShadowLight100) - .attr('x', (_d, i) => { - const val = ((maxWBar+gap) * (i)) - return val < 10 ? -800 : val - }) - .attr('y', 0 ) - .attr('width', maxWBar) - .attr('height', height) - - const dotg = svg.append('g').classed('dots', true) - .style('pointer-events', 'none') - .selectAll('g') - - - - // xA.append("line") - // .style("stroke", "white") - // .style("stroke-width", 1) - // .attr("x1", 0) - // .attr("y1", height+1) - // .attr("x2", width+(gap*visibleWindows)) - // .attr("y2", height+1); - dotg.data(datam) - .enter().append('line').classed('line-start', true) - .attr('stroke', '#FFCC00') - .style('stroke-dasharray', ('6, 4')) - .attr('x1', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2)-16 - return val < 0 ? -800 : val - } ) - .attr('x2', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2)-16 - return val < 0 ? -800 : val - } ) - .attr('y1', d => y(d.scheduleToStartMax) ) - .attr('y2', d => y(d.scheduleToStartAvg) ) - - dotg.data(datam) - .enter().append('line').classed('line-complete', true) - .attr('stroke', '#E6527F') - .style('stroke-dasharray', ('6, 4')) - .attr('x1', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2)+16 - return val < 0 ? -800 : val - } ) - .attr('x2', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2)+16 - return val < 0 ? -800 : val - } ) - .attr('y1', d => y(d.startToCompleteMax) ) - .attr('y2', d => y(d.startToCompleteAvg) ) - - dotg.data(datam) - .enter().append('circle').classed('dot-start-max', true) - .attr('fill', '#FDBB45') - .attr('stroke', '#FFCC00') - .attr('cx', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2)-16 - return val < 0 ? -800 : val - } ) - .attr('cy', d => y(d.scheduleToStartMax) ) - .attr('r',6) - - dotg.data(datam) - .enter().append('circle').classed('dot-start-avg', true) - .attr('fill', '#FDBB45') - .attr('stroke', '#EDEEF0') - .attr('cx', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2)-16 - return val < 0 ? -800 : val - } ) - .attr('cy', d => y(d.scheduleToStartAvg) ) - .attr('r',6) - - dotg.data(datam) - .enter().append('circle').classed('dot-complete-max', true) - .attr('fill', '#E6527F') - .attr('cx', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2)+16 - return val < 0 ? -800 : val - } ) - .attr('cy', d => y(d.startToCompleteMax) ) - .attr('r',6) - - dotg.data(datam) - .enter().append('circle').classed('dot-complete-avg', true) - .attr('fill', '#E6527F') - .attr('stroke', '#EDEEF0') - .attr('cx', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2)+16 - return val < 0 ? -800 : val - } ) - .attr('cy', d => y(d.startToCompleteAvg) ) - .attr('r',6) - - const xA = svg.append('g').classed('xa',true) - xA.append('line') - .style('stroke', 'white') - .style('stroke-width', 1) - .attr('x1', 0) - .attr('y1', height+1) - .attr('x2', width+(gap*visibleWindows)) - .attr('y2', height+1) - svg.select('.xa').selectAll('line') - .data(groups) - .enter().append('line') - .style('stroke', 'white') - .style('stroke-width', 1) - .attr('x1', (d,ix) => (ix * (maxWBar + gap))-(gap/2) ) - .attr('y1', height+1) - .attr('x2', (_d, ix) => (ix * (maxWBar + gap))-(gap/2) ) - .attr('y2', height+5) - svg.select('.xa').selectAll('text') - .data(groups) - .enter().append('text') - .text( d => d.l1 ) - .attr('text-anchor', 'middle') - .style('fill', 'white') - .style('font-size', '10px') - .attr('x', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('y', height+15) - - if (type !== 'DAYS_1'){ - svg.select('.xa').append('g').selectAll('text') - .data(groups) - .enter().append('text').classed('hours',true) - .text( d => d.l2 ) - .attr('text-anchor', 'middle') - .style('fill', 'white') - .style('font-size', '10px') - .attr('x', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('y', height+30) - } - - d3.select('#latency-chart-tooltip').html(updateToolTipContent({},ttTemplate)) - - - - svg.selectAll('.shadow') - .on('mouseover', () => { - d3.select(this).transition() - .ease(d3.easeLinear) - .duration(150) - .style('opacity', 1) - d3.select('#latency-chart-tooltip').style('visibility', 'visible') - }) - .on('mousemove', (e,d) => { - d3.select('#latency-chart-tooltip').html(updateToolTipContent(d,ttTemplate)) - .style('top',`${e.layerY+10}px`) - .style('left',() => { - if (e.layerX > width){ - return `${e.layerX-160}px` - } - return `${e.layerX+10}px` - }) - - }) - .on('mouseout', () => { - d3.select(this).transition() - .ease(d3.easeLinear) - .duration(150) - .style('opacity', 0) - d3.select('#latency-chart-tooltip').style('visibility', 'hidden') - }) - - },[]) - - const setD3 = useCallback((data:any[], type:string) => { - _d3 = d3.select('#latency-chart') - drawChart(data,type) - },[ drawChart ]) - - useEffect( () => { - setD3(data, type) - },[ data, setD3, type ]) - - useEffect( () => { - return () => { - _d3.select('svg').remove() - } - },[]) - return <> -
-
-
-
- -
- -} diff --git a/dashboard/apps/web/components/Charts/NewScrollBar.tsx b/dashboard/apps/web/components/Charts/NewScrollBar.tsx deleted file mode 100644 index 8b4861a77..000000000 --- a/dashboard/apps/web/components/Charts/NewScrollBar.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from 'react' - -/* - eslint-disable-next-line @typescript-eslint/no-empty-function - */ -export function NewScrollBar({ width=1000, windows=3, onChange=() => {} }:{ - width:number, - windows:number, - onChange?:(win:number) => void -}) { - - const scrollTrackRef = useRef(null) - const scrollThumbRef = useRef(null) - const [ thumbWidth, setThumbWidth ] = useState(0) - const [ thumbLeftP, setThumbLeftP ] = useState(0) - const [ initialThumbLeft, setInitialThumbLeft ] = useState(0) - const [ win, setWin ] = useState(0) - const [ scrollStartPosition, setScrollStartPosition ] = useState( - null - ) - const [ isDragging, setIsDragging ] = useState(false) - - // eslint-disable-next-line react/hook-use-state -- seems is not used, analyze it further https://littlehorse.atlassian.net/browse/LH-236 - const [ _, setPercent ] = useState(0) - - useEffect( () => { - const factor = thumbLeftP/(width-thumbWidth) - const calculatedPercent = Math.ceil((thumbLeftP*100)/(width-thumbWidth)) - setPercent(calculatedPercent) - const windowsRecalculateFactor = Math.floor(windows*(factor))+1 - setWin(windowsRecalculateFactor > windows ? windows : windowsRecalculateFactor) - },[ thumbLeftP ]) - - useEffect( () => { - onChange(win || 1) - },[ win ]) - useEffect( () => { - let tW = width/windows - tW = tW < 30 ? 30 : tW - setThumbWidth(tW) - const max = width-tW - setThumbLeftP(max) - },[ width,windows ]) - - const handleTrackClick = useCallback( - (e:any) => { - e.preventDefault() - e.stopPropagation() - const { current: trackCurrent } = scrollTrackRef - if (trackCurrent) { - const { clientX } = e - const rect = trackCurrent.getBoundingClientRect() - const thumbOffset = -(thumbWidth / 2) - const newPositionL = clientX-rect.x+thumbOffset - setThumbLeftP(limit(newPositionL)) - } - }, - [ thumbWidth ] - ) - - const limit = (value:number) => { - - const max = width-thumbWidth - const val = value > max ? max :value - return val < 0 ? 0 : val - } - - const handleThumbMousedown = useCallback((e:any) => { - e.preventDefault() - e.stopPropagation() - setScrollStartPosition(e.clientX) - if (scrollThumbRef.current) {setInitialThumbLeft(parseInt(scrollThumbRef.current?.style.left || '0px', 10))} - setIsDragging(true) - }, []) - - const handleThumbMouseup = useCallback( - (e:any) => { - e.preventDefault() - e.stopPropagation() - if (isDragging) { - setIsDragging(false) - } - }, - [ isDragging ] - ) - const handleThumbMousemove = useCallback( - (e:any) => { - e.preventDefault() - e.stopPropagation() - if (isDragging) { - if (scrollStartPosition){ - const deltaY = (initialThumbLeft) + (e.clientX - scrollStartPosition) - setThumbLeftP(limit(deltaY)) - } - } - }, - [ isDragging, scrollStartPosition, thumbWidth ] - ) - - // Listen for mouse events to handle scrolling by dragging the thumb - useEffect(() => { - document.addEventListener('mousemove', handleThumbMousemove) - document.addEventListener('mouseup', handleThumbMouseup) - document.addEventListener('mouseleave', handleThumbMouseup) - return () => { - document.removeEventListener('mousemove', handleThumbMousemove) - document.removeEventListener('mouseup', handleThumbMouseup) - document.removeEventListener('mouseleave', handleThumbMouseup) - } - }, [ handleThumbMousemove, handleThumbMouseup ]) - - return
- -
-
-
- {/* {percent}% window:{win} */} -
-
-
-} diff --git a/dashboard/apps/web/components/Charts/TaskChart.tsx b/dashboard/apps/web/components/Charts/TaskChart.tsx deleted file mode 100644 index c984d2e15..000000000 --- a/dashboard/apps/web/components/Charts/TaskChart.tsx +++ /dev/null @@ -1,293 +0,0 @@ -/* - eslint '@typescript-eslint/no-shadow': 'off' -- disabling as a re work is needed to make it pass -*/ - -import * as d3 from 'd3' -import { useCallback, useEffect } from 'react' -import moment from 'moment' -import { NewScrollBar } from './NewScrollBar' - -const _WIDTH = 1360 - -const ttTemplate=` -
{HEADER}
-
-
{A}
-
{B}
-
{C}
-
{D}
-
-` - -// .range(["#B769E8", '#4D8FD6','#27CBB8', '#E6527F' ]) -const updateToolTipContent = (data:any,template:string, type:string) => { - return template - .replace('{HEADER}',moment(data.windowStart).format(`MMM DD${type === 'DAYS_1' ? '' : `, HH:${type==='HOURS_2' ? '00' : 'mm'}`}`)) - .replace('{A}',data.a) - .replace('{B}',data.b) - .replace('{C}',data.c) - .replace('{D}',data.d) -} - -const margin = { top: 10, right: 30, bottom: 60, left: 50 }, - width = _WIDTH - margin.left - margin.right, - height = 400 - margin.top - margin.bottom -const maxWBar = 74 -const minYAxisValue = 10 -const gap = 8 -const visibleWindows = Math.ceil((width)/(maxWBar+gap)) -const ShadowLight100 = '#3D4149' - -let _d3:d3.Selection -let svg:d3.Selection -let datam:any[] = [] -let stack:any -let groups:any[] = [] - -interface TaskChartProps { - data:any[] - type:string -} - -export function TaskChart({ data, type }:TaskChartProps) { - - const onMoveScroll = (ix:number) => { - if (!svg) {return false} - // console.log('ix',ix) - // d3.select(".rangeInput") - // .property("value",ix+1); - - const num = (ix+1) - // console.log('num', num) - svg.selectAll('g.bar') - .data(stack) - .selectAll('rect') - .data((d:any) => d ) - .attr('x',(_d, ix) => { - const val = ((maxWBar+gap) * (ix-(num-1))) - return val < 0 ? -800 : val - }) - - svg.select('g.xa').selectAll('text') - .data(groups) - .attr('x', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - svg.selectAll('.hours') - .data(groups) - .attr('x', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - svg.selectAll('.shadow') - .data(datam) - .attr('x', (_d, i) => { - const val = ((maxWBar+gap) * (i-(num-1))) - return val < 0 ? -800 : val - }) - - } - - - const drawChart = useCallback((data:any[], type:string) => { - - datam = data.map(d => ({ - a:Number(d.data.totalScheduled) || 0, - b:Number(d.data.totalStarted) || 0, - c:Number(d.data.totalCompleted) || 0, - d:Number(d.data.totalErrored) || 0, - windowStart:d.label - })) - - groups = data.map(d => ({ - l1:moment(d.label).format(`MMM DD${type==='DAYS_1' ? '' : ','}`), - l2:moment(d.label).format(`HH:${type==='HOURS_2' ? '00' : 'mm'}`), - })) - - - const he = datam.map((values:any) => values.a +values.b + values.c + values.d) - const maxH = Math.max(...he) > (minYAxisValue*.9) ? Math.max(...he)+(minYAxisValue*.1) : minYAxisValue - - // append the svg object to the body of the page - _d3.select('svg').remove() - svg = _d3.append('svg') - .attr('width', width + margin.left + margin.right) - .attr('height', height + margin.top + margin.bottom) - .append('g') - .attr('transform', - `translate(${margin.left},${margin.top})`) - - // Add Y axis - const y = d3.scaleLinear() - .domain([ 0, maxH ]) - .range([ height, 0 ]) - svg.append('g') - .call(d3.axisLeft(y)) - - // X axis - - // const x = d3.scaleBand() - // .domain(groups) - // .range([0, width]) - // .padding(gap/100) - - // const x = d3.scaleLinear() - // .domain(groups) - // .range([0, width]) - - - - // color palette = one color per subgroup - const color = d3.scaleOrdinal() - .domain([ 'a', 'b', 'c', 'd' ]) - .range([ '#B769E8', '#4D8FD6','#27CBB8', '#E6527F' ]) - - const stackedData = d3.stack() - .keys([ 'a', 'b', 'c', 'd' ]) - .order(d3.stackOrderNone) - .offset(d3.stackOffsetNone) - - stack = stackedData(datam) - - svg.append('g') - .selectAll('g') - .data(datam) - .enter().append('rect').classed('shadow', true) - .style('opacity', 0) - .attr('fill', ShadowLight100) - .attr('x', (_d, i) => { - const val = ((maxWBar+gap) * (i)) - return val < 0 ? -800 : val - }) - .attr('y', 0 ) - .attr('width', maxWBar) - .attr('height', height) - - svg.append('g').classed('bars', true) - .style('pointer-events', 'none') - .selectAll('g') - .data(stack) - .enter().append('g').classed('bar', true) - .style('pointer-events', 'none') - .attr('fill', (d:any) => String(color(d.key)) ) - .selectAll('rect') - - // enter a second time = loop subgroup per subgroup to add all rectangles - .data((d:any) => d ) - .enter().append('rect') - // .attr("x", (_d, i) => ((maxWBar+gap) * (i-(windows-visibleWindows))) || 0 ) - .attr('x',(_d, ix) => { - const val = ((maxWBar+gap) * (ix)) - return val < 0 ? -800 : val - }) - .attr('y', (d:any) => y(d[1]) ) - .attr('width', maxWBar) - .attr('height', (d:any) => y(d[0]) - y(d[1]) ) - - const xA = svg.append('g').classed('xa',true) - xA.append('line') - .style('stroke', 'white') - .style('stroke-width', 1) - .attr('x1', 0) - .attr('y1', height+1) - .attr('x2', width+(gap*visibleWindows)) - .attr('y2', height+1) - svg.select('.xa').selectAll('line') - .data(groups) - .enter().append('line') - .style('stroke', 'white') - .style('stroke-width', 1) - .attr('x1', (d,ix) => (ix * (maxWBar + gap))-(gap/2) ) - .attr('y1', height+1) - .attr('x2', (_d, ix) => (ix * (maxWBar + gap))-(gap/2) ) - .attr('y2', height+5) - svg.select('.xa').selectAll('text') - .data(groups) - .enter().append('text') - .text( d => d.l1 ) - .attr('text-anchor', 'middle') - .style('fill', 'white') - .style('font-size', '10px') - .attr('x', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('y', height+15) - - if (type !== 'DAYS_1'){ - svg.select('.xa').append('g').selectAll('text') - .data(groups) - .enter().append('text').classed('hours',true) - .text( d => d.l2 ) - .attr('text-anchor', 'middle') - .style('fill', 'white') - .style('font-size', '10px') - .attr('x', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('y', height+30) - } - - - d3.select('#task-chart-tooltip').html(updateToolTipContent({},ttTemplate, type)) - - - - svg.selectAll('.shadow') - - .on('mouseover', () => { - d3.select(this).transition() - .ease(d3.easeLinear) - .duration(150) - .style('opacity', 1) - d3.select('#task-chart-tooltip').style('visibility', 'visible') - }) - .on('mousemove', (e,d) => { - d3.select('#task-chart-tooltip').html(updateToolTipContent(d,ttTemplate, type)) - .style('top',`${e.layerY+10}px`) - .style('left',() => { - if (e.layerX > width){ - return `${e.layerX-160}px` - } - return `${e.layerX+10}px` - }) - }) - .on('mouseout', () => { - d3.select(this).transition() - .ease(d3.easeLinear) - .duration(150) - .style('opacity', 0) - d3.select('#task-chart-tooltip').style('visibility', 'hidden') - }) - - },[]) - - - const setD3 = useCallback((data:any[], type:string) => { - _d3 = d3.select('#task-chart') - drawChart(data,type) - },[ drawChart ]) - - useEffect( () => { - setD3(data, type) - },[ data, setD3, type ]) - - useEffect( () => { - return () => { - _d3.select('svg').remove() - } - },[]) - - return <> - -
-
-
-
- -
- - -} diff --git a/dashboard/apps/web/components/Charts/WorkflowsChart.tsx b/dashboard/apps/web/components/Charts/WorkflowsChart.tsx deleted file mode 100644 index f599748ed..000000000 --- a/dashboard/apps/web/components/Charts/WorkflowsChart.tsx +++ /dev/null @@ -1,333 +0,0 @@ -/* - eslint '@typescript-eslint/no-shadow': 'off' -- disabling as a re work is needed to make it pass -*/ - -import * as d3 from 'd3' -import { useCallback, useEffect } from 'react' -import moment from 'moment' -import { NewScrollBar } from './NewScrollBar' - -const _WIDTH = 1360 - -const ttTemplate=` -
{HEADER}
-
-
{B}
-
{C}
-
{D}
-
-` - -// .range(["#B769E8", '#4D8FD6','#27CBB8', '#E6527F' ]) -const updateToolTipContent = (data:any,template:string) => { - return template - .replace('{HEADER}',moment(data.windowStart).format('MMM DD, HH:00')) - .replace('{A}',data.a) - .replace('{B}',data.b) - .replace('{C}',data.c) - .replace('{D}',data.d) -} - -const margin = { top: 10, right: 30, bottom: 60, left: 50 }, - width = _WIDTH - margin.left - margin.right, - height = 400 - margin.top - margin.bottom -const maxWBar = 74 -const gap = 8 -const minYAxisValue = 11 -const visibleWindows = Math.ceil((width)/(maxWBar+gap)) -const ShadowLight100 = '#3D4149' - -let _d3:d3.Selection -let svg:d3.Selection -let datam:any[] = [] -let stack:any -let groups:any[] = [] - -interface WorkflowsChartProps { - data:any[] - type:string -} - -export function WorkflowsChart({ data, type }:WorkflowsChartProps) { - - - const onMoveScroll = (ix:number) => { - if (!svg) {return null} - // console.log('ix',ix) - // d3.select(".rangeInput") - // .property("value",ix+1); - - const num = (ix+1) - // console.log('num', num) - svg.selectAll('g.bar') - .data(stack) - .selectAll('rect') - .data((d:any) => d ) - .attr('x',(_d, ix) => { - const val = ((maxWBar+gap) * (ix-(num-1))) - return val < 0 ? -800 : val - }) - - svg.select('g.xa').selectAll('text') - .data(groups) - .attr('x', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - svg.selectAll('.hours') - .data(groups) - .attr('x', (_d, ix) => { - const val = ((ix-(num-1)) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - svg.selectAll('.shadow') - .data(datam) - .attr('x', (_d, i) => { - const val = ((maxWBar+gap) * (i-(num-1))) - return val < 0 ? -800 : val - }) - - } - // set the dimensions and margins of the graph - - // console.log('visibleWindows', visibleWindows) - - - - // const firstWindowDt = lastWindowStart.clone().subtract(windows * 2,'hours') - // console.log('lastWindowStart',lastWindowStart.format()) - // console.log('firstWindowDt',firstWindowDt.format()) - - const drawChart = useCallback((data:any[], type:string) => { - - datam = data.map(d => ({ - a:Number(d.data.totalScheduled) || 0, - b:Number(d.data.totalStarted) || 0, - c:Number(d.data.totalCompleted) || 0, - d:Number(d.data.totalErrored) || 0, - windowStart:d.label - })) - // console.log('values',values) - // var data = values.reverse(); - - // data = data.slice(-visibleWindows) - - // let groups = dates.reverse() - - // let groups = dates.reverse() - groups = data.map(d => ({ - l1:moment(d.label).format(`MMM DD${type==='DAYS_1' ? '' : ','}`), - l2:moment(d.label).format(`HH:${type==='HOURS_2' ? '00' : 'mm'}`), - })) - // console.log(datam) - // console.log(groups) - // groups = groups.slice(-visibleWindows) - - const he = datam.map((values:any) => values.a +values.b + values.c + values.d) - const maxH = Math.max(...he) > (minYAxisValue*.9) ? Math.max(...he)+(minYAxisValue*.1) : minYAxisValue - - // const groups = ["1","2","3","4"] - - // d3.select(".rangeInput") - // .property("min", 1) - // .property("max", windows-visibleWindows+1) - // // .property("value",windows-visibleWindows+1); - // .property("value",1); - - // append the svg object to the body of the page - _d3.select('svg').remove() - svg = _d3.append('svg') - .attr('width', width + margin.left + margin.right) - .attr('height', height + margin.top + margin.bottom) - .append('g') - .attr('transform', - `translate(${margin.left},${margin.top})`) - - // Add Y axis - const y = d3.scaleLinear() - .domain([ 0, maxH ]) - .range([ height, 0 ]) - svg.append('g') - .call(d3.axisLeft(y).ticks(6)) - - d3.select('.domain').remove() - // d3.selectAll('.tick').attr('transform','traslate(0)') - d3.selectAll('.tick').selectAll('line').remove() - d3.selectAll('.tick').selectAll('text') - .attr('fill','#9098A0') - .style('font-size', '12px') - .style('font-family', 'Inter') - .attr('dy','-0.5em') - .attr('x','-4em') - .attr('text-anchor','start') - d3.selectAll('.tick').append('line') - .attr('x1','-4em') - .attr('x2',width+25).attr('stroke','#3D4149') - // .call(d3.axisLeft(y).tickSize(width)) - - // X axis - - // const x = d3.scaleBand() - // .domain(groups) - // .range([0, width]) - // .padding(gap/100) - - // const x = d3.scaleLinear() - // .domain(groups) - // .range([0, width]) - - - - // color palette = one color per subgroup - const color = d3.scaleOrdinal() - .domain([ 'a', 'b', 'c', 'd' ]) - .range([ '#B769E8', '#4D8FD6','#27CBB8', '#E6527F' ]) - - const stackedData = d3.stack() - .keys([ 'a', 'b', 'c', 'd' ]) - .order(d3.stackOrderNone) - .offset(d3.stackOffsetNone) - - stack = stackedData(datam) - - svg.append('g') - .selectAll('g') - .data(datam) - .enter().append('rect').classed('shadow', true) - .style('opacity', 0) - .attr('fill', ShadowLight100) - .attr('x', (_d, i) => { - const val = ((maxWBar+gap) * (i)) - return val < 0 ? -800 : val - }) - .attr('y', 0 ) - .attr('width', maxWBar) - .attr('height', height) - - svg.append('g').classed('bars', true) - .style('pointer-events', 'none') - .selectAll('g') - .data(stack) - .enter().append('g').classed('bar', true) - .style('pointer-events', 'none') - .attr('fill', (d:any) => String(color(d.key)) ) - .selectAll('rect') - - // enter a second time = loop subgroup per subgroup to add all rectangles - .data((d:any) => d ) - .enter().append('rect') - // .attr("x", (_d, i) => ((maxWBar+gap) * (i-(windows-visibleWindows))) || 0 ) - .attr('x',(_d, ix) => { - const val = ((maxWBar+gap) * (ix)) - return val < 0 ? -800 : val - }) - .attr('y', (d:any) => y(d[1]) ) - .attr('width', maxWBar) - .attr('height', (d:any) => y(d[0]) - y(d[1]) ) - - // const xA = svg.append('g').classed('xa',true) - // xA.append("line") - // .style("stroke", "white") - // .style("stroke-width", 1) - // .attr("x1", 0) - // .attr("y1", height+1) - // .attr("x2", width+(gap*visibleWindows)) - // .attr("y2", height+1); - // svg.select(".xa").selectAll("line") - // .data(groups) - // .enter().append("line") - // .style("stroke", "white") - // .style("stroke-width", 1) - // .attr("x1", (d,ix) => (ix * (maxWBar + gap))-(gap/2) ) - // .attr("y1", height+1) - // .attr("x2", (_d, ix) => (ix * (maxWBar + gap))-(gap/2) ) - // .attr("y2", height+5); - svg.select('.xa').selectAll('text') - .data(groups) - .enter().append('text') - .text( d => d.l1 ) - .attr('text-anchor', 'middle') - .style('fill', '#9098A0') - .style('font-size', '12px') - .style('font-family', 'Inter') - .attr('x', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('y', height+18) - - if (type !== 'DAYS_1'){ - svg.select('.xa').append('g').selectAll('text') - .data(groups) - .enter().append('text').classed('hours',true) - .text( d => d.l2 ) - .attr('text-anchor', 'middle') - .style('fill', 'white') - .style('font-size', '12px') - .style('font-family', 'Inter') - .attr('x', (_d, ix) => { - const val = ((ix) * (maxWBar + gap))+(maxWBar/2) - return val < 0 ? -800 : val - } ) - .attr('y', height+35) - } - - - d3.select('#workflows-chart-tooltip').html(updateToolTipContent({},ttTemplate)) - - - - svg.selectAll('.shadow') - .on('mouseover', () => { - d3.select(this).transition() - .ease(d3.easeLinear) - .duration(150) - .style('opacity', 1) - d3.select('#workflows-chart-tooltip').style('visibility', 'visible') - }) - .on('mousemove', (e,d) => { - d3.select('#workflows-chart-tooltip').html(updateToolTipContent(d,ttTemplate)) - .style('top',`${e.layerY+10}px`) - .style('left',() => { - if (e.layerX > width){ - return `${e.layerX-160}px` - } - return `${e.layerX+10}px` - }) - - }) - .on('mouseout', () => { - d3.select(this).transition() - .ease(d3.easeLinear) - .duration(150) - .style('opacity', 0) - d3.select('#workflows-chart-tooltip').style('visibility', 'hidden') - }) - - - },[]) - - const setD3 = useCallback((data:any[], type:string) => { - _d3 = d3.select('#workflows-chart') - drawChart(data,type) - },[ drawChart ]) - - useEffect( () => { - setD3(data, type) - },[ data, setD3, type ]) - - useEffect( () => { - return () => { - _d3.select('svg').remove() - } - },[]) - - return <> -
-
-
-
- -
- -} diff --git a/dashboard/apps/web/components/CheckSession.tsx b/dashboard/apps/web/components/CheckSession.tsx deleted file mode 100644 index e2da3f624..000000000 --- a/dashboard/apps/web/components/CheckSession.tsx +++ /dev/null @@ -1,53 +0,0 @@ -'use client' - -import { useSession } from 'next-auth/react' -import { Loader } from 'ui' -import { LoginPage } from '../app/(auth)/signin/LoginPage' -import { useEffect, useState } from 'react' -import type { SessionWithJWTExpireTime } from '../pages/api/auth/[...nextauth]' -import { useFeatureToggle } from '../contexts/FeatureToggleContext' - - -interface CheckSessionProps { - children?: React.ReactNode; -} - -export function CheckSession({ children }: CheckSessionProps) { - const { data: session } = useSession() - const [ sessionIsActive, setSessionIsActive ] = useState(false) - const isAuthenticationEnabled = useFeatureToggle('isAuthenticationEnabled') - - useEffect(() => { - if (isAuthenticationEnabled) { - if (!session) { - setSessionIsActive(false) - } else { - const tokenExpireTime = (session as unknown as SessionWithJWTExpireTime).expireTime - const tokenHasExpired = new Date() > new Date(tokenExpireTime * 1000) - - if (tokenHasExpired) { - setSessionIsActive(false) - } else { - setSessionIsActive(true) - } - } - } - }, [ session ]) - - - if (isAuthenticationEnabled) { - if (sessionIsActive) { - return <> - {children} - - } - if (!sessionIsActive) { - return - } - return - } - - return <> - {children} - -} diff --git a/dashboard/apps/web/components/Drawer/Drawer.tsx b/dashboard/apps/web/components/Drawer/Drawer.tsx deleted file mode 100644 index 2172e958e..000000000 --- a/dashboard/apps/web/components/Drawer/Drawer.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react' - -interface DrawerProps { - title: string; - children?: React.ReactNode; -} - -export function Drawer(props: DrawerProps) { - return ( -
-
-

{props.title}

-
- {props.children} -
- ) -} diff --git a/dashboard/apps/web/components/Drawer/DrawerComponent.tsx b/dashboard/apps/web/components/Drawer/DrawerComponent.tsx deleted file mode 100644 index a22bd6981..000000000 --- a/dashboard/apps/web/components/Drawer/DrawerComponent.tsx +++ /dev/null @@ -1,515 +0,0 @@ -import React, { useEffect, useState } from 'react' -import type { Node } from 'reactflow' -import type { ReactFlowNodeWithLHInfo } from '../../app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter' -import { NOPInformation } from './internals/NOPInformation' -import { ExternalEventInformation } from './internals/ExternalEventInformation' -import { SpawnChildInformation } from './internals/SpawnChildInformation' -import { parseKey } from './internals/drawerInternals' -import WfVariable from './WfVariable' -import { SleepNodeInformation } from './internals/SleepNodeInformation' -import { UserTaskNodeInformation } from './internals/UserTaskNodeInformation' -import { WaitForThreadsInformation } from './internals/WaitForThreadsInformation' -import { TaskInformation } from './internals/TaskInformation' -import ThreadRunsHandler from './internals/ThreadRunsHandler' -import type { ThreadVarDef } from '../../littlehorse-public-api/wf_spec' - -export interface ThreadRunNameWithRunNumber { - threadSpecName: string, - threadRunNumber: number -} -interface DrawerComponentProps { - isWFRun: boolean - internalComponent?: string | undefined; - data?: any; - graphLayout: any; - nodeName: string; - wfRunId?: string; - setToggleSideBar: (value: boolean) => void; - setCode: (code: string) => void; - setLanguage: (language: string) => void; - setError: (value: boolean) => void; - setThread: (threadRunNameWithRunNumber: ThreadRunNameWithRunNumber) => void; - run?: any; - runs?: any[]; - selectedNode?: ReactFlowNodeWithLHInfo -} - -const DEFAULT_THREAD_SPEC_NAME = 'entrypoint' - -const DEFAULT_THREAD_RUN_NUMBER = 0 - -export function DrawerComponent(props: DrawerComponentProps) { - const [ currentRun, setCurrentRun ] = useState(props.run) - const [ taskType, setTaskType ] = useState('') - const [ rawData, setRawData ] = useState() - const [ wfRunRawData, setWfRunRawData ] = useState() - const [ selectedNodeData, setSelectedNodeData ] = useState() - const [ threadSpecVariableDefs, setThreadSpecVariableDefs ] = - useState() - const [ selectedNode, setSelectedNode ] = useState() - const [ wfRunData, setWfRunData ] = useState() - const [ errorData, setErrorData ] = useState([]) - const [ lastSelectedNode, setLastSelectedNode ] = useState() - const [ threadName, setThreadName ] = useState() - const [ threadRunInfoValue, setThreadRunInfoValue ] = useState() - - const setThreadHandler = (thread: string) => { - const threadRunInfo = JSON.parse(thread) - if (currentRun !== undefined) { - setThreadName(threadRunInfo.threadSpecName) - } - props.setThread({ threadSpecName: threadRunInfo.threadSpecName, threadRunNumber: threadRunInfo.number }) - setCurrentRun(props.runs?.find(r => r.threadSpecName === threadRunInfo.threadSpecName && r.number === threadRunInfo.number)) - setTaskType('') - } - - useEffect(() => { - setThreadHandler(threadRunInfoValue ? threadRunInfoValue : ThreadRunsHandler.buildThreadRunInfo(DEFAULT_THREAD_RUN_NUMBER, DEFAULT_THREAD_SPEC_NAME)) - }, [ threadRunInfoValue ]) - - const getErrorData: any = (node: any, key: string) => { - if (node) { - const logs = 'task' in node ? node.task.logOutput : null - const data = node[key].map((element: any) => { - return { - ...element, - log: logs, - } - }) - - setErrorData(data) - } else { - setErrorData([]) - } - } - - useEffect(() => { - if (props.wfRunId && wfRunRawData === undefined) { - const fetchWfRun = async () => { - const response = await fetch(`../../api/drawer/wfRun/${props.wfRunId}`) - - if (response.ok) { - response.json().then(result => { - setWfRunRawData(result.results) - }) - - } else { - console.error('Error on API while getting wfRun') - } - } - - fetchWfRun() - } - - if (props.data) { - setThreadSpecVariableDefs( - (threadName && props.data?.threadSpecs) ? props.data?.threadSpecs[threadName].variableDefs : [] - ) - - if (props.nodeName !== lastSelectedNode) { - setLastSelectedNode(props.nodeName) - setSelectedNodeData(undefined) - setWfRunData(undefined) - setSelectedNode( - props.data.threadSpecs[threadName || DEFAULT_THREAD_SPEC_NAME].nodes[ - props.nodeName - ] - ) - if (props.wfRunId) { - const wfRunNode = wfRunRawData.find( - (element: any) => element.nodeName === props.nodeName - ) - - if (wfRunNode) { - getErrorData(wfRunNode, 'failures') - } else { - setErrorData([]) - } - } else { - getErrorData( - props.data.threadSpecs[threadName || DEFAULT_THREAD_SPEC_NAME].nodes[ - props.nodeName - ], - 'failureHandlers' - ) - } - } - - const processComplexData = { - task: () => { - if (rawData === undefined) { - (async ( - url: string, - name: string, - handler: (data: any) => void - ) => { - const response = await fetch(url + name) - - if (response.ok) { - const content = await response.json() - handler(content.data) - } else { - console.error('INVALID RESPONSE FROM API') - } - })( - '../../api/drawer/taskDef/', - selectedNode?.task.taskDefId.name, - setRawData - ) - } else { - const processedData = rawData.inputVars.map( - ( - element: { name: string; type: string; _: any }, - index: number - ) => { - const currentVariable = selectedNode?.task.variables[index] - - const variableName = currentVariable?.variableName - - const jsonPath = currentVariable?.jsonPath?.replace('$', '') - - if (jsonPath) {variableName?.concat(jsonPath)} - - return { - name: element.name, - type: element.type, - variableName, - } - } - ) - - if (props.wfRunId && wfRunRawData) { - const wfRunNode = wfRunRawData.find( - (element: any) => element.nodeName === props.nodeName - ) - - if (wfRunNode && props.internalComponent) { - const data = - wfRunNode[props.internalComponent as keyof typeof wfRunNode] - if (data) { - const inputs = (data)?.inputVariables?.map( - (element: any, index: number) => { - const variableType: string = element.value.type - const correctKey = parseKey(variableType) || '' - const value = element.value[correctKey] || '' - - processedData[index].value = value - - return { - name: element.varName, - type: element.value.type, - value, - } - } - ) - - const outputs = (data)?.inputVariables?.map( - (element: any) => { - const variableType: string = element.value.type - const correctKey = parseKey(variableType) || '' - const value = element.value[correctKey] || '' - - return { - type: element.value.type, - value, - } - } - ) - - const wfRunComplexData = { - nodeData: { - reachTime: wfRunNode.arrivalTime || '', - completionTime: wfRunNode.endTime || '', - status: wfRunNode.status, - }, - inputs, - outputs, - } - - setWfRunData(wfRunComplexData) - } - } - } - - setSelectedNodeData(processedData) - } - }, - externalEvent: () => { - if (props.wfRunId && wfRunRawData) { - const wfRunNode = wfRunRawData.find( - (element: any) => element.nodeName === props.nodeName - ) - - if (wfRunNode && props.internalComponent) { - const data = wfRunNode[ - props.internalComponent as keyof typeof wfRunNode - ] as { - externalEventDefName: string; - eventTime: string; - externalEventId: { - wfRunId: string; - externalEventDefName: string; - guid: string; - }; - } - - if (data) { - const wfRunComplexData = { - nodeData: { - reachTime: wfRunNode.arrivalTime || '', - completionTime: wfRunNode.endTime || '', - status: wfRunNode.status, - }, - guid: data.externalEventId?.guid || '', - arrivedTime: data?.eventTime || '', - arrived: data.eventTime ? 'YES' : 'NO', - } - - setWfRunData(wfRunComplexData) - } - } - } - }, - nop_def: () => { - setSelectedNodeData(selectedNode?.outgoingEdges) - }, - startThread: () => { - if (props.wfRunId && wfRunRawData) { - const wfRunNode = wfRunRawData.find( - (element: any) => element.nodeName === props.nodeName - ) - - if (wfRunNode && props.internalComponent) { - const data = wfRunNode[ - props.internalComponent as keyof typeof wfRunNode - ] as { - externalEventDefName: string; - eventTime: string; - } - - if (data) { - const wfRunComplexData = { - nodeData: { - reachTime: wfRunNode.arrivalTime || '', - completionTime: wfRunNode.endTime || '', - status: wfRunNode.status, - }, - } - - setWfRunData(wfRunComplexData) - } - } - } - }, - } - - if (props.internalComponent) { - const complexData = - processComplexData[ - props.internalComponent as keyof typeof processComplexData - ] - - if (complexData instanceof Function) {complexData()} - } - } - }, [ - props.data, - rawData, - wfRunRawData, - selectedNode, - props.nodeName, - props.internalComponent, - threadName - ]) - - useEffect(() => { - if (!props?.nodeName) { - setTaskType('') - } else { - setTaskType(props.nodeName.split('-').reverse()[0]) - } - }, [ props.nodeName ]) - - useEffect(() => { - setCurrentRun(props.run) - setThreadName(props.run?.threadSpecName) - setThreadSpecVariableDefs(props.run?.variableDefs) - }, [ props.run ]) - - const setToggleSideBar = ( - value: boolean, - isError: boolean, - code: string, - language?: string - ) => { - props.setToggleSideBar(value) - if ( - language === undefined || - language === 'jsonObj' || - language === 'jsonArr' - ) { - props.setCode(JSON.parse(code)) - return - } - props.setCode(code) - props.setLanguage(language) - props.setError(isError) - } - - const findNodeByProvidedNodeName = () => { - return props.graphLayout.nodes.find((node: Node) => node.id === props.nodeName) - } - const getThreadRunName = (number: number, threadSpecName: string) => { - return `${number}-${threadSpecName}` - } - - return ( -
- {/*
{threadName &&  props.data.threadSpecs && JSON.stringify(props.data.threadSpecs[threadName].variableDefs, null,2)}
*/} - {/*
{JSON.stringify(props.data, null,2)}
*/} -
-

THREADRUN

-
- -
-

TYPE

-
-
{currentRun?.type}
-
-
- -
-
ThreadRun Variables
-
-

NAME

-

TYPE

- {currentRun ?

VALUE

: null} -
- {(threadSpecVariableDefs !== undefined && threadSpecVariableDefs.length > 0) ? - threadSpecVariableDefs.map((threadSpecVarDef, index) => { - return ( - threadSpecVarDef.varDef && - // eslint-disable-next-line react/no-array-index-key -- we are using the name + index -
- -
- ) - }) : - ( -
- No Variables were found -
- ) - } -
- - - {/* {props.internalComponent === "task" && ( - - )} */} - {props.internalComponent === 'nop_def' && ( - - )} - - {props.internalComponent === 'startThread' && ( - - )} - - {taskType === 'TASK' ? - : ''} - - {taskType === 'WAIT_FOR_THREADS' ? - : ''} - {taskType === 'EXTERNAL_EVENT' ? - : ''} - {taskType === 'SLEEP' ? - : ''} - {taskType === 'USER_TASK' ? - : ''} -
- ) -} diff --git a/dashboard/apps/web/components/Drawer/WfSpecDrawerComponent.tsx b/dashboard/apps/web/components/Drawer/WfSpecDrawerComponent.tsx deleted file mode 100644 index 9b4c1f9b3..000000000 --- a/dashboard/apps/web/components/Drawer/WfSpecDrawerComponent.tsx +++ /dev/null @@ -1,315 +0,0 @@ -import React, { useEffect, useState } from 'react' -import type { Node } from 'reactflow' -import { NOPInformation } from './internals/NOPInformation' -import { ExternalEventInformation } from './internals/ExternalEventInformation' -import { SpawnChildInformation } from './internals/SpawnChildInformation' -import { SleepNodeInformation } from './internals/SleepNodeInformation' -import { UserTaskNodeInformation } from './internals/UserTaskNodeInformation' -import { WaitForThreadsInformation } from './internals/WaitForThreadsInformation' -import { TaskInformation } from './internals/TaskInformation' - -interface DrawerComponentProps { - internalComponent?: string | undefined; - data: any; - graphLayout: any; - nodeName?: string; - wfSpecId?: string; - setToggleSideBar: (value: boolean) => void; - setCode: (code: string) => void; - setLanguage: (language: string) => void; - setError: (value: boolean) => void; - setThread: (value: string) => void; -} - -export function WfSpecDrawerComponent(props: DrawerComponentProps) { - - const [ taskType, setTaskType ] = useState('') - const [ rawData, setRawData ] = useState() - const [ selectedNodeData, setSelectedNodeData ] = useState() - const [ threadSpecVariableDefs, setThreadSpecVariableDefs ] = - useState<{ name: string; type: string; value?: string }[]>() - const [ selectedNode, setSelectedNode ] = useState() - const [ wfRunData, setWfRunData ] = useState() - // eslint-disable-next-line react/hook-use-state -- seems is not used, analyze it further https://littlehorse.atlassian.net/browse/LH-237 - const [ errorData ] = useState([]) - const [ lastSelectedNode, setLastSelectedNode ] = useState() - const [ threadName, setThreadName ] = useState('entrypoint') - - const setThreadHandler = (thread: string) => { - setThreadName(thread) - props.setThread(thread) - setTaskType('') - } - - - - useEffect(() => { - - - if (props.data) { - if (threadSpecVariableDefs === undefined || threadName) { - let selectedThread - - if (threadName === undefined) { - selectedThread = props.data.entrypointThreadName - selectedThread - } - - const varDefs = props.data.threadSpecs[selectedThread || threadName].variableDefs.map(varDef => ({ - name: varDef.varDef.name, - type: varDef.varDef.type - })) - - setThreadSpecVariableDefs(varDefs) - } - - if (props.nodeName && props.nodeName !== lastSelectedNode) { - setLastSelectedNode(props.nodeName) - setSelectedNodeData(undefined) - setWfRunData(undefined) - setSelectedNode( - props.data.threadSpecs[threadName || 'entrypoint'].nodes[ - props.nodeName - ] - ) - - } - - const processComplexData = { - task: () => { - if (rawData === undefined) { - (async ( - url: string, - name: string, - handler: (data: any) => void - ) => { - const response = await fetch(url + name) - - if (response.ok) { - const content = await response.json() - - handler(content.data) - } else { console.error('INVALID RESPONSE FROM API')} - })( - '../../api/drawer/taskDef/', - selectedNode?.task.taskDefId.name, - setRawData - ) - } else { - const processedData = rawData.inputVars.map( - ( - element: { name: string; type: string; _: any }, - index: number - ) => { - const currentVariable = selectedNode?.task.variables[index] - - const variableName = currentVariable?.variableName - - const jsonPath = currentVariable?.jsonPath?.replace('$', '') - - if (jsonPath) {variableName?.concat(jsonPath)} - - return { - name: element.name, - type: element.type, - variableName, - } - } - ) - - - setSelectedNodeData(processedData) - } - }, - externalEvent: () => { - setSelectedNodeData({}) - }, - nop_def: () => { - setSelectedNodeData(selectedNode?.outgoingEdges) - } - } - - if (props.internalComponent) { - const complexData = - processComplexData[ - props.internalComponent as keyof typeof processComplexData - ] - - if (complexData instanceof Function) {complexData()} - } - } - }, [ - props.data, - rawData, - selectedNode, - props.nodeName, - props.internalComponent, - threadName, - ]) - - useEffect(() => { - if (!props?.nodeName) {return} - setTaskType(props.nodeName.split('-').reverse()[0]) - }, [ props.nodeName ]) - - const setToggleSideBar = ( - value: boolean, - isError: boolean, - code: string, - language?: string - ) => { - props.setToggleSideBar(value) - if ( - language === undefined || - language === 'jsonObj' || - language === 'jsonArr' - ) { - props.setCode(JSON.parse(code)) - return - } - props.setCode(code) - props.setLanguage(language) - props.setError(isError) - } - - const findNodeByProvidedNodeName = () => { - return props.graphLayout.nodes.find((node: Node) => node.id === props.nodeName) - } - - return ( -
-
-

THREADSPEC NAME

-
- -
-
-
-
- ThreadSpec Variables -
-
-

NAME

-

TYPE

-
- {(threadSpecVariableDefs !== undefined && threadSpecVariableDefs.length > 0) ? - threadSpecVariableDefs.map(({ name, type }, index) => { - return ( - // eslint-disable-next-line react/no-array-index-key -- we are using the name + index -
- - {/* eslint-disable-next-line react/no-array-index-key -- we are using the name + index */} -
-

{name}

-

{type}

-
-
- ) - }) : ( -
- No Variables were found -
- ) - } -
- - {/* {props.internalComponent === "task" && ( - - )} */ - } - { - props.internalComponent === 'nop_def' && ( - - ) - } - - { - props.internalComponent === 'startThread' && ( - - ) - } - - { - taskType === 'TASK' ? - : '' - } - - { - taskType === 'WAIT_FOR_THREADS' ? - : '' - } - { - taskType === 'EXTERNAL_EVENT' ? - : '' - } - { - taskType === 'SLEEP' ? : '' - } - { - taskType === 'USER_TASK' ? : '' - } -
- ) - -} diff --git a/dashboard/apps/web/components/Drawer/WfVariable.tsx b/dashboard/apps/web/components/Drawer/WfVariable.tsx deleted file mode 100644 index f8fc81f9f..000000000 --- a/dashboard/apps/web/components/Drawer/WfVariable.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import React, { useEffect, useState } from 'react' -import { parseValueByType } from '../../helpers/parseValueByType' -import type { VariableValue } from '../../littlehorse-public-api/variable' -import { parseKey } from './internals/drawerInternals' -import type { LHException } from './internals/FailureInformation' -import { FailureInformation } from './internals/FailureInformation' - -interface MainDataItem { - wfRunId?: string; - threadRunNumber: string; - name: string; - index: number; - run: any; - type?: string; -} -interface WfVariableProps extends MainDataItem { - setToggleSideBar: ( - value: boolean, - isError: boolean, - code: string, - language?: string - ) => void; - errorData: { - handlerSpecName: string; - exception: LHException | string; - }[]; -} - -function WfVariable(props: WfVariableProps) { - const [ wfVariableValue, setWfVariableValue ] = useState() - const [ variableValueLabel, setVariableValueLabel ] = useState< - string | number | boolean | undefined - >() - const [ longVariableValueClass, setLongVariableValueClass ] = useState('') - - const getVariableData = async (wfRunId: string, threadRunNumber: string, name: string) => { - const res = await fetch('/api/drawer/variable', { - method: 'POST', - body: JSON.stringify({ - wfRunId, - threadRunNumber, - name, - }), - }) - - if (res.ok) { - const content = await res.json() - const lhVariableValue: VariableValue = content.value - setWfVariableValue(lhVariableValue) - } - } - - const onVariableValueClick = () => { - if (wfVariableValue?.jsonObj != undefined) { - props.setToggleSideBar(true, false, JSON.parse(wfVariableValue.jsonObj || '{}'), 'json') - } - - if (wfVariableValue?.jsonArr != undefined) { - props.setToggleSideBar(true, false, JSON.parse(wfVariableValue.jsonArr || '[]'), 'json') - } - - if (wfVariableValue?.str != undefined) { - props.setToggleSideBar(true, false, wfVariableValue.str || '', 'json') - } - } - - const onParseError = (data: any) => { - if (typeof data === 'string') { - props.setToggleSideBar(true, true, data, 'str') - return - } - const key = parseKey(data.type.toLowerCase()) - const error = data[key] - props.setToggleSideBar(true, true, error, key) - } - - const isAValueThatCouldBeReallyLong = (wfVariable: VariableValue | undefined) => { - if (wfVariable === undefined) { - return false - } - - return wfVariable.jsonObj != undefined || wfVariable.jsonArr != undefined || wfVariable.str != undefined - } - - useEffect(() => { - getVariableData(props.wfRunId || '', props.threadRunNumber, props.name) - }, [ props.wfRunId, props.threadRunNumber ]) - - useEffect(() => { - setVariableValueLabel(parseValueByType(wfVariableValue)) - - if (isAValueThatCouldBeReallyLong(wfVariableValue)) { - setLongVariableValueClass('drawer__mainTable__clickable') - } else { - setLongVariableValueClass('') // Reset class if not JSON_OBJ - } - }, [ wfVariableValue ]) - - return ( - <> -
-

{props.name}

-

{props.type}

- {props.run ?

- {variableValueLabel} -

: null} -
- - - ) -} -export default WfVariable diff --git a/dashboard/apps/web/components/Drawer/arrow-right.svg b/dashboard/apps/web/components/Drawer/arrow-right.svg deleted file mode 100644 index 7a99bbcb2..000000000 --- a/dashboard/apps/web/components/Drawer/arrow-right.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/components/Drawer/internals/ExternalEventInformation.tsx b/dashboard/apps/web/components/Drawer/internals/ExternalEventInformation.tsx deleted file mode 100644 index 460a8d075..000000000 --- a/dashboard/apps/web/components/Drawer/internals/ExternalEventInformation.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import React, { useEffect, useState } from 'react' -import moment from 'moment' -import { DrawerHeader, DrawerSection } from 'ui' -import { parseValueByType } from '../../../helpers/parseValueByType' -import { FailureInformation } from './FailureInformation' -import type { LHException } from './FailureInformation' -import { parseKey } from './drawerInternals' - -interface ExternalEventInformationProps { - isWFRun:boolean - run?: any - data?: any - wfRunId?:string - errorData: { - handlerSpecName: string - exception: LHException | string - }[] - setToggleSideBar: (value: boolean, isError: boolean, code: string, language?: string) => void; -} - -export function ExternalEventInformation({ isWFRun,run,data,wfRunId,errorData,setToggleSideBar }: ExternalEventInformationProps) { - - const onParseError = (failureData: any) => { - - if (typeof failureData === 'string') { - setToggleSideBar(true, true, failureData, 'str') - return - } - const key = parseKey(failureData.type.toLowerCase()) - const error = failureData[key] - setToggleSideBar(true, true, error, key) - } - - const [ node, setNode ] = useState() - const [ externalEventRun, setExternalEventRun ] = useState() - const getNodeRun = async () => { - const res = await fetch('/api/drawer/nodeRun', { - method: 'POST', - body: JSON.stringify({ - wfRunId, - threadRunNumber: run?.number || 0, - name: data?.positionInThreadRun - }) - }) - if (res.ok) { - res.json().then(result => { - setNode(result) - }) - } - } - const getExternalEventRun = async () => { - if (node) { - const res = await fetch('/api/drawer/externalEvent', { - method: 'POST', - body: JSON.stringify({ - ...node?.externalEvent?.externalEventId - }) - }) - if (res.ok) { - res.json().then(result => { - setExternalEventRun(result) - }) - } - } - } - useEffect( () => { - getExternalEventRun() - },[ node ]) - - useEffect( () => { - if (isWFRun) {getNodeRun()} - },[ isWFRun, data ]) - - return ( - <> - - - {isWFRun ? ( - <> - -
- {externalEventRun?.scheduledTime ?

SCHEDULED

: null} - {externalEventRun?.scheduledTime ?

{externalEventRun?.scheduledTime ? moment(externalEventRun?.scheduledTime).format('MMMM DD, HH:mm:ss') : ''}

: null} -

REACH TIME

-

{node?.arrivalTime ? moment(node.arrivalTime).format('MMMM DD, HH:mm:ss') : 'Waiting for External Event'}

-

COMPLETION TIME

-

{node?.endTime ? moment(node.endTime).format('MMMM DD, HH:mm:ss') : 'Waiting for External Event'}

-

STATUS

-

{node?.status}

-
-
- - {/*
{JSON.stringify(node, null, 2)}
*/} - - {/*
{JSON.stringify(externalEventRun, null, 2)}
*/} - -
-

GUID

-

{node?.externalEvent?.externalEventId?.guid ? node?.externalEvent?.externalEventId?.guid: 'Waiting for External Event'}

-

ARRIVED TIME

-

- {node?.externalEvent?.eventTime ? moment(node.externalEvent?.eventTime).format('MMMM DD, HH:mm:ss') : 'Waiting for External Event'} -

-

ARRIVED

-

- {node?.externalEvent?.eventTime ? 'YES' : 'NO'} -

-
-
- - {externalEventRun ? -
-

TYPE

-

{externalEventRun?.content?.type ? externalEventRun?.content?.type : 'Waiting for External Event' }

- { (externalEventRun?.content?.type !== 'NULL') &&

VALUE

} - { (externalEventRun?.content?.type !== 'NULL') &&

{externalEventRun?.content ? parseValueByType(externalEventRun?.content) : 'Waiting for External Event'}

} -
-
: null} - - ) : ( -
-
- Variables Mutations -
-
-

MUTATED VARIABLE

-

MUTATION TYPE

-

- RHS -
- (LITERAL VALUE OR VARIABLE) -

-
- {data?.lhNode?.outgoingEdges.reduce((accumulator, currentValue) => { - return accumulator.concat(currentValue.variableMutations) - }, [])?.map( - ( - { lhsName, operation, literalValue }, - index: number - ) => { - return ( - // eslint-disable-next-line react/no-array-index-key -- we are using name + index -
-

{lhsName}

-

{operation}

-

{literalValue ? 'Literal Value' : 'Variable' }

- {/*

{literalValue ? parseliteralValue(literalValue) : parsenodeOutput(nodeOutput) }

*/} -
- ) - } - )} - -
- )} - - - ) -} diff --git a/dashboard/apps/web/components/Drawer/internals/FailureInformation.tsx b/dashboard/apps/web/components/Drawer/internals/FailureInformation.tsx deleted file mode 100644 index 931b22a40..000000000 --- a/dashboard/apps/web/components/Drawer/internals/FailureInformation.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import React from 'react' -import Image from 'next/image' -import exceptionSvg from './exception.svg' -import linkSvg from './link.svg' - -export enum LHException { - ChildFailure = 'Child failure', - VarSubError = 'Variable sub error', - VarMutationError = 'Variable mutation error', - Timeout = 'Timeout', - TaskFailure = 'Task failure' -} - -interface FailureInformationProps { - data: any[]; - openError: (value: any) => void; -} - -export function FailureInformation(props: FailureInformationProps) { - return ( - <> - {props.data.length > 0 && ( - <> -
- exception -
-

Exception log

-
-
-
-
-
Outputs
-
-

NAME

-

MESSAGE

-
-
- {props.data.map((element, index: number) => { - return ( - <> - {/* eslint-disable-next-line react/no-array-index-key -- using name + index */} -
-

{element.failureName}

-

{element.message !== undefined ? `${element.message.substring(0, 200)}...` : ''}

-
-
-

Output

-
-
-
-
{ - props.openError(element.log || element.message) - }} - > - link -

- Exception Log -

-
-
-
- - ) - })} -
- - - - )} - - ) -} diff --git a/dashboard/apps/web/components/Drawer/internals/NOPInformation.tsx b/dashboard/apps/web/components/Drawer/internals/NOPInformation.tsx deleted file mode 100644 index 373f6e1f8..000000000 --- a/dashboard/apps/web/components/Drawer/internals/NOPInformation.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import React, { useEffect, useState } from 'react' -import Image from 'next/image' -import splitArrowSvg from './split-arrow.svg' -import type { LHException } from './FailureInformation' -import { FailureInformation } from './FailureInformation' -import { - conditionSymbol, - getFullVariableName, - getNOPRHS, - parseKey -} from './drawerInternals' - -interface NOPInformationProps { - data: { sinkNodeName: string; condition: OutgoingEdgesCondition }[] - nodeName: string - errorData: { - handlerSpecName: string - exception: LHException | string - }[] - setToggleSideBar: (value: boolean, isError: boolean, code: string, language?: string) => void; -} - -interface OutgoingEdgesCondition { - comparator: string - left: { - jsonPath: string - variableName: string - } - right: { - literalValue: any - } -} - -export function NOPInformation(props: NOPInformationProps) { - - const [ conditionsOnNode, setConditionsOnNode ] = useState([]) - - useEffect(() => { - if (props.data !== undefined) { - setConditionsOnNode( - props.data.filter(edge => edge.condition !== undefined) - ) - } - }, [ props.data ]) - const onParseError = (data: any) => { - if (typeof data === 'string') { - props.setToggleSideBar(true, true, data, 'str') - return - } - const key = parseKey(data.type.toLowerCase()) - const error = data[key] - props.setToggleSideBar(true, true, error, key) - } - return ( - <> - {props.nodeName ? <> -
- split-arrow -
-

NOP Information

-

{props.nodeName}

-
-
-
-
Node Conditions
-
-

LHS

-

Condition

-

RHS

-

SINK NODE NAME

-
- - {props.data && - conditionsOnNode.length > 0 ? - props.data.map( - ( - element: { - sinkNodeName: string - condition: OutgoingEdgesCondition - }, - index: number - ) => { - return ( - element.condition && - - // eslint-disable-next-line react/no-array-index-key -- no unique attr for condition, then using index -
-

- {getFullVariableName(element.condition?.left)} -

-

- {conditionSymbol(element.condition?.comparator)} -

-

- {getNOPRHS(element.condition?.right.literalValue)} -

-

{element.sinkNodeName}

-
- ) - } - ) :
The Node does not have conditions
} -
- - : null} - - ) -} diff --git a/dashboard/apps/web/components/Drawer/internals/NodeData.tsx b/dashboard/apps/web/components/Drawer/internals/NodeData.tsx deleted file mode 100644 index 609ea250a..000000000 --- a/dashboard/apps/web/components/Drawer/internals/NodeData.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import moment from 'moment' -import React from 'react' - -export interface NodeDataProps { - scheduled?: string; - reachTime?: string; - completionTime?: string; - status?: string; -} - -export function NodeData(props: NodeDataProps) { - return ( -
-
Node data
-
- {props.scheduled ?

SCHEDULED

: null} - {props.scheduled ?

{props.scheduled ? moment(props.scheduled).format('MMMM DD, HH:mm:ss') : ''}

: null} -

REACH TIME

-

{props.reachTime ? moment(props.reachTime).format('MMMM DD, HH:mm:ss') : ''}

-

COMPLETION TIME

-

{props.completionTime ? moment(props.completionTime).format('MMMM DD, HH:mm:ss') : ''}

-

STATUS

-

{props.status}

-
-
- ) -} diff --git a/dashboard/apps/web/components/Drawer/internals/SleepNodeInformation.tsx b/dashboard/apps/web/components/Drawer/internals/SleepNodeInformation.tsx deleted file mode 100644 index e4a04a5cd..000000000 --- a/dashboard/apps/web/components/Drawer/internals/SleepNodeInformation.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import moment from 'moment' -import { useEffect, useState } from 'react' -import SleepLabelExtractor from './extractors/SleepLabelExtractor' - -interface SleepNodeInformationProps { - isWFRun:boolean - wfRunId?:string - data?: any - run?: any -} -export function SleepNodeInformation({ isWFRun, data, wfRunId, run }:SleepNodeInformationProps) { - - const [ nodeRun, setNodeRun ] = useState() - const getNodeRun = async () => { - const res = await fetch('/api/drawer/nodeRun', { - method: 'POST', - body: JSON.stringify({ - wfRunId, - threadRunNumber: run?.number || 0, - name:data?.positionInThreadRun - }) - }) - if (res.ok) { - res.json().then(result => { - setNodeRun(result) - }) - } - - } - useEffect( () => { - if (isWFRun) {getNodeRun()} - },[ isWFRun ]) - return ( - <> -
- sleep -
-

Sleep Node Information

-

{data?.id?.split('-').slice(0,-1).join('-')}

-
-
- {isWFRun ? ( -
-
- Maturation Time -
-
-
-

- {nodeRun?.sleep?.maturationTime ? moment(nodeRun?.sleep?.maturationTime).format('MMMM D, Y. h:mm A') : ''} -

-
-
-
- ) : ( -
-
- Sleep Until -
-
-
-

- {SleepLabelExtractor.extract(data?.lhNode?.sleep)} -

-
- -
-
- )} - {/* */} - {/* data.nodeRun.failureHandlers */} - - ) -} diff --git a/dashboard/apps/web/components/Drawer/internals/SpawnChildInformation.tsx b/dashboard/apps/web/components/Drawer/internals/SpawnChildInformation.tsx deleted file mode 100644 index fa68723e3..000000000 --- a/dashboard/apps/web/components/Drawer/internals/SpawnChildInformation.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React from 'react' -import Image from 'next/image' -import spawnChildSvg from './spawn-child.svg' -import polylineSvg from './polyline.svg' -import type { LHException } from './FailureInformation' -import { FailureInformation } from './FailureInformation' -import type { NodeDataProps } from './NodeData' -import { NodeData } from './NodeData' -import { parseKey, getThreadName, getThreadVarName } from './drawerInternals' - -interface SpawnChildInformationProps { - linkedThread: (thread: string) => void - nodeName: any - errorData: { - handlerSpecName: string - exception: LHException | string - }[] - wfRunData?: { - nodeData: NodeDataProps - } - setToggleSideBar: (value: boolean, isError: boolean, code: string, language?: string) => void; -} - -export function SpawnChildInformation(props: SpawnChildInformationProps) { - const onParseError = (data: any) => { - if (typeof data === 'string') { - props.setToggleSideBar(true, true, data, 'str') - return - } - const key = parseKey(data.type.toLowerCase()) - const error = data[key] - props.setToggleSideBar(true, true, error, key) - } - - return ( - <> - { - props.nodeName ?
- spawn-child -
-

SpawnChild Node Information

-

{props.nodeName}

-
-
: null - } - {props.wfRunData ? : null} - {props.wfRunData ?
-
- ExternalEvent info -
-
-

NAME

-
-

{ props.linkedThread(getThreadVarName(props.nodeName)) }} - > - {getThreadName(props.nodeName)} - {props.nodeName} -

-
-
-
: null} - {props.wfRunData === undefined && props.nodeName ?
-
- Related threadSpec -
-
-
{ props.linkedThread(getThreadVarName(props.nodeName)) }} - > - polyline -

- {getThreadName(props.nodeName)} -

-
-
-
: null} - - - ) -} diff --git a/dashboard/apps/web/components/Drawer/internals/TaskInformation.tsx b/dashboard/apps/web/components/Drawer/internals/TaskInformation.tsx deleted file mode 100644 index e94b300e5..000000000 --- a/dashboard/apps/web/components/Drawer/internals/TaskInformation.tsx +++ /dev/null @@ -1,277 +0,0 @@ -import moment from 'moment' -import { useEffect, useState } from 'react' -import Link from 'next/link' -import Image from 'next/image' -import { DrawerHeader, DrawerSection } from 'ui' -import { parseValueByType } from '../../../helpers/parseValueByType' -import linkSvg from './link.svg' - -interface TaskInformationProps { - isWFRun: boolean - wfRunId?: string - data?: any - run?: any - setToggleSideBar: (value: boolean) => void - setCode: (code: any) => void -} - -export function TaskInformation({ isWFRun, data, wfRunId, run }: TaskInformationProps) { - - const [ attemptNo, setAttemptNo ] = useState(0) - const [ loops, setLoops ] = useState() - const [ guid, setGuid ] = useState() - const [ info, setInfo ] = useState() - const [ node, setNode ] = useState() - const [ taskRun, setTaskRun ] = useState() - const getNodeRun = async () => { - const res = await fetch('/api/drawer/nodeRun', { - method: 'POST', - body: JSON.stringify({ - wfRunId, - threadRunNumber: run?.number || 0, - name: data?.positionInThreadRun - }) - }) - - if (res.ok) { - res.json().then((result) => { - setNode(result) - }) - } - } - const getUserTaskRun = async () => { - if (!node?.task?.taskRunId) {return} - const res = await fetch('/api/drawer/taskRun', { - method: 'POST', - body: JSON.stringify(node?.task?.taskRunId) - }) - if (res.ok) { - res.json().then((result) => { - setTaskRun(result) - }) - // if(result.attempts.length)setAttempt(result.attempts[0]) - } - } - const getUserTaskRunGUID = async () => { - if (!node?.task?.taskRunId) {return} - const params = node?.task?.taskRunId - params.taskGuid = guid - const res = await fetch('/api/drawer/taskRun', { - method: 'POST', - body: JSON.stringify(params) - }) - if (res.ok) { - res.json().then(result => { - setTaskRun(result) - }) - // if(result.attempts.length)setAttempt(result.attempts[0]) - } - } - const getInfo = async () => { - const res = await fetch('/api/information/taskDef', { - method: 'POST', - body: JSON.stringify({ - id: data?.lhNode?.task?.taskDefId.name, - }) - }) - if (res.ok) { - res.json().then(result => { - setInfo(result) - }) - } - - } - useEffect(() => { - if (isWFRun) {getNodeRun()} - }, [ isWFRun, data ]) - - useEffect(() => { - getUserTaskRun() - }, [ node ]) - - useEffect(() => { - getInfo() - }, [ data ]) - - const getLoops = async () => { - const res = await fetch('/api/loops/taskRun', { - method: 'POST', - body: JSON.stringify({ - taskDefName: data?.lhNode?.task?.taskDefName, - wfRunId - }), - }) - if (res.ok) { - const results = await res.json() - setLoops(results) - } - } - - useEffect(() => { - if (!data) {return} - getLoops() - }, [ data ]) - - useEffect(() => { - if (!guid) {return} - getUserTaskRunGUID() - }, [ guid ]) - - return ( - <> - {loops !== undefined && Boolean(loops?.length) && loops.length > 1 &&
-
Node Run
-
-
- -
-
- {/* { setGuid(e.target.value) }}> - {loops?.map((loop) => - )} - {/* {taskRun?.attempts?.map( (_, ix:number) => )} */} - - -
-
- -
} - - - {isWFRun ? ( -
- - - - - - - - - - - {(taskRun?.inputVariables !== undefined && taskRun?.inputVariables.length > 0) ? - taskRun?.inputVariables?.map((r: any, ix: number) => - - // eslint-disable-next-line react/no-array-index-key -- using name and index - - - - - ) : - ( - - - - ) - } - -
NAMETYPEVALUE
{r.varName}{r.value?.type}{parseValueByType(r.value)}
- No Task Def Variables were found -
-
- {/*
{JSON.stringify(taskRun?.attempts, null, 2)}
*/} -
-
Task Attempt
-
-
- -
-
- - -
-
- -
- - {Boolean(taskRun?.attempts.length) && -
- {taskRun?.attempts?.[attemptNo || 0]?.scheduleTime ?

SCHEDULED

: null} - {taskRun?.attempts?.[attemptNo || 0]?.scheduleTime ?

{taskRun?.attempts?.[attemptNo || 0]?.scheduleTime ? moment(taskRun?.attempts?.[attemptNo || 0]?.scheduleTime).format('MMMM DD, HH:mm:ss') : ''}

: null} -

REACH TIME

-

{taskRun?.attempts?.[attemptNo || 0]?.startTime ? moment(taskRun?.attempts?.[attemptNo || 0]?.startTime).format('MMMM DD, HH:mm:ss') : ''}

-

COMPLETION TIME

-

{taskRun?.attempts?.[attemptNo || 0]?.endTime ? moment(taskRun?.attempts?.[attemptNo || 0]?.endTime).format('MMMM DD, HH:mm:ss') : ''}

-

TASK WORKER ID

-

{taskRun?.attempts?.[attemptNo || 0]?.taskWorkerId || '-----'}

-

STATUS

-

{taskRun?.attempts?.[attemptNo || 0]?.status}

-
-
} - {/*
{JSON.stringify(node, null,2)}
*/} - {/*
{JSON.stringify(node?.task?.taskRunId, null,2)}
*/} - {/*
{JSON.stringify(taskRun, null,2)}
*/} - {/*
{JSON.stringify(info, null,2)}
*/} - {taskRun?.attempts?.length ? - - - - - - - - - - {taskRun?.attempts?.[attemptNo || 0]?.output !== undefined ? ( - <> - - - ) : } - - -
TYPEVALUE
{taskRun?.attempts?.[attemptNo || 0]?.output?.type}{parseValueByType(taskRun?.attempts?.[attemptNo || 0]?.output)}No Output values were found
-
: null} - - -
- ) : ( - - - - - - - - - - - {(info?.inputVars !== undefined && info?.inputVars?.length > 0) ? ( - // eslint-disable-next-line react/no-array-index-key -- using name + index - info?.inputVars?.map((f, index: number) => - - - - )) : ( - - - - )} - -
NAMETYPE
{f.name}{f.type}
- No TaskDef Variables were found -
-
- )} - - - - link -

- {data?.lhNode?.task?.taskDefId.name || ''} -

- -
- - ) -} diff --git a/dashboard/apps/web/components/Drawer/internals/ThreadRunsHandler.test.ts b/dashboard/apps/web/components/Drawer/internals/ThreadRunsHandler.test.ts deleted file mode 100644 index 8fe7259ec..000000000 --- a/dashboard/apps/web/components/Drawer/internals/ThreadRunsHandler.test.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { faker } from '@faker-js/faker' -import { WaitForThreadsRun_WaitingThreadStatus, type NodeRun } from '../../../littlehorse-public-api/node_run' -import type { ThreadRun } from '../../../littlehorse-public-api/wf_run' -import { ThreadType } from '../../../littlehorse-public-api/wf_run' -import { LHStatus } from '../../../littlehorse-public-api/common_enums' -import ThreadRunsHandler from './ThreadRunsHandler' - -describe('handle Thread Runs related logic', () => { - it('should return all the thread runs that the node run is waiting for', () => { - const threadRuns: ThreadRun[] = [ - { - wfSpecId: { - name: 'A_WFSPEC', - majorVersion: 0, - revision: 0 - }, - 'number': 0, - 'status': LHStatus.RUNNING, - 'threadSpecName': 'entrypoint', - 'startTime': '2023-10-30T19:40:51.912Z', - 'childThreadIds': [ - 1, - 2 - ], - 'haltReasons': [], - 'currentNodePosition': 3, - 'handledFailedChildren': [], - 'type': ThreadType.ENTRYPOINT - }, - { - wfSpecId: { - name: 'A_WFSPEC', - majorVersion: 0, - revision: 0 - }, - 'number': 1, - 'status': LHStatus.RUNNING, - 'threadSpecName': 'approval', - 'startTime': '2023-10-30T19:40:51.919Z', - 'childThreadIds': [], - 'parentThreadId': 0, - 'haltReasons': [], - 'currentNodePosition': 2, - 'handledFailedChildren': [], - 'type': ThreadType.CHILD - }, - { - wfSpecId: { - name: 'A_WFSPEC', - majorVersion: 0, - revision: 0 - }, - 'number': 2, - 'status': LHStatus.RUNNING, - 'threadSpecName': 'approval', - 'startTime': '2023-10-30T19:40:51.944Z', - 'childThreadIds': [], - 'parentThreadId': 0, - 'haltReasons': [], - 'currentNodePosition': 2, - 'handledFailedChildren': [], - 'type': ThreadType.CHILD - } - ] - - const waitForThreadsRun: NodeRun = { - id: { - wfRunId: { - id: 'asdf' - }, - threadRunNumber: 0, - position: 3 - }, - 'status': LHStatus.RUNNING, - 'arrivalTime': '2023-10-30T19:40:52.286Z', - wfSpecId: { - name: 'A_WFSPEC', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '3-threads-WAIT_FOR_THREADS', - 'failures': [], - 'waitThreads': { - 'threads': [ - { - 'threadStatus': LHStatus.RUNNING, - 'threadRunNumber': 1, - 'waitingStatus': WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS - }, - { - 'threadStatus': LHStatus.RUNNING, - 'threadRunNumber': 2, - 'waitingStatus': WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS - } - ] - }, - 'failureHandlerIds': [] - } - - const associatedThreadRuns: ThreadRun[] = ThreadRunsHandler.getThreadRunsAssociatedWithNodeRun(waitForThreadsRun, threadRuns) - - expect(associatedThreadRuns).toEqual([ threadRuns[1], threadRuns[2] ]) - }) - - it('if thread runs were not found an empty result should be provided', () => { - const threadRuns: ThreadRun[] = [ - { - wfSpecId: { - name: 'A_WFSPEC', - majorVersion: 0, - revision: 0 - }, - 'number': 0, - 'status': LHStatus.RUNNING, - 'threadSpecName': 'entrypoint', - 'startTime': '2023-10-30T19:40:51.912Z', - 'childThreadIds': [ - 1, - 2 - ], - 'haltReasons': [], - 'currentNodePosition': 3, - 'handledFailedChildren': [], - 'type': ThreadType.ENTRYPOINT - } - ] - - const waitForThreadsRun: NodeRun = { - id: { - wfRunId: { - id: 'asdf' - }, - threadRunNumber: 0, - position: 3 - }, - 'status': LHStatus.RUNNING, - 'arrivalTime': '2023-10-30T19:40:52.286Z', - wfSpecId: { - name: 'A_WFSPEC', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '3-threads-WAIT_FOR_THREADS', - 'failures': [], - 'waitThreads': { - 'threads': [ - { - 'threadStatus': LHStatus.RUNNING, - 'threadRunNumber': 1, - 'waitingStatus': WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS - } - ] - }, - 'failureHandlerIds': [] - } - - const associatedThreadRuns: ThreadRun[] = ThreadRunsHandler.getThreadRunsAssociatedWithNodeRun(waitForThreadsRun, threadRuns) - - expect(associatedThreadRuns).not.toContain(undefined) - }) - - it('when the node run does not have wait for threads should return an empty result', () => { - const threadRuns: ThreadRun[] = [ - { - wfSpecId: { - name: 'A_WFSPEC', - majorVersion: 0, - revision: 0 - }, - 'number': 0, - 'status': LHStatus.RUNNING, - 'threadSpecName': 'entrypoint', - 'startTime': '2023-10-30T19:40:51.912Z', - 'childThreadIds': [ - 1, - 2 - ], - 'haltReasons': [], - 'currentNodePosition': 3, - 'handledFailedChildren': [], - 'type': ThreadType.ENTRYPOINT - } - ] - - const waitForThreadsRun: NodeRun = { - id: { - wfRunId: { - id: 'asdf' - }, - threadRunNumber: 0, - position: 3 - }, - 'status': LHStatus.RUNNING, - 'arrivalTime': '2023-10-30T19:40:52.286Z', - wfSpecId: { - name: 'A_WFSPEC', - majorVersion: 0, - revision: 0 - }, - 'threadSpecName': 'entrypoint', - 'nodeName': '3-threads-WAIT_FOR_THREADS', - 'failures': [], - 'failureHandlerIds': [] - } - - const associatedThreadRuns: ThreadRun[] = ThreadRunsHandler.getThreadRunsAssociatedWithNodeRun(waitForThreadsRun, threadRuns) - - expect(associatedThreadRuns).toEqual([]) - }) - - it('should return thread run info containing number and thread spec name', () => { - const threadRunNumber = Math.floor(Math.random() * 10) - const threadSpecName = faker.animal.type() - - expect(ThreadRunsHandler.buildThreadRunInfo(threadRunNumber, threadSpecName)).toEqual(`{"number": ${threadRunNumber}, "threadSpecName": "${threadSpecName}"}`) - }) -}) diff --git a/dashboard/apps/web/components/Drawer/internals/ThreadRunsHandler.ts b/dashboard/apps/web/components/Drawer/internals/ThreadRunsHandler.ts deleted file mode 100644 index 8692a4bd3..000000000 --- a/dashboard/apps/web/components/Drawer/internals/ThreadRunsHandler.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { NodeRun } from '../../../littlehorse-public-api/node_run' -import type { ThreadRun } from '../../../littlehorse-public-api/wf_run' - -const getThreadRunsAssociatedWithNodeRun = (nodeRun: NodeRun, threadRuns: ThreadRun[]): ThreadRun[] => { - const relatedThreadRuns: ThreadRun[] = [] - - if (nodeRun.waitThreads === undefined) { - return [] - } - - nodeRun.waitThreads.threads.forEach(nr => { - const foundThreadRun = threadRuns.find(tr => { - return tr.number === nr.threadRunNumber - }) - - if (foundThreadRun !== undefined) { - relatedThreadRuns.push(foundThreadRun) - } - }) - - return relatedThreadRuns -} - -const buildThreadRunInfo = (threadRunNumber: number, threadSpecName: string) => { - return `{"number": ${threadRunNumber}, "threadSpecName": "${threadSpecName}"}` -} - -const ThreadRunsHandler = { - getThreadRunsAssociatedWithNodeRun, - buildThreadRunInfo -} - -export default ThreadRunsHandler diff --git a/dashboard/apps/web/components/Drawer/internals/UserTaskNodeInformation.tsx b/dashboard/apps/web/components/Drawer/internals/UserTaskNodeInformation.tsx deleted file mode 100644 index 5bd398c4f..000000000 --- a/dashboard/apps/web/components/Drawer/internals/UserTaskNodeInformation.tsx +++ /dev/null @@ -1,185 +0,0 @@ -import moment from 'moment' -import { useEffect, useState } from 'react' -import Link from 'next/link' -import Image from 'next/image' -import { DrawerHeader, DrawerSection } from 'ui' -import _ from 'lodash' -import linkSvg from './link.svg' - -interface UserTaskNodeInformationProps { - isWFRun:boolean - wfRunId?:string - data?: any - run?: any - setToggleSideBar: (value:boolean) => void - setCode:(value:any) => void -} - -export function UserTaskNodeInformation({ isWFRun, data, wfRunId, run, setToggleSideBar, setCode }:UserTaskNodeInformationProps) { - - const [ info, setInfo ] = useState() - const [ node, setNode ] = useState() - const [ userTaskRun, setUserTaskRun ] = useState() - const getNodeRun = async () => { - const res = await fetch('/api/drawer/nodeRun', { - method: 'POST', - body: JSON.stringify({ - wfRunId, - threadRunNumber: run?.number || 0, - name:data?.positionInThreadRun - }) - }) - if (res.ok) { - res.json().then((result) => { - setNode(result) - }) - } - } - const getUserTaskRun = async () => { - const res = await fetch('/api/drawer/userTaskRun', { - method: 'POST', - body: JSON.stringify({ - wfRunId, - guid: node?.userTask?.userTaskRunId?.userTaskGuid - }) - }) - - if (res.ok) { - res.json().then((result) => { - setUserTaskRun(result) - }) - } - } - const getInfo = async () => { - const res = await fetch('/api/information/userTaskDef', { - method: 'POST', - body: JSON.stringify({ - id: data?.lhNode?.userTask?.userTaskDefName, - version: data?.lhNode?.userTask?.userTaskDefVersion - }) - }) - if (res.ok) { - res.json().then((result) => { - setInfo(result) - }) - } - - } - useEffect( () => { - if (isWFRun) {getNodeRun()} - },[ isWFRun, data ]) - - useEffect( () => { - getUserTaskRun() - },[ node ]) - - useEffect( () => { - getInfo() - },[ data ]) - return ( - <> - - - - {isWFRun ? ( -
- - -
- {userTaskRun?.scheduledTime ?

SCHEDULED

: null} - {userTaskRun?.scheduledTime ?

{userTaskRun?.scheduledTime ? moment(userTaskRun?.scheduledTime).format('MMMM DD, HH:mm:ss') : ''}

: null} -

REACH TIME

-

{node?.arrivalTime ? moment(node.arrivalTime).format('MMMM DD, HH:mm:ss') : ''}

-

COMPLETION TIME

-

{node?.endTime ? moment(node.endTime).format('MMMM DD, HH:mm:ss') : ''}

-

STATUS

-

{node?.status}

- {(userTaskRun?.userGroup || userTaskRun?.user?.userGroup) ?

USER GROUP

: null} - {(userTaskRun?.userGroup || userTaskRun?.user?.userGroup) ?

{userTaskRun?.user?.userGroup?.id || userTaskRun?.userGroup }

: null} - - - {userTaskRun?.user ?

SPECIFIC USER

: null} - {userTaskRun?.user ?

{userTaskRun?.user?.id }

: null} - - {_.orderBy(userTaskRun?.events, [ 'time' ],[ 'desc' ])?.find( e => e.reassigned?.oldUser) ?

REASSIGNED TO

: null} - {_.orderBy(userTaskRun?.events, [ 'time' ],[ 'desc' ])?.find( e => e.reassigned?.oldUser) ?

{_.orderBy(userTaskRun?.events, [ 'time' ],[ 'desc' ])?.find( e => e.reassigned).reassigned.oldUser?.id} {`->`} {_.orderBy(userTaskRun?.events, [ 'time' ],[ 'desc' ])?.find( e => e.reassigned).reassigned.newUser?.id}

: null} - - - {userTaskRun?.notes ?

NOTES

: null} - {userTaskRun?.notes ?

{userTaskRun?.notes }

: null} -
-
- - - - - - - - - - - - { // TODO: Put logic to make the other type of forms, where we have fields, to work correctly - - - - - - } - -
NAMETYPERESULT
isApproved{userTaskRun?.results?.isApproved?.type}{`${userTaskRun?.results?.isApproved?.bool}`}
-
- - - - link -

- {data?.id?.split('-').slice(1, -1).join('-') || ''} -

- -
- - -
{ - setToggleSideBar(true) - setCode(userTaskRun?.events || '') - }}> - audit log -
-
- -
- ) : ( - - - - - - - - - - - - {/* eslint-disable-next-line react/no-array-index-key -- using name + index */} - {info?.fields?.map((f, index: number) => - - - - - )} - -
NAMEDISPLAY NAMETYPE
{f.name}{f.displayName}{f.type}
-
- )} - {/* */} - {/* data.node.failureHandlers */} - - ) -} diff --git a/dashboard/apps/web/components/Drawer/internals/WaitForThreadsInformation.tsx b/dashboard/apps/web/components/Drawer/internals/WaitForThreadsInformation.tsx deleted file mode 100644 index 24a1a2c0f..000000000 --- a/dashboard/apps/web/components/Drawer/internals/WaitForThreadsInformation.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import React, { useEffect, useState } from 'react' -import moment from 'moment' -import { DrawerHeader, DrawerSection, DrawerThreadSpecLink } from 'ui' -import { nodename } from '../../../helpers/nodename' -import { FailureInformation } from './FailureInformation' -import type { LHException } from './FailureInformation' -import { parseKey } from './drawerInternals' -import ThreadRunsHandler from './ThreadRunsHandler' - -interface WaitForThreadsInformationProps { - linkedThread: (thread: string) => void - isWFRun: boolean - run?: any - threadRuns?: any - data?: any - wfRunId?: string, - setThreadRunInfoValue?: (threadRunInfoValue: string) => void, - errorData: { - handlerSpecName: string - exception: LHException | string - }[] - setToggleSideBar: (value: boolean, isError: boolean, code: string, language?: string) => void; -} - -export function WaitForThreadsInformation({ - isWFRun, - setThreadRunInfoValue, - run, - threadRuns, - data, - wfRunId, - errorData, - setToggleSideBar, - linkedThread -}: WaitForThreadsInformationProps) { - - const onParseError = (failureData: any) => { - - if (typeof failureData === 'string') { - setToggleSideBar(true, true, failureData, 'str') - return - } - const key = parseKey(failureData.type.toLowerCase()) - const error = failureData[key] - setToggleSideBar(true, true, error, key) - } - - const [ nodeRun, setNodeRun ] = useState() - const getNodeRun = async () => { - const res = await fetch('/api/drawer/nodeRun', { - method: 'POST', - body: JSON.stringify({ - wfRunId, - threadRunNumber: run?.number || 0, - name: data.positionInThreadRun - }) - }) - if (res.ok) { - res.json().then(result => { - setNodeRun(result) - }) - } - } - - useEffect(() => { - if (isWFRun) { - getNodeRun() - } - }, [ isWFRun, data ]) - - return ( - <> - - {isWFRun ? ( - <> - -
- {nodeRun?.scheduledTime ?

SCHEDULED

: null} - {nodeRun?.scheduledTime ? -

{nodeRun?.scheduledTime ? moment(nodeRun?.scheduledTime).format('MMMM DD, HH:mm:ss') : ''}

: null} -

REACH TIME

-

{nodeRun?.arrivalTime ? moment(nodeRun.arrivalTime).format('MMMM DD, HH:mm:ss') : ''}

-

COMPLETION TIME

-

{nodeRun?.endTime ? moment(nodeRun.endTime).format('MMMM DD, HH:mm:ss') : ''}

-

STATUS

-

{nodeRun?.status}

-
-
- {nodeRun !== undefined && setThreadRunInfoValue !== undefined && - - { - ThreadRunsHandler.getThreadRunsAssociatedWithNodeRun(nodeRun, threadRuns).length === 0 ? -
- No related thread specs were found -
: - ThreadRunsHandler.getThreadRunsAssociatedWithNodeRun(nodeRun, threadRuns).map(relatedThreadRun => { - return - }) - } -
- } - - ) : ( - - {data?.lhNode?.waitForThreads?.threads && data?.lhNode?.waitForThreads?.threads.length > 0 ? - data?.lhNode?.waitForThreads?.threads?.map((t: any, ix: number) => - // eslint-disable-next-line react/no-array-index-key -- using index - - ) : - ( -
- No related thread specs were found -
- ) - } -
- )} - - - - ) -} diff --git a/dashboard/apps/web/components/Drawer/internals/correct-arrow.svg b/dashboard/apps/web/components/Drawer/internals/correct-arrow.svg deleted file mode 100644 index 39dfed36e..000000000 --- a/dashboard/apps/web/components/Drawer/internals/correct-arrow.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/components/Drawer/internals/drawerInternals.ts b/dashboard/apps/web/components/Drawer/internals/drawerInternals.ts deleted file mode 100644 index 006c0d47c..000000000 --- a/dashboard/apps/web/components/Drawer/internals/drawerInternals.ts +++ /dev/null @@ -1,60 +0,0 @@ -export const getFullVariableName = (values: any) => - (values?.variableName || '') + (values?.jsonPath?.replace('$', '') || '') - -export const getNOPRHS = (value: any) => { - if (value) { - const variableType = Object.keys(value)[0] - return value[variableType].toString() - } - - return '' -} - -export const conditionSymbol = (comparator: string) => { - const conditions = { - EQUALS:'=', - NOT_EQUALS:'!=', - GREATER_THAN: '>', - GREATER_THAN_EQ: '>=', - LESS_THAN_EQ: '<=', - LESS_THAN: '<', - IN: 'IN', - NOT_IN: 'NOT IN' - } - - return conditions[comparator as keyof typeof conditions] -} - -export const nodeTypes = { - TASK: 'task', - NOP: 'nop_def', - EXTERNAL_EVENT: 'externalEvent', - START_THREAD: 'startThread', - WAIT_FOR_THREAD: 'waitForThread' -} - -export const getMainDrawerData = async (name: string, setDrawerData: any) => { - const response = await fetch(`../../api/drawer/wfSpec/${name}`) - - if (response.ok) { - const content = await response.json() - - setDrawerData(content) - } else {console.error('INVALID RESPONSE FROM API')} -} - -export const parseKey = (variableType: string) => { - return variableType.split('_').map((w, i) => { - if (i === 0) {return w.toLowerCase()} - return w.charAt(0) + w.slice(1).toLowerCase() - }).join('') -} - -export const getThreadName = nodeName => { - if (!nodeName) {return ''} - const split = nodeName.split('-') - return `${split[1]} ${split[2]}` -} -export const getThreadVarName = nodeName => { - return nodeName.split('-').slice(1,-1).join('-') -} diff --git a/dashboard/apps/web/components/Drawer/internals/exception.svg b/dashboard/apps/web/components/Drawer/internals/exception.svg deleted file mode 100644 index 72cdb6601..000000000 --- a/dashboard/apps/web/components/Drawer/internals/exception.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/components/Drawer/internals/extractors/SleepLabelExtractor.test.ts b/dashboard/apps/web/components/Drawer/internals/extractors/SleepLabelExtractor.test.ts deleted file mode 100644 index b72b1422e..000000000 --- a/dashboard/apps/web/components/Drawer/internals/extractors/SleepLabelExtractor.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { SleepNode } from '../../../../littlehorse-public-api/wf_spec' -import SleepLabelExtractor from './SleepLabelExtractor' - -describe('extracts label out of sleep values', () => { - /* -sleep: -- rawSeconds -= timestamp -- isoDate -for either of them it can be a variable or a literal value, if a literal value only ints will come - */ - it('should return the number of seconds', () => { - const expectedNumberOfSeconds = Math.floor(Math.random() * 10) - const sleepNode: SleepNode = { - 'rawSeconds': { - 'literalValue': { - 'int': expectedNumberOfSeconds - } - } - } - - - const label: string = SleepLabelExtractor.extract(sleepNode) - expect(label).toEqual(`${expectedNumberOfSeconds} Seconds`) - }) - - it('should return the name of the variable in the label', () => { - const sleepNode: SleepNode = { - 'rawSeconds': { - 'variableName': 'number-of-seconds-variable' - } - } - - - const label: string = SleepLabelExtractor.extract(sleepNode) - expect(label).toEqual(`number-of-seconds-variable`) - }) - - it('should return the timestamp variable as part of the label', () => { - const sleepNode: SleepNode = { - 'timestamp': { - 'variableName': 'timestamp-to-wait-for' - } - } - - const label: string = SleepLabelExtractor.extract(sleepNode) - expect(label).toEqual(`timestamp-to-wait-for`) - }) -}) diff --git a/dashboard/apps/web/components/Drawer/internals/extractors/SleepLabelExtractor.ts b/dashboard/apps/web/components/Drawer/internals/extractors/SleepLabelExtractor.ts deleted file mode 100644 index 0c972f7c6..000000000 --- a/dashboard/apps/web/components/Drawer/internals/extractors/SleepLabelExtractor.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { SleepNode } from '../../../../littlehorse-public-api/wf_spec' - -const extract = (sleepNode: SleepNode): string => { - const rawSecondsVariableName: string | undefined = sleepNode.rawSeconds?.variableName - const timestampVariableName: string | undefined = sleepNode.timestamp?.variableName - - if (rawSecondsVariableName !== undefined) { - return rawSecondsVariableName - } - - if (timestampVariableName !== undefined) { - return timestampVariableName - } - - return `${sleepNode.rawSeconds?.literalValue?.int} Seconds` -} - -const SleepLabelExtractor = { - extract -} - -export default SleepLabelExtractor diff --git a/dashboard/apps/web/components/Drawer/internals/link.svg b/dashboard/apps/web/components/Drawer/internals/link.svg deleted file mode 100644 index 70e9f8362..000000000 --- a/dashboard/apps/web/components/Drawer/internals/link.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/components/Drawer/internals/polyline.svg b/dashboard/apps/web/components/Drawer/internals/polyline.svg deleted file mode 100644 index 040c9c407..000000000 --- a/dashboard/apps/web/components/Drawer/internals/polyline.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/components/Drawer/internals/spawn-child.svg b/dashboard/apps/web/components/Drawer/internals/spawn-child.svg deleted file mode 100644 index 9954a024a..000000000 --- a/dashboard/apps/web/components/Drawer/internals/spawn-child.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/components/Drawer/internals/split-arrow.svg b/dashboard/apps/web/components/Drawer/internals/split-arrow.svg deleted file mode 100644 index 982d019c9..000000000 --- a/dashboard/apps/web/components/Drawer/internals/split-arrow.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/components/SessionProvider.tsx b/dashboard/apps/web/components/SessionProvider.tsx deleted file mode 100644 index 84bf83722..000000000 --- a/dashboard/apps/web/components/SessionProvider.tsx +++ /dev/null @@ -1,10 +0,0 @@ -'use client' - -import { SessionProvider as NextAuthSessionProvider } from 'next-auth/react' -import { FC, PropsWithChildren } from 'react' - -export const SessionProvider: FC = ({ children }) => ( - - { children } - -) diff --git a/dashboard/apps/web/components/Snippet/Snippet.tsx b/dashboard/apps/web/components/Snippet/Snippet.tsx deleted file mode 100644 index 8e03d25ed..000000000 --- a/dashboard/apps/web/components/Snippet/Snippet.tsx +++ /dev/null @@ -1,27 +0,0 @@ - -import { useEffect, useState } from 'react' -import SyntaxHighlighter from 'react-syntax-highlighter' -//a11yDark -import { stackoverflowDark } from 'react-syntax-highlighter/dist/esm/styles/hljs' - -function Snippet({ value, language='json' }) { - - const [ snippetLanguage, setSnippetLanguage ] = useState('json') - - useEffect(() => { - if (language === 'int' || - language === 'str') { - setSnippetLanguage('plaintext') - } else { - setSnippetLanguage('json') - } - }, [ language ]) - - return (
- - {snippetLanguage === 'json' ? JSON.stringify(value, null, 2) : value} - -
) -} - -export default Snippet diff --git a/dashboard/apps/web/components/Snippet/index.tsx b/dashboard/apps/web/components/Snippet/index.tsx deleted file mode 100644 index 6aad18b07..000000000 --- a/dashboard/apps/web/components/Snippet/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import Snippet from './Snippet' - -export default Snippet diff --git a/dashboard/apps/web/components/WFRunInformationSideBar/WFRunInformationSideBar.tsx b/dashboard/apps/web/components/WFRunInformationSideBar/WFRunInformationSideBar.tsx deleted file mode 100644 index 6e3590acf..000000000 --- a/dashboard/apps/web/components/WFRunInformationSideBar/WFRunInformationSideBar.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import Image from 'next/image' -import Snippet from '../Snippet' - -function WFRunInformationSideBar({ - toggleSideBar, - setToggleSideBar, - output, - errorLog, - language -}) { - - if (!toggleSideBar) { - return null - } - - return (
-
-
- chevron-right setToggleSideBar(false)} - src="/chevron_right.svg" - width={11.1} - /> -

{errorLog ? 'Exception log' : 'JSON / Array values'}

- -
- -
-
) -} - -export default WFRunInformationSideBar diff --git a/dashboard/apps/web/components/WFRunInformationSideBar/index.tsx b/dashboard/apps/web/components/WFRunInformationSideBar/index.tsx deleted file mode 100644 index 2d64801ed..000000000 --- a/dashboard/apps/web/components/WFRunInformationSideBar/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import WFRunInformationSideBar from './WFRunInformationSideBar' - -export default WFRunInformationSideBar diff --git a/dashboard/apps/web/contexts/FeatureToggleContext.tsx b/dashboard/apps/web/contexts/FeatureToggleContext.tsx deleted file mode 100644 index 16ec50e4a..000000000 --- a/dashboard/apps/web/contexts/FeatureToggleContext.tsx +++ /dev/null @@ -1,20 +0,0 @@ -'use client' -import { createContext, useContext } from 'react' - -type FeatureToggle = Record - -const FeatureToggleContext = createContext({ 'isAuthenticationEnabled': 'false' }) - -export default function FeatureToggleProvider ({ children, value }) { - return ( - - {children} - - ) -} - -export const useFeatureToggle = (name: string): boolean => { - const context = useContext(FeatureToggleContext) - - return context[name] === 'true' -} diff --git a/dashboard/apps/web/global.scss b/dashboard/apps/web/global.scss deleted file mode 100644 index 0ed2fe90e..000000000 --- a/dashboard/apps/web/global.scss +++ /dev/null @@ -1 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap'); diff --git a/dashboard/apps/web/helpers/nodename.ts b/dashboard/apps/web/helpers/nodename.ts deleted file mode 100644 index 0b18eb81d..000000000 --- a/dashboard/apps/web/helpers/nodename.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const nodename = (fullname:string) => { - if (!fullname) {return ''} - return fullname.split('-').slice(1,-1).join('-') || '' -} -export const nodeposition = (fullname:string) => { - if (!fullname) {return 0} - return fullname.split('-').shift() || 0 -} -export const nodetype = (fullname:string) => { - if (!fullname) {return ''} - return fullname.split('-').pop() || '' -} diff --git a/dashboard/apps/web/helpers/parseValueByType.ts b/dashboard/apps/web/helpers/parseValueByType.ts deleted file mode 100644 index 77a0994bf..000000000 --- a/dashboard/apps/web/helpers/parseValueByType.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const parseValueByType = (value:any) => { - if (value?.jsonObj != undefined) {return (value?.jsonObj)} - if (value?.jsonArr != undefined) {return (value?.jsonArr)} - if (value?.double != undefined) {return (value?.double)} - if (value?.bool != undefined) {return JSON.stringify(value?.bool)} - if (value?.int != undefined) {return (value?.int)} - if (value?.bytes != undefined) {return (value?.bytes)} - return value?.str -} diff --git a/dashboard/apps/web/interfaces/InputVarsTaskDef.ts b/dashboard/apps/web/interfaces/InputVarsTaskDef.ts deleted file mode 100644 index 9a4cc3f3a..000000000 --- a/dashboard/apps/web/interfaces/InputVarsTaskDef.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface InputVarsTaskDef { - name: string; - required: boolean; - type: string; -} diff --git a/dashboard/apps/web/interfaces/TaskDefInformation.ts b/dashboard/apps/web/interfaces/TaskDefInformation.ts deleted file mode 100644 index 20cb4f8f9..000000000 --- a/dashboard/apps/web/interfaces/TaskDefInformation.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { InputVarsTaskDef } from './InputVarsTaskDef' - -export interface TaskDefInformation { - createdAt: string; - inputVars: InputVarsTaskDef[]; - name: string; -} diff --git a/dashboard/apps/web/interfaces/TaskDefInformationResponse.ts b/dashboard/apps/web/interfaces/TaskDefInformationResponse.ts deleted file mode 100644 index 57b048dd3..000000000 --- a/dashboard/apps/web/interfaces/TaskDefInformationResponse.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { TaskDefInformation } from './TaskDefInformation' - -export interface TaskDefInformationResponse { - code: string; - result: TaskDefInformation -} diff --git a/dashboard/apps/web/littlehorse-public-api/acls.ts b/dashboard/apps/web/littlehorse-public-api/acls.ts deleted file mode 100644 index d7e4297f0..000000000 --- a/dashboard/apps/web/littlehorse-public-api/acls.ts +++ /dev/null @@ -1,1039 +0,0 @@ -/* eslint-disable */ -import * as _m0 from "protobufjs/minimal"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { PrincipalId, TenantId } from "./object_id"; - -export const protobufPackage = "littlehorse"; - -export enum ACLResource { - ACL_WORKFLOW = "ACL_WORKFLOW", - ACL_TASK = "ACL_TASK", - ACL_EXTERNAL_EVENT = "ACL_EXTERNAL_EVENT", - ACL_USER_TASK = "ACL_USER_TASK", - ACL_PRINCIPAL = "ACL_PRINCIPAL", - ACL_TENANT = "ACL_TENANT", - ACL_ALL_RESOURCES = "ACL_ALL_RESOURCES", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function aCLResourceFromJSON(object: any): ACLResource { - switch (object) { - case 0: - case "ACL_WORKFLOW": - return ACLResource.ACL_WORKFLOW; - case 1: - case "ACL_TASK": - return ACLResource.ACL_TASK; - case 2: - case "ACL_EXTERNAL_EVENT": - return ACLResource.ACL_EXTERNAL_EVENT; - case 3: - case "ACL_USER_TASK": - return ACLResource.ACL_USER_TASK; - case 4: - case "ACL_PRINCIPAL": - return ACLResource.ACL_PRINCIPAL; - case 5: - case "ACL_TENANT": - return ACLResource.ACL_TENANT; - case 6: - case "ACL_ALL_RESOURCES": - return ACLResource.ACL_ALL_RESOURCES; - case -1: - case "UNRECOGNIZED": - default: - return ACLResource.UNRECOGNIZED; - } -} - -export function aCLResourceToJSON(object: ACLResource): string { - switch (object) { - case ACLResource.ACL_WORKFLOW: - return "ACL_WORKFLOW"; - case ACLResource.ACL_TASK: - return "ACL_TASK"; - case ACLResource.ACL_EXTERNAL_EVENT: - return "ACL_EXTERNAL_EVENT"; - case ACLResource.ACL_USER_TASK: - return "ACL_USER_TASK"; - case ACLResource.ACL_PRINCIPAL: - return "ACL_PRINCIPAL"; - case ACLResource.ACL_TENANT: - return "ACL_TENANT"; - case ACLResource.ACL_ALL_RESOURCES: - return "ACL_ALL_RESOURCES"; - case ACLResource.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function aCLResourceToNumber(object: ACLResource): number { - switch (object) { - case ACLResource.ACL_WORKFLOW: - return 0; - case ACLResource.ACL_TASK: - return 1; - case ACLResource.ACL_EXTERNAL_EVENT: - return 2; - case ACLResource.ACL_USER_TASK: - return 3; - case ACLResource.ACL_PRINCIPAL: - return 4; - case ACLResource.ACL_TENANT: - return 5; - case ACLResource.ACL_ALL_RESOURCES: - return 6; - case ACLResource.UNRECOGNIZED: - default: - return -1; - } -} - -export enum ACLAction { - READ = "READ", - RUN = "RUN", - WRITE_METADATA = "WRITE_METADATA", - ALL_ACTIONS = "ALL_ACTIONS", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function aCLActionFromJSON(object: any): ACLAction { - switch (object) { - case 0: - case "READ": - return ACLAction.READ; - case 1: - case "RUN": - return ACLAction.RUN; - case 2: - case "WRITE_METADATA": - return ACLAction.WRITE_METADATA; - case 3: - case "ALL_ACTIONS": - return ACLAction.ALL_ACTIONS; - case -1: - case "UNRECOGNIZED": - default: - return ACLAction.UNRECOGNIZED; - } -} - -export function aCLActionToJSON(object: ACLAction): string { - switch (object) { - case ACLAction.READ: - return "READ"; - case ACLAction.RUN: - return "RUN"; - case ACLAction.WRITE_METADATA: - return "WRITE_METADATA"; - case ACLAction.ALL_ACTIONS: - return "ALL_ACTIONS"; - case ACLAction.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function aCLActionToNumber(object: ACLAction): number { - switch (object) { - case ACLAction.READ: - return 0; - case ACLAction.RUN: - return 1; - case ACLAction.WRITE_METADATA: - return 2; - case ACLAction.ALL_ACTIONS: - return 3; - case ACLAction.UNRECOGNIZED: - default: - return -1; - } -} - -/** This is a GlobalGetable. */ -export interface Principal { - /** - * Principals are agnostic of the Authentication protocol that you use. In OAuth, - * the id is retrieved by looking at the claims on the request. In mTLS, the - * id is retrived by looking at the Subject Name of the client certificate. - */ - id: PrincipalId | undefined; - createdAt: - | string - | undefined; - /** - * Maps a Tenant ID to a list of ACL's that the Principal has permission to - * execute *within that Tenant* - */ - perTenantAcls: { [key: string]: ServerACLs }; - /** Sets permissions that this Principal has *for any Tenant* in the LH Cluster. */ - globalAcls: ServerACLs | undefined; -} - -export interface Principal_PerTenantAclsEntry { - key: string; - value: ServerACLs | undefined; -} - -/** This is a GlobalGetable */ -export interface Tenant { - id: - | TenantId - | undefined; - /** Future versions will include quotas on a per-Tenant basis. */ - createdAt: string | undefined; -} - -export interface ServerACLs { - acls: ServerACL[]; -} - -export interface ServerACL { - resources: ACLResource[]; - allowedActions: ACLAction[]; - name?: string | undefined; - prefix?: string | undefined; -} - -export interface PutPrincipalRequest { - id: string; - perTenantAcls: { [key: string]: ServerACLs }; - globalAcls: ServerACLs | undefined; - overwrite: boolean; -} - -export interface PutPrincipalRequest_PerTenantAclsEntry { - key: string; - value: ServerACLs | undefined; -} - -export interface DeletePrincipalRequest { - id: string; -} - -export interface PutTenantRequest { - id: string; -} - -function createBasePrincipal(): Principal { - return { id: undefined, createdAt: undefined, perTenantAcls: {}, globalAcls: undefined }; -} - -export const Principal = { - encode(message: Principal, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - PrincipalId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(18).fork()).ldelim(); - } - Object.entries(message.perTenantAcls).forEach(([key, value]) => { - Principal_PerTenantAclsEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).ldelim(); - }); - if (message.globalAcls !== undefined) { - ServerACLs.encode(message.globalAcls, writer.uint32(34).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Principal { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePrincipal(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = PrincipalId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 26) { - break; - } - - const entry3 = Principal_PerTenantAclsEntry.decode(reader, reader.uint32()); - if (entry3.value !== undefined) { - message.perTenantAcls[entry3.key] = entry3.value; - } - continue; - case 4: - if (tag !== 34) { - break; - } - - message.globalAcls = ServerACLs.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): Principal { - return { - id: isSet(object.id) ? PrincipalId.fromJSON(object.id) : undefined, - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - perTenantAcls: isObject(object.perTenantAcls) - ? Object.entries(object.perTenantAcls).reduce<{ [key: string]: ServerACLs }>((acc, [key, value]) => { - acc[key] = ServerACLs.fromJSON(value); - return acc; - }, {}) - : {}, - globalAcls: isSet(object.globalAcls) ? ServerACLs.fromJSON(object.globalAcls) : undefined, - }; - }, - - toJSON(message: Principal): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = PrincipalId.toJSON(message.id); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - if (message.perTenantAcls) { - const entries = Object.entries(message.perTenantAcls); - if (entries.length > 0) { - obj.perTenantAcls = {}; - entries.forEach(([k, v]) => { - obj.perTenantAcls[k] = ServerACLs.toJSON(v); - }); - } - } - if (message.globalAcls !== undefined) { - obj.globalAcls = ServerACLs.toJSON(message.globalAcls); - } - return obj; - }, - - create, I>>(base?: I): Principal { - return Principal.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Principal { - const message = createBasePrincipal(); - message.id = (object.id !== undefined && object.id !== null) ? PrincipalId.fromPartial(object.id) : undefined; - message.createdAt = object.createdAt ?? undefined; - message.perTenantAcls = Object.entries(object.perTenantAcls ?? {}).reduce<{ [key: string]: ServerACLs }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = ServerACLs.fromPartial(value); - } - return acc; - }, - {}, - ); - message.globalAcls = (object.globalAcls !== undefined && object.globalAcls !== null) - ? ServerACLs.fromPartial(object.globalAcls) - : undefined; - return message; - }, -}; - -function createBasePrincipal_PerTenantAclsEntry(): Principal_PerTenantAclsEntry { - return { key: "", value: undefined }; -} - -export const Principal_PerTenantAclsEntry = { - encode(message: Principal_PerTenantAclsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - ServerACLs.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Principal_PerTenantAclsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePrincipal_PerTenantAclsEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = ServerACLs.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): Principal_PerTenantAclsEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? ServerACLs.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: Principal_PerTenantAclsEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = ServerACLs.toJSON(message.value); - } - return obj; - }, - - create, I>>(base?: I): Principal_PerTenantAclsEntry { - return Principal_PerTenantAclsEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Principal_PerTenantAclsEntry { - const message = createBasePrincipal_PerTenantAclsEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? ServerACLs.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseTenant(): Tenant { - return { id: undefined, createdAt: undefined }; -} - -export const Tenant = { - encode(message: Tenant, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - TenantId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Tenant { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTenant(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = TenantId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): Tenant { - return { - id: isSet(object.id) ? TenantId.fromJSON(object.id) : undefined, - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - }; - }, - - toJSON(message: Tenant): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = TenantId.toJSON(message.id); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - return obj; - }, - - create, I>>(base?: I): Tenant { - return Tenant.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Tenant { - const message = createBaseTenant(); - message.id = (object.id !== undefined && object.id !== null) ? TenantId.fromPartial(object.id) : undefined; - message.createdAt = object.createdAt ?? undefined; - return message; - }, -}; - -function createBaseServerACLs(): ServerACLs { - return { acls: [] }; -} - -export const ServerACLs = { - encode(message: ServerACLs, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.acls) { - ServerACL.encode(v!, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ServerACLs { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseServerACLs(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.acls.push(ServerACL.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ServerACLs { - return { acls: globalThis.Array.isArray(object?.acls) ? object.acls.map((e: any) => ServerACL.fromJSON(e)) : [] }; - }, - - toJSON(message: ServerACLs): unknown { - const obj: any = {}; - if (message.acls?.length) { - obj.acls = message.acls.map((e) => ServerACL.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): ServerACLs { - return ServerACLs.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ServerACLs { - const message = createBaseServerACLs(); - message.acls = object.acls?.map((e) => ServerACL.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseServerACL(): ServerACL { - return { resources: [], allowedActions: [], name: undefined, prefix: undefined }; -} - -export const ServerACL = { - encode(message: ServerACL, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - writer.uint32(10).fork(); - for (const v of message.resources) { - writer.int32(aCLResourceToNumber(v)); - } - writer.ldelim(); - writer.uint32(18).fork(); - for (const v of message.allowedActions) { - writer.int32(aCLActionToNumber(v)); - } - writer.ldelim(); - if (message.name !== undefined) { - writer.uint32(26).string(message.name); - } - if (message.prefix !== undefined) { - writer.uint32(34).string(message.prefix); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ServerACL { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseServerACL(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag === 8) { - message.resources.push(aCLResourceFromJSON(reader.int32())); - - continue; - } - - if (tag === 10) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.resources.push(aCLResourceFromJSON(reader.int32())); - } - - continue; - } - - break; - case 2: - if (tag === 16) { - message.allowedActions.push(aCLActionFromJSON(reader.int32())); - - continue; - } - - if (tag === 18) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.allowedActions.push(aCLActionFromJSON(reader.int32())); - } - - continue; - } - - break; - case 3: - if (tag !== 26) { - break; - } - - message.name = reader.string(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.prefix = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ServerACL { - return { - resources: globalThis.Array.isArray(object?.resources) - ? object.resources.map((e: any) => aCLResourceFromJSON(e)) - : [], - allowedActions: globalThis.Array.isArray(object?.allowedActions) - ? object.allowedActions.map((e: any) => aCLActionFromJSON(e)) - : [], - name: isSet(object.name) ? globalThis.String(object.name) : undefined, - prefix: isSet(object.prefix) ? globalThis.String(object.prefix) : undefined, - }; - }, - - toJSON(message: ServerACL): unknown { - const obj: any = {}; - if (message.resources?.length) { - obj.resources = message.resources.map((e) => aCLResourceToJSON(e)); - } - if (message.allowedActions?.length) { - obj.allowedActions = message.allowedActions.map((e) => aCLActionToJSON(e)); - } - if (message.name !== undefined) { - obj.name = message.name; - } - if (message.prefix !== undefined) { - obj.prefix = message.prefix; - } - return obj; - }, - - create, I>>(base?: I): ServerACL { - return ServerACL.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ServerACL { - const message = createBaseServerACL(); - message.resources = object.resources?.map((e) => e) || []; - message.allowedActions = object.allowedActions?.map((e) => e) || []; - message.name = object.name ?? undefined; - message.prefix = object.prefix ?? undefined; - return message; - }, -}; - -function createBasePutPrincipalRequest(): PutPrincipalRequest { - return { id: "", perTenantAcls: {}, globalAcls: undefined, overwrite: false }; -} - -export const PutPrincipalRequest = { - encode(message: PutPrincipalRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== "") { - writer.uint32(10).string(message.id); - } - Object.entries(message.perTenantAcls).forEach(([key, value]) => { - PutPrincipalRequest_PerTenantAclsEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).ldelim(); - }); - if (message.globalAcls !== undefined) { - ServerACLs.encode(message.globalAcls, writer.uint32(26).fork()).ldelim(); - } - if (message.overwrite !== false) { - writer.uint32(40).bool(message.overwrite); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PutPrincipalRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePutPrincipalRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - const entry2 = PutPrincipalRequest_PerTenantAclsEntry.decode(reader, reader.uint32()); - if (entry2.value !== undefined) { - message.perTenantAcls[entry2.key] = entry2.value; - } - continue; - case 3: - if (tag !== 26) { - break; - } - - message.globalAcls = ServerACLs.decode(reader, reader.uint32()); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.overwrite = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PutPrincipalRequest { - return { - id: isSet(object.id) ? globalThis.String(object.id) : "", - perTenantAcls: isObject(object.perTenantAcls) - ? Object.entries(object.perTenantAcls).reduce<{ [key: string]: ServerACLs }>((acc, [key, value]) => { - acc[key] = ServerACLs.fromJSON(value); - return acc; - }, {}) - : {}, - globalAcls: isSet(object.globalAcls) ? ServerACLs.fromJSON(object.globalAcls) : undefined, - overwrite: isSet(object.overwrite) ? globalThis.Boolean(object.overwrite) : false, - }; - }, - - toJSON(message: PutPrincipalRequest): unknown { - const obj: any = {}; - if (message.id !== "") { - obj.id = message.id; - } - if (message.perTenantAcls) { - const entries = Object.entries(message.perTenantAcls); - if (entries.length > 0) { - obj.perTenantAcls = {}; - entries.forEach(([k, v]) => { - obj.perTenantAcls[k] = ServerACLs.toJSON(v); - }); - } - } - if (message.globalAcls !== undefined) { - obj.globalAcls = ServerACLs.toJSON(message.globalAcls); - } - if (message.overwrite !== false) { - obj.overwrite = message.overwrite; - } - return obj; - }, - - create, I>>(base?: I): PutPrincipalRequest { - return PutPrincipalRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PutPrincipalRequest { - const message = createBasePutPrincipalRequest(); - message.id = object.id ?? ""; - message.perTenantAcls = Object.entries(object.perTenantAcls ?? {}).reduce<{ [key: string]: ServerACLs }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = ServerACLs.fromPartial(value); - } - return acc; - }, - {}, - ); - message.globalAcls = (object.globalAcls !== undefined && object.globalAcls !== null) - ? ServerACLs.fromPartial(object.globalAcls) - : undefined; - message.overwrite = object.overwrite ?? false; - return message; - }, -}; - -function createBasePutPrincipalRequest_PerTenantAclsEntry(): PutPrincipalRequest_PerTenantAclsEntry { - return { key: "", value: undefined }; -} - -export const PutPrincipalRequest_PerTenantAclsEntry = { - encode(message: PutPrincipalRequest_PerTenantAclsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - ServerACLs.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PutPrincipalRequest_PerTenantAclsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePutPrincipalRequest_PerTenantAclsEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = ServerACLs.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PutPrincipalRequest_PerTenantAclsEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? ServerACLs.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: PutPrincipalRequest_PerTenantAclsEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = ServerACLs.toJSON(message.value); - } - return obj; - }, - - create, I>>( - base?: I, - ): PutPrincipalRequest_PerTenantAclsEntry { - return PutPrincipalRequest_PerTenantAclsEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): PutPrincipalRequest_PerTenantAclsEntry { - const message = createBasePutPrincipalRequest_PerTenantAclsEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? ServerACLs.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseDeletePrincipalRequest(): DeletePrincipalRequest { - return { id: "" }; -} - -export const DeletePrincipalRequest = { - encode(message: DeletePrincipalRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== "") { - writer.uint32(10).string(message.id); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): DeletePrincipalRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDeletePrincipalRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): DeletePrincipalRequest { - return { id: isSet(object.id) ? globalThis.String(object.id) : "" }; - }, - - toJSON(message: DeletePrincipalRequest): unknown { - const obj: any = {}; - if (message.id !== "") { - obj.id = message.id; - } - return obj; - }, - - create, I>>(base?: I): DeletePrincipalRequest { - return DeletePrincipalRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): DeletePrincipalRequest { - const message = createBaseDeletePrincipalRequest(); - message.id = object.id ?? ""; - return message; - }, -}; - -function createBasePutTenantRequest(): PutTenantRequest { - return { id: "" }; -} - -export const PutTenantRequest = { - encode(message: PutTenantRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== "") { - writer.uint32(10).string(message.id); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PutTenantRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePutTenantRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PutTenantRequest { - return { id: isSet(object.id) ? globalThis.String(object.id) : "" }; - }, - - toJSON(message: PutTenantRequest): unknown { - const obj: any = {}; - if (message.id !== "") { - obj.id = message.id; - } - return obj; - }, - - create, I>>(base?: I): PutTenantRequest { - return PutTenantRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PutTenantRequest { - const message = createBasePutTenantRequest(); - message.id = object.id ?? ""; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function isObject(value: any): boolean { - return typeof value === "object" && value !== null; -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/common_enums.ts b/dashboard/apps/web/littlehorse-public-api/common_enums.ts deleted file mode 100644 index 8a9103670..000000000 --- a/dashboard/apps/web/littlehorse-public-api/common_enums.ts +++ /dev/null @@ -1,531 +0,0 @@ -/* eslint-disable */ - -export const protobufPackage = "littlehorse"; - -/** Status used for WfRun, ThreadRun, and NodeRun */ -export enum LHStatus { - STARTING = "STARTING", - RUNNING = "RUNNING", - COMPLETED = "COMPLETED", - HALTING = "HALTING", - HALTED = "HALTED", - ERROR = "ERROR", - EXCEPTION = "EXCEPTION", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function lHStatusFromJSON(object: any): LHStatus { - switch (object) { - case 0: - case "STARTING": - return LHStatus.STARTING; - case 1: - case "RUNNING": - return LHStatus.RUNNING; - case 2: - case "COMPLETED": - return LHStatus.COMPLETED; - case 3: - case "HALTING": - return LHStatus.HALTING; - case 4: - case "HALTED": - return LHStatus.HALTED; - case 5: - case "ERROR": - return LHStatus.ERROR; - case 6: - case "EXCEPTION": - return LHStatus.EXCEPTION; - case -1: - case "UNRECOGNIZED": - default: - return LHStatus.UNRECOGNIZED; - } -} - -export function lHStatusToJSON(object: LHStatus): string { - switch (object) { - case LHStatus.STARTING: - return "STARTING"; - case LHStatus.RUNNING: - return "RUNNING"; - case LHStatus.COMPLETED: - return "COMPLETED"; - case LHStatus.HALTING: - return "HALTING"; - case LHStatus.HALTED: - return "HALTED"; - case LHStatus.ERROR: - return "ERROR"; - case LHStatus.EXCEPTION: - return "EXCEPTION"; - case LHStatus.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function lHStatusToNumber(object: LHStatus): number { - switch (object) { - case LHStatus.STARTING: - return 0; - case LHStatus.RUNNING: - return 1; - case LHStatus.COMPLETED: - return 2; - case LHStatus.HALTING: - return 3; - case LHStatus.HALTED: - return 4; - case LHStatus.ERROR: - return 5; - case LHStatus.EXCEPTION: - return 6; - case LHStatus.UNRECOGNIZED: - default: - return -1; - } -} - -/** Status of a Metadata Object, such as WfSpec or TaskDef */ -export enum MetadataStatus { - /** ACTIVE - ACTIVE means the object can be used. */ - ACTIVE = "ACTIVE", - /** - * ARCHIVED - An ARCHIVED WfSpec can no longer be used to create new WfRun's, but - * existing WfRun's will be allowed to run to completion. - */ - ARCHIVED = "ARCHIVED", - /** - * TERMINATING - A TERMINATING WfSpec is actively deleting all running WfRun's, and will - * self-destruct once all of its child WfRun's are terminated. - */ - TERMINATING = "TERMINATING", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function metadataStatusFromJSON(object: any): MetadataStatus { - switch (object) { - case 0: - case "ACTIVE": - return MetadataStatus.ACTIVE; - case 1: - case "ARCHIVED": - return MetadataStatus.ARCHIVED; - case 2: - case "TERMINATING": - return MetadataStatus.TERMINATING; - case -1: - case "UNRECOGNIZED": - default: - return MetadataStatus.UNRECOGNIZED; - } -} - -export function metadataStatusToJSON(object: MetadataStatus): string { - switch (object) { - case MetadataStatus.ACTIVE: - return "ACTIVE"; - case MetadataStatus.ARCHIVED: - return "ARCHIVED"; - case MetadataStatus.TERMINATING: - return "TERMINATING"; - case MetadataStatus.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function metadataStatusToNumber(object: MetadataStatus): number { - switch (object) { - case MetadataStatus.ACTIVE: - return 0; - case MetadataStatus.ARCHIVED: - return 1; - case MetadataStatus.TERMINATING: - return 2; - case MetadataStatus.UNRECOGNIZED: - default: - return -1; - } -} - -/** Status of a TaskRun. */ -export enum TaskStatus { - /** TASK_SCHEDULED - Scheduled in the Task Queue but not yet picked up by a Task Worker. */ - TASK_SCHEDULED = "TASK_SCHEDULED", - /** TASK_RUNNING - Picked up by a Task Worker, but not yet reported or timed out. */ - TASK_RUNNING = "TASK_RUNNING", - /** TASK_SUCCESS - Successfully completed. */ - TASK_SUCCESS = "TASK_SUCCESS", - /** TASK_FAILED - Task Worker reported a technical failure while attempting to execute the TaskRun */ - TASK_FAILED = "TASK_FAILED", - /** TASK_TIMEOUT - Task Worker did not report a result in time. */ - TASK_TIMEOUT = "TASK_TIMEOUT", - /** TASK_OUTPUT_SERIALIZING_ERROR - Task Worker reported that it was unable to serialize the output of the TaskRun. */ - TASK_OUTPUT_SERIALIZING_ERROR = "TASK_OUTPUT_SERIALIZING_ERROR", - /** - * TASK_INPUT_VAR_SUB_ERROR - Task Worker was unable to deserialize the input variables into appropriate language-specific - * objects to pass into the Task Function - */ - TASK_INPUT_VAR_SUB_ERROR = "TASK_INPUT_VAR_SUB_ERROR", - /** TASK_EXCEPTION - Task Function business logic determined that there was a business exception. */ - TASK_EXCEPTION = "TASK_EXCEPTION", - /** - * TASK_PENDING - Refers to a TaskAttempt that is not yet scheduled. This happens when using retries - * with an ExponentialBackoffRetryPolicy: the TaskAttempt isn't supposed to be scheduled - * until it "matures", but it does already exist. - */ - TASK_PENDING = "TASK_PENDING", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function taskStatusFromJSON(object: any): TaskStatus { - switch (object) { - case 0: - case "TASK_SCHEDULED": - return TaskStatus.TASK_SCHEDULED; - case 1: - case "TASK_RUNNING": - return TaskStatus.TASK_RUNNING; - case 2: - case "TASK_SUCCESS": - return TaskStatus.TASK_SUCCESS; - case 3: - case "TASK_FAILED": - return TaskStatus.TASK_FAILED; - case 4: - case "TASK_TIMEOUT": - return TaskStatus.TASK_TIMEOUT; - case 5: - case "TASK_OUTPUT_SERIALIZING_ERROR": - return TaskStatus.TASK_OUTPUT_SERIALIZING_ERROR; - case 6: - case "TASK_INPUT_VAR_SUB_ERROR": - return TaskStatus.TASK_INPUT_VAR_SUB_ERROR; - case 8: - case "TASK_EXCEPTION": - return TaskStatus.TASK_EXCEPTION; - case 9: - case "TASK_PENDING": - return TaskStatus.TASK_PENDING; - case -1: - case "UNRECOGNIZED": - default: - return TaskStatus.UNRECOGNIZED; - } -} - -export function taskStatusToJSON(object: TaskStatus): string { - switch (object) { - case TaskStatus.TASK_SCHEDULED: - return "TASK_SCHEDULED"; - case TaskStatus.TASK_RUNNING: - return "TASK_RUNNING"; - case TaskStatus.TASK_SUCCESS: - return "TASK_SUCCESS"; - case TaskStatus.TASK_FAILED: - return "TASK_FAILED"; - case TaskStatus.TASK_TIMEOUT: - return "TASK_TIMEOUT"; - case TaskStatus.TASK_OUTPUT_SERIALIZING_ERROR: - return "TASK_OUTPUT_SERIALIZING_ERROR"; - case TaskStatus.TASK_INPUT_VAR_SUB_ERROR: - return "TASK_INPUT_VAR_SUB_ERROR"; - case TaskStatus.TASK_EXCEPTION: - return "TASK_EXCEPTION"; - case TaskStatus.TASK_PENDING: - return "TASK_PENDING"; - case TaskStatus.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function taskStatusToNumber(object: TaskStatus): number { - switch (object) { - case TaskStatus.TASK_SCHEDULED: - return 0; - case TaskStatus.TASK_RUNNING: - return 1; - case TaskStatus.TASK_SUCCESS: - return 2; - case TaskStatus.TASK_FAILED: - return 3; - case TaskStatus.TASK_TIMEOUT: - return 4; - case TaskStatus.TASK_OUTPUT_SERIALIZING_ERROR: - return 5; - case TaskStatus.TASK_INPUT_VAR_SUB_ERROR: - return 6; - case TaskStatus.TASK_EXCEPTION: - return 8; - case TaskStatus.TASK_PENDING: - return 9; - case TaskStatus.UNRECOGNIZED: - default: - return -1; - } -} - -/** Metrics */ -export enum MetricsWindowLength { - MINUTES_5 = "MINUTES_5", - HOURS_2 = "HOURS_2", - DAYS_1 = "DAYS_1", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function metricsWindowLengthFromJSON(object: any): MetricsWindowLength { - switch (object) { - case 0: - case "MINUTES_5": - return MetricsWindowLength.MINUTES_5; - case 1: - case "HOURS_2": - return MetricsWindowLength.HOURS_2; - case 2: - case "DAYS_1": - return MetricsWindowLength.DAYS_1; - case -1: - case "UNRECOGNIZED": - default: - return MetricsWindowLength.UNRECOGNIZED; - } -} - -export function metricsWindowLengthToJSON(object: MetricsWindowLength): string { - switch (object) { - case MetricsWindowLength.MINUTES_5: - return "MINUTES_5"; - case MetricsWindowLength.HOURS_2: - return "HOURS_2"; - case MetricsWindowLength.DAYS_1: - return "DAYS_1"; - case MetricsWindowLength.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function metricsWindowLengthToNumber(object: MetricsWindowLength): number { - switch (object) { - case MetricsWindowLength.MINUTES_5: - return 0; - case MetricsWindowLength.HOURS_2: - return 1; - case MetricsWindowLength.DAYS_1: - return 2; - case MetricsWindowLength.UNRECOGNIZED: - default: - return -1; - } -} - -/** - * Type of a Varaible in LittleHorse. Corresponds to the possible value type's of a - * VariableValue. - */ -export enum VariableType { - /** JSON_OBJ - An object represented as a json string. */ - JSON_OBJ = "JSON_OBJ", - /** JSON_ARR - A list represented as a json array string. */ - JSON_ARR = "JSON_ARR", - /** DOUBLE - A 64-bit floating point number. */ - DOUBLE = "DOUBLE", - /** BOOL - A boolean */ - BOOL = "BOOL", - /** STR - A string */ - STR = "STR", - /** INT - A 64-bit integer */ - INT = "INT", - /** BYTES - A byte array */ - BYTES = "BYTES", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function variableTypeFromJSON(object: any): VariableType { - switch (object) { - case 0: - case "JSON_OBJ": - return VariableType.JSON_OBJ; - case 1: - case "JSON_ARR": - return VariableType.JSON_ARR; - case 2: - case "DOUBLE": - return VariableType.DOUBLE; - case 3: - case "BOOL": - return VariableType.BOOL; - case 4: - case "STR": - return VariableType.STR; - case 5: - case "INT": - return VariableType.INT; - case 6: - case "BYTES": - return VariableType.BYTES; - case -1: - case "UNRECOGNIZED": - default: - return VariableType.UNRECOGNIZED; - } -} - -export function variableTypeToJSON(object: VariableType): string { - switch (object) { - case VariableType.JSON_OBJ: - return "JSON_OBJ"; - case VariableType.JSON_ARR: - return "JSON_ARR"; - case VariableType.DOUBLE: - return "DOUBLE"; - case VariableType.BOOL: - return "BOOL"; - case VariableType.STR: - return "STR"; - case VariableType.INT: - return "INT"; - case VariableType.BYTES: - return "BYTES"; - case VariableType.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function variableTypeToNumber(object: VariableType): number { - switch (object) { - case VariableType.JSON_OBJ: - return 0; - case VariableType.JSON_ARR: - return 1; - case VariableType.DOUBLE: - return 2; - case VariableType.BOOL: - return 3; - case VariableType.STR: - return 4; - case VariableType.INT: - return 5; - case VariableType.BYTES: - return 6; - case VariableType.UNRECOGNIZED: - default: - return -1; - } -} - -/** This enum is all of the types of technical failure that can occur in a WfRun. */ -export enum LHErrorType { - /** CHILD_FAILURE - A child ThreadRun failed with a technical ERROR. */ - CHILD_FAILURE = "CHILD_FAILURE", - /** VAR_SUB_ERROR - Failed substituting input variables into a NodeRun. */ - VAR_SUB_ERROR = "VAR_SUB_ERROR", - /** VAR_MUTATION_ERROR - Failed mutating variables after a NodeRun successfully completed. */ - VAR_MUTATION_ERROR = "VAR_MUTATION_ERROR", - /** USER_TASK_CANCELLED - A UserTaskRun was cancelled (EVOLVING: this will become a Business EXCEPTION) */ - USER_TASK_CANCELLED = "USER_TASK_CANCELLED", - /** TIMEOUT - A NodeRun failed due to a timeout. */ - TIMEOUT = "TIMEOUT", - /** TASK_FAILURE - A TaskRun failed due to an unexpected error. */ - TASK_FAILURE = "TASK_FAILURE", - /** VAR_ERROR - Wrapper for VAR_SUB_ERROR and VAR_MUTATION_ERROR */ - VAR_ERROR = "VAR_ERROR", - /** TASK_ERROR - Wrapper for TASK_FALIURE and TIMEOUT */ - TASK_ERROR = "TASK_ERROR", - /** INTERNAL_ERROR - An unexpected LittleHorse Internal error occurred. This is not expected to happen. */ - INTERNAL_ERROR = "INTERNAL_ERROR", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function lHErrorTypeFromJSON(object: any): LHErrorType { - switch (object) { - case 0: - case "CHILD_FAILURE": - return LHErrorType.CHILD_FAILURE; - case 1: - case "VAR_SUB_ERROR": - return LHErrorType.VAR_SUB_ERROR; - case 2: - case "VAR_MUTATION_ERROR": - return LHErrorType.VAR_MUTATION_ERROR; - case 3: - case "USER_TASK_CANCELLED": - return LHErrorType.USER_TASK_CANCELLED; - case 4: - case "TIMEOUT": - return LHErrorType.TIMEOUT; - case 5: - case "TASK_FAILURE": - return LHErrorType.TASK_FAILURE; - case 6: - case "VAR_ERROR": - return LHErrorType.VAR_ERROR; - case 7: - case "TASK_ERROR": - return LHErrorType.TASK_ERROR; - case 8: - case "INTERNAL_ERROR": - return LHErrorType.INTERNAL_ERROR; - case -1: - case "UNRECOGNIZED": - default: - return LHErrorType.UNRECOGNIZED; - } -} - -export function lHErrorTypeToJSON(object: LHErrorType): string { - switch (object) { - case LHErrorType.CHILD_FAILURE: - return "CHILD_FAILURE"; - case LHErrorType.VAR_SUB_ERROR: - return "VAR_SUB_ERROR"; - case LHErrorType.VAR_MUTATION_ERROR: - return "VAR_MUTATION_ERROR"; - case LHErrorType.USER_TASK_CANCELLED: - return "USER_TASK_CANCELLED"; - case LHErrorType.TIMEOUT: - return "TIMEOUT"; - case LHErrorType.TASK_FAILURE: - return "TASK_FAILURE"; - case LHErrorType.VAR_ERROR: - return "VAR_ERROR"; - case LHErrorType.TASK_ERROR: - return "TASK_ERROR"; - case LHErrorType.INTERNAL_ERROR: - return "INTERNAL_ERROR"; - case LHErrorType.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function lHErrorTypeToNumber(object: LHErrorType): number { - switch (object) { - case LHErrorType.CHILD_FAILURE: - return 0; - case LHErrorType.VAR_SUB_ERROR: - return 1; - case LHErrorType.VAR_MUTATION_ERROR: - return 2; - case LHErrorType.USER_TASK_CANCELLED: - return 3; - case LHErrorType.TIMEOUT: - return 4; - case LHErrorType.TASK_FAILURE: - return 5; - case LHErrorType.VAR_ERROR: - return 6; - case LHErrorType.TASK_ERROR: - return 7; - case LHErrorType.INTERNAL_ERROR: - return 8; - case LHErrorType.UNRECOGNIZED: - default: - return -1; - } -} diff --git a/dashboard/apps/web/littlehorse-public-api/common_wfspec.ts b/dashboard/apps/web/littlehorse-public-api/common_wfspec.ts deleted file mode 100644 index 21c9bf809..000000000 --- a/dashboard/apps/web/littlehorse-public-api/common_wfspec.ts +++ /dev/null @@ -1,1593 +0,0 @@ -/* eslint-disable */ -import Long from "long"; -import * as _m0 from "protobufjs/minimal"; -import { VariableType, variableTypeFromJSON, variableTypeToJSON, variableTypeToNumber } from "./common_enums"; -import { TaskDefId } from "./object_id"; -import { VariableValue } from "./variable"; - -export const protobufPackage = "littlehorse"; - -/** Enumerates the available operations to mutate a variable in a WfRun. */ -export enum VariableMutationType { - /** ASSIGN - Set the variable specified by the LHS to the value of the RHS. */ - ASSIGN = "ASSIGN", - /** ADD - Add the RHS to the LHS. */ - ADD = "ADD", - /** EXTEND - Append the RHS to the LHS (valid if the LHS is a STR or JSON_ARR) */ - EXTEND = "EXTEND", - /** SUBTRACT - Subtract the RHS from the LHS (both must be INT or DOUBLE) */ - SUBTRACT = "SUBTRACT", - /** MULTIPLY - Multiply the LHS by the RHS (both must be INT or DOUBLE) */ - MULTIPLY = "MULTIPLY", - /** DIVIDE - Divide the LHS by the RHS (both must be INT or DOUBLE) */ - DIVIDE = "DIVIDE", - /** REMOVE_IF_PRESENT - Remove any occurrences of RHS from LHS (LHS must be JSON_ARR) */ - REMOVE_IF_PRESENT = "REMOVE_IF_PRESENT", - /** REMOVE_INDEX - Remove item at index RHS from LHS (LHS must be JSON_ARR) */ - REMOVE_INDEX = "REMOVE_INDEX", - /** REMOVE_KEY - Remove the key specified by RHS from the LHS (LHS must be JSON_OBJ) */ - REMOVE_KEY = "REMOVE_KEY", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function variableMutationTypeFromJSON(object: any): VariableMutationType { - switch (object) { - case 0: - case "ASSIGN": - return VariableMutationType.ASSIGN; - case 1: - case "ADD": - return VariableMutationType.ADD; - case 2: - case "EXTEND": - return VariableMutationType.EXTEND; - case 3: - case "SUBTRACT": - return VariableMutationType.SUBTRACT; - case 4: - case "MULTIPLY": - return VariableMutationType.MULTIPLY; - case 5: - case "DIVIDE": - return VariableMutationType.DIVIDE; - case 6: - case "REMOVE_IF_PRESENT": - return VariableMutationType.REMOVE_IF_PRESENT; - case 7: - case "REMOVE_INDEX": - return VariableMutationType.REMOVE_INDEX; - case 8: - case "REMOVE_KEY": - return VariableMutationType.REMOVE_KEY; - case -1: - case "UNRECOGNIZED": - default: - return VariableMutationType.UNRECOGNIZED; - } -} - -export function variableMutationTypeToJSON(object: VariableMutationType): string { - switch (object) { - case VariableMutationType.ASSIGN: - return "ASSIGN"; - case VariableMutationType.ADD: - return "ADD"; - case VariableMutationType.EXTEND: - return "EXTEND"; - case VariableMutationType.SUBTRACT: - return "SUBTRACT"; - case VariableMutationType.MULTIPLY: - return "MULTIPLY"; - case VariableMutationType.DIVIDE: - return "DIVIDE"; - case VariableMutationType.REMOVE_IF_PRESENT: - return "REMOVE_IF_PRESENT"; - case VariableMutationType.REMOVE_INDEX: - return "REMOVE_INDEX"; - case VariableMutationType.REMOVE_KEY: - return "REMOVE_KEY"; - case VariableMutationType.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function variableMutationTypeToNumber(object: VariableMutationType): number { - switch (object) { - case VariableMutationType.ASSIGN: - return 0; - case VariableMutationType.ADD: - return 1; - case VariableMutationType.EXTEND: - return 2; - case VariableMutationType.SUBTRACT: - return 3; - case VariableMutationType.MULTIPLY: - return 4; - case VariableMutationType.DIVIDE: - return 5; - case VariableMutationType.REMOVE_IF_PRESENT: - return 6; - case VariableMutationType.REMOVE_INDEX: - return 7; - case VariableMutationType.REMOVE_KEY: - return 8; - case VariableMutationType.UNRECOGNIZED: - default: - return -1; - } -} - -/** Operator for comparing two values to create a boolean expression. */ -export enum Comparator { - /** LESS_THAN - Equivalent to `<`. Only valid for primitive types (no JSON_OBJ or JSON_ARR). */ - LESS_THAN = "LESS_THAN", - /** GREATER_THAN - Equivalent to `>`. Only valid for primitive types (no JSON_OBJ or JSON_ARR). */ - GREATER_THAN = "GREATER_THAN", - /** LESS_THAN_EQ - Equivalent to `<=`. Only valid for primitive types (no JSON_OBJ or JSON_ARR). */ - LESS_THAN_EQ = "LESS_THAN_EQ", - /** GREATER_THAN_EQ - Equivalent to `>=`. Only valid for primitive types (no JSON_OBJ or JSON_ARR). */ - GREATER_THAN_EQ = "GREATER_THAN_EQ", - /** - * EQUALS - This is valid for any variable type, and is similar to .equals() in Java. - * - * One note: if the RHS is a different type from the LHS, then LittleHorse will - * try to cast the RHS to the same type as the LHS. If the cast fails, then the - * ThreadRun fails with a VAR_SUB_ERROR. - */ - EQUALS = "EQUALS", - /** NOT_EQUALS - This is the inverse of `EQUALS` */ - NOT_EQUALS = "NOT_EQUALS", - /** - * IN - Only valid if the RHS is a JSON_OBJ or JSON_ARR. Valid for any type on the LHS. - * - * For the JSON_OBJ type, this returns true if the LHS is equal to a *KEY* in the - * RHS. For the JSON_ARR type, it returns true if one of the elements of the RHS - * is equal to the LHS. - */ - IN = "IN", - /** NOT_IN - The inverse of IN. */ - NOT_IN = "NOT_IN", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function comparatorFromJSON(object: any): Comparator { - switch (object) { - case 0: - case "LESS_THAN": - return Comparator.LESS_THAN; - case 1: - case "GREATER_THAN": - return Comparator.GREATER_THAN; - case 2: - case "LESS_THAN_EQ": - return Comparator.LESS_THAN_EQ; - case 3: - case "GREATER_THAN_EQ": - return Comparator.GREATER_THAN_EQ; - case 4: - case "EQUALS": - return Comparator.EQUALS; - case 5: - case "NOT_EQUALS": - return Comparator.NOT_EQUALS; - case 6: - case "IN": - return Comparator.IN; - case 7: - case "NOT_IN": - return Comparator.NOT_IN; - case -1: - case "UNRECOGNIZED": - default: - return Comparator.UNRECOGNIZED; - } -} - -export function comparatorToJSON(object: Comparator): string { - switch (object) { - case Comparator.LESS_THAN: - return "LESS_THAN"; - case Comparator.GREATER_THAN: - return "GREATER_THAN"; - case Comparator.LESS_THAN_EQ: - return "LESS_THAN_EQ"; - case Comparator.GREATER_THAN_EQ: - return "GREATER_THAN_EQ"; - case Comparator.EQUALS: - return "EQUALS"; - case Comparator.NOT_EQUALS: - return "NOT_EQUALS"; - case Comparator.IN: - return "IN"; - case Comparator.NOT_IN: - return "NOT_IN"; - case Comparator.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function comparatorToNumber(object: Comparator): number { - switch (object) { - case Comparator.LESS_THAN: - return 0; - case Comparator.GREATER_THAN: - return 1; - case Comparator.LESS_THAN_EQ: - return 2; - case Comparator.GREATER_THAN_EQ: - return 3; - case Comparator.EQUALS: - return 4; - case Comparator.NOT_EQUALS: - return 5; - case Comparator.IN: - return 6; - case Comparator.NOT_IN: - return 7; - case Comparator.UNRECOGNIZED: - default: - return -1; - } -} - -/** - * A VariableAssignment is used within a WfSpec to determine how a value should be - * assigned in the context of a specific WfRun. For example, in a TASK node, you - * use a VariableAssignment for each input parameter to determine how the value - * is set. - * - * Note that the VariableAssignment is normally handled by the SDK; you shouldn't - * have to worry about this in daily LittleHorse usage. - */ -export interface VariableAssignment { - /** - * If you provide a `variable_name` and the specified variable is JSON_OBJ or - * JSON_ARR type, then you may also provide a json_path which makes the VariableAssignment - * resolve to the specified field. - */ - jsonPath?: - | string - | undefined; - /** Assign the value from a variable. */ - variableName?: - | string - | undefined; - /** Assign a literal value */ - literalValue?: - | VariableValue - | undefined; - /** Assign a format string */ - formatString?: VariableAssignment_FormatString | undefined; -} - -/** A FormatString formats a template String with values from the WfRun. */ -export interface VariableAssignment_FormatString { - /** - * A VariableAssignment which must resolve to a String that has format args. - * A valid string is "This is a format string with three args: {0}, {1}, {2}" - */ - format: - | VariableAssignment - | undefined; - /** VariableAssignments which fill out the args. */ - args: VariableAssignment[]; -} - -/** - * A VariableMutation defines a modification made to one of a ThreadRun's variables. - * The LHS determines the variable that is modified; the operation determines how - * it is modified, and the RHS is the input to the operation. - * - * Day-to-day users of LittleHorse generally don't interact with this structure unless - * they are writing their own WfSpec SDK. - */ -export interface VariableMutation { - /** The name of the variable to mutate */ - lhsName: string; - /** - * For JSON_ARR and JSON_OBJ variables, this allows you to optionally mutate - * a specific sub-field of the variable. - */ - lhsJsonPath?: - | string - | undefined; - /** Defines the operation that we are executing. */ - operation: VariableMutationType; - /** - * Set the source_variable as the RHS to use another variable from the workflow to - * as the RHS/ - */ - sourceVariable?: - | VariableAssignment - | undefined; - /** Use a literal value as the RHS. */ - literalValue?: - | VariableValue - | undefined; - /** Use the output of the current node as the RHS. */ - nodeOutput?: VariableMutation_NodeOutputSource | undefined; -} - -/** Specifies to use the output of a NodeRun as the RHS. */ -export interface VariableMutation_NodeOutputSource { - /** Use this specific field from a JSON output */ - jsonpath?: string | undefined; -} - -/** Declares a Variable. */ -export interface VariableDef { - /** The Type of the variable. */ - type: VariableType; - /** The name of the variable. */ - name: string; - /** - * Optional default value if the variable isn't set; for example, in a ThreadRun - * if you start a ThreadRun or WfRun without passing a variable in, then this is - * used. - */ - defaultValue?: VariableValue | undefined; -} - -/** - * A UTActionTrigger triggers an action upon certain lifecycle hooks - * in a User Task. Actions include: - * - re-assign the User Task Run - * - cancel the User Task Run - * - execute a Reminder Task - * - * Hooks include: - * - Upon creation of the UserTaskRun - * - Upon rescheduling the UserTaskRun - */ -export interface UTActionTrigger { - task?: UTActionTrigger_UTATask | undefined; - cancel?: - | UTActionTrigger_UTACancel - | undefined; - /** later on, might enable scheduling entire ThreadRuns */ - reassign?: - | UTActionTrigger_UTAReassign - | undefined; - /** - * The Action is triggered some time after the Hook matures. The delay is controlled - * by this field. - */ - delaySeconds: - | VariableAssignment - | undefined; - /** The hook on which this UserTaskAction is scheduled. */ - hook: UTActionTrigger_UTHook; -} - -/** Enumerates the different lifecycle hooks that can cause the timer to start running. */ -export enum UTActionTrigger_UTHook { - /** - * ON_ARRIVAL - The hook should be scheduled `delay_seconds` after the UserTaskRun is created. This - * hook only causes the action to be scheduled once. - */ - ON_ARRIVAL = "ON_ARRIVAL", - /** - * ON_TASK_ASSIGNED - The hook should be scheduled `delay_seconds` after the ownership of the UserTaskRun - * changes. This hook causes the Action to be scheduled one or more times. The first - * time is scheduled when the UserTaskRun is created, since we treat the change from - * "UserTaskRun is nonexistent" to "UserTaskRun is owned by a userId or userGroup" as - * a change in ownership. - */ - ON_TASK_ASSIGNED = "ON_TASK_ASSIGNED", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function uTActionTrigger_UTHookFromJSON(object: any): UTActionTrigger_UTHook { - switch (object) { - case 0: - case "ON_ARRIVAL": - return UTActionTrigger_UTHook.ON_ARRIVAL; - case 1: - case "ON_TASK_ASSIGNED": - return UTActionTrigger_UTHook.ON_TASK_ASSIGNED; - case -1: - case "UNRECOGNIZED": - default: - return UTActionTrigger_UTHook.UNRECOGNIZED; - } -} - -export function uTActionTrigger_UTHookToJSON(object: UTActionTrigger_UTHook): string { - switch (object) { - case UTActionTrigger_UTHook.ON_ARRIVAL: - return "ON_ARRIVAL"; - case UTActionTrigger_UTHook.ON_TASK_ASSIGNED: - return "ON_TASK_ASSIGNED"; - case UTActionTrigger_UTHook.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function uTActionTrigger_UTHookToNumber(object: UTActionTrigger_UTHook): number { - switch (object) { - case UTActionTrigger_UTHook.ON_ARRIVAL: - return 0; - case UTActionTrigger_UTHook.ON_TASK_ASSIGNED: - return 1; - case UTActionTrigger_UTHook.UNRECOGNIZED: - default: - return -1; - } -} - -/** A UserTaskAction that causes a UserTaskRun to be CANCELLED when it fires. */ -export interface UTActionTrigger_UTACancel { -} - -/** A UserTaskAction that causes a TaskRun to be scheduled when it fires. */ -export interface UTActionTrigger_UTATask { - /** The specification of the Task to schedule. */ - task: - | TaskNode - | undefined; - /** EXPERIMENTAL: Any variables in the ThreadRun which we should mutate. */ - mutations: VariableMutation[]; -} - -/** A UserTaskAction that causes a UserTaskRun to be reassigned when it fires. */ -export interface UTActionTrigger_UTAReassign { - /** - * A variable assignment that resolves to a STR representing the new user_id. If - * not set, the user_id of the UserTaskRun will be un-set. - */ - userId?: - | VariableAssignment - | undefined; - /** - * A variable assignment that resolves to a STR representing the new user_group. If - * not set, the user_group of the UserTaskRun will be un-set. - */ - userGroup?: VariableAssignment | undefined; -} - -/** - * Defines an Exponential backoff policy for TaskRun retries. The delay for a retry - * attempt `N` is defined as: - * - * min(base_interval_ms * (multiplier ^(N-1)), max_delay_ms) - * - * Note that timers in LittleHorse have a resolution of about 500-1000 milliseconds, - * so timing is not exact. - */ -export interface ExponentialBackoffRetryPolicy { - /** - * Base delay in ms for the first retry. Note that in LittleHorse, timers have a - * resolution of 500-1000 milliseconds. Must be greater than zero. - */ - baseIntervalMs: number; - /** Maximum delay in milliseconds between retries. */ - maxDelayMs: number; - /** - * The multiplier to use in calculating the retry backoff policy. We recommend - * starting with 2.0. Must be at least 1.0. - */ - multiplier: number; -} - -/** Defines a TaskRun execution. Used in a Node and also in the UserTask Trigger Actions. */ -export interface TaskNode { - taskDefId?: TaskDefId | undefined; - dynamicTask?: - | VariableAssignment - | undefined; - /** - * How long until LittleHorse determines that the Task Worker had a technical ERROR if - * the worker does not yet reply to the Server. This is determined on a per-Attempt - * basis. - */ - timeoutSeconds: number; - /** - * Configures the amount of retries allowed on this TaskNode. - * - * Retryable errors include: - * - TASK_TIMEOUT: the TaskRun was started but the scheduler didn't hear back from the - * Task Worker in time. - * - TASK_FAILED: the Task Worker reported an unexpected *technical* ERROR when executing - * the Task Function. - * - * Other result codes are not retryable (including TASK_OUTPUT_SERIALIZING_ERROR, - * TASK_INPUT_VAR_SUB_ERROR, and TASK_EXCEPTION). - */ - retries: number; - /** If this field is set, then retries will use Exponential Backoff. */ - exponentialBackoff?: - | ExponentialBackoffRetryPolicy - | undefined; - /** Input variables into the TaskDef. */ - variables: VariableAssignment[]; -} - -function createBaseVariableAssignment(): VariableAssignment { - return { jsonPath: undefined, variableName: undefined, literalValue: undefined, formatString: undefined }; -} - -export const VariableAssignment = { - encode(message: VariableAssignment, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.jsonPath !== undefined) { - writer.uint32(10).string(message.jsonPath); - } - if (message.variableName !== undefined) { - writer.uint32(18).string(message.variableName); - } - if (message.literalValue !== undefined) { - VariableValue.encode(message.literalValue, writer.uint32(26).fork()).ldelim(); - } - if (message.formatString !== undefined) { - VariableAssignment_FormatString.encode(message.formatString, writer.uint32(34).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VariableAssignment { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariableAssignment(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.jsonPath = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.variableName = reader.string(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.literalValue = VariableValue.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.formatString = VariableAssignment_FormatString.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VariableAssignment { - return { - jsonPath: isSet(object.jsonPath) ? globalThis.String(object.jsonPath) : undefined, - variableName: isSet(object.variableName) ? globalThis.String(object.variableName) : undefined, - literalValue: isSet(object.literalValue) ? VariableValue.fromJSON(object.literalValue) : undefined, - formatString: isSet(object.formatString) - ? VariableAssignment_FormatString.fromJSON(object.formatString) - : undefined, - }; - }, - - toJSON(message: VariableAssignment): unknown { - const obj: any = {}; - if (message.jsonPath !== undefined) { - obj.jsonPath = message.jsonPath; - } - if (message.variableName !== undefined) { - obj.variableName = message.variableName; - } - if (message.literalValue !== undefined) { - obj.literalValue = VariableValue.toJSON(message.literalValue); - } - if (message.formatString !== undefined) { - obj.formatString = VariableAssignment_FormatString.toJSON(message.formatString); - } - return obj; - }, - - create, I>>(base?: I): VariableAssignment { - return VariableAssignment.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): VariableAssignment { - const message = createBaseVariableAssignment(); - message.jsonPath = object.jsonPath ?? undefined; - message.variableName = object.variableName ?? undefined; - message.literalValue = (object.literalValue !== undefined && object.literalValue !== null) - ? VariableValue.fromPartial(object.literalValue) - : undefined; - message.formatString = (object.formatString !== undefined && object.formatString !== null) - ? VariableAssignment_FormatString.fromPartial(object.formatString) - : undefined; - return message; - }, -}; - -function createBaseVariableAssignment_FormatString(): VariableAssignment_FormatString { - return { format: undefined, args: [] }; -} - -export const VariableAssignment_FormatString = { - encode(message: VariableAssignment_FormatString, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.format !== undefined) { - VariableAssignment.encode(message.format, writer.uint32(10).fork()).ldelim(); - } - for (const v of message.args) { - VariableAssignment.encode(v!, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VariableAssignment_FormatString { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariableAssignment_FormatString(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.format = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.args.push(VariableAssignment.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VariableAssignment_FormatString { - return { - format: isSet(object.format) ? VariableAssignment.fromJSON(object.format) : undefined, - args: globalThis.Array.isArray(object?.args) ? object.args.map((e: any) => VariableAssignment.fromJSON(e)) : [], - }; - }, - - toJSON(message: VariableAssignment_FormatString): unknown { - const obj: any = {}; - if (message.format !== undefined) { - obj.format = VariableAssignment.toJSON(message.format); - } - if (message.args?.length) { - obj.args = message.args.map((e) => VariableAssignment.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): VariableAssignment_FormatString { - return VariableAssignment_FormatString.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): VariableAssignment_FormatString { - const message = createBaseVariableAssignment_FormatString(); - message.format = (object.format !== undefined && object.format !== null) - ? VariableAssignment.fromPartial(object.format) - : undefined; - message.args = object.args?.map((e) => VariableAssignment.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseVariableMutation(): VariableMutation { - return { - lhsName: "", - lhsJsonPath: undefined, - operation: VariableMutationType.ASSIGN, - sourceVariable: undefined, - literalValue: undefined, - nodeOutput: undefined, - }; -} - -export const VariableMutation = { - encode(message: VariableMutation, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.lhsName !== "") { - writer.uint32(10).string(message.lhsName); - } - if (message.lhsJsonPath !== undefined) { - writer.uint32(18).string(message.lhsJsonPath); - } - if (message.operation !== VariableMutationType.ASSIGN) { - writer.uint32(24).int32(variableMutationTypeToNumber(message.operation)); - } - if (message.sourceVariable !== undefined) { - VariableAssignment.encode(message.sourceVariable, writer.uint32(34).fork()).ldelim(); - } - if (message.literalValue !== undefined) { - VariableValue.encode(message.literalValue, writer.uint32(42).fork()).ldelim(); - } - if (message.nodeOutput !== undefined) { - VariableMutation_NodeOutputSource.encode(message.nodeOutput, writer.uint32(50).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VariableMutation { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariableMutation(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.lhsName = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.lhsJsonPath = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.operation = variableMutationTypeFromJSON(reader.int32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.sourceVariable = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.literalValue = VariableValue.decode(reader, reader.uint32()); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.nodeOutput = VariableMutation_NodeOutputSource.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VariableMutation { - return { - lhsName: isSet(object.lhsName) ? globalThis.String(object.lhsName) : "", - lhsJsonPath: isSet(object.lhsJsonPath) ? globalThis.String(object.lhsJsonPath) : undefined, - operation: isSet(object.operation) ? variableMutationTypeFromJSON(object.operation) : VariableMutationType.ASSIGN, - sourceVariable: isSet(object.sourceVariable) ? VariableAssignment.fromJSON(object.sourceVariable) : undefined, - literalValue: isSet(object.literalValue) ? VariableValue.fromJSON(object.literalValue) : undefined, - nodeOutput: isSet(object.nodeOutput) ? VariableMutation_NodeOutputSource.fromJSON(object.nodeOutput) : undefined, - }; - }, - - toJSON(message: VariableMutation): unknown { - const obj: any = {}; - if (message.lhsName !== "") { - obj.lhsName = message.lhsName; - } - if (message.lhsJsonPath !== undefined) { - obj.lhsJsonPath = message.lhsJsonPath; - } - if (message.operation !== VariableMutationType.ASSIGN) { - obj.operation = variableMutationTypeToJSON(message.operation); - } - if (message.sourceVariable !== undefined) { - obj.sourceVariable = VariableAssignment.toJSON(message.sourceVariable); - } - if (message.literalValue !== undefined) { - obj.literalValue = VariableValue.toJSON(message.literalValue); - } - if (message.nodeOutput !== undefined) { - obj.nodeOutput = VariableMutation_NodeOutputSource.toJSON(message.nodeOutput); - } - return obj; - }, - - create, I>>(base?: I): VariableMutation { - return VariableMutation.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): VariableMutation { - const message = createBaseVariableMutation(); - message.lhsName = object.lhsName ?? ""; - message.lhsJsonPath = object.lhsJsonPath ?? undefined; - message.operation = object.operation ?? VariableMutationType.ASSIGN; - message.sourceVariable = (object.sourceVariable !== undefined && object.sourceVariable !== null) - ? VariableAssignment.fromPartial(object.sourceVariable) - : undefined; - message.literalValue = (object.literalValue !== undefined && object.literalValue !== null) - ? VariableValue.fromPartial(object.literalValue) - : undefined; - message.nodeOutput = (object.nodeOutput !== undefined && object.nodeOutput !== null) - ? VariableMutation_NodeOutputSource.fromPartial(object.nodeOutput) - : undefined; - return message; - }, -}; - -function createBaseVariableMutation_NodeOutputSource(): VariableMutation_NodeOutputSource { - return { jsonpath: undefined }; -} - -export const VariableMutation_NodeOutputSource = { - encode(message: VariableMutation_NodeOutputSource, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.jsonpath !== undefined) { - writer.uint32(82).string(message.jsonpath); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VariableMutation_NodeOutputSource { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariableMutation_NodeOutputSource(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 10: - if (tag !== 82) { - break; - } - - message.jsonpath = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VariableMutation_NodeOutputSource { - return { jsonpath: isSet(object.jsonpath) ? globalThis.String(object.jsonpath) : undefined }; - }, - - toJSON(message: VariableMutation_NodeOutputSource): unknown { - const obj: any = {}; - if (message.jsonpath !== undefined) { - obj.jsonpath = message.jsonpath; - } - return obj; - }, - - create, I>>( - base?: I, - ): VariableMutation_NodeOutputSource { - return VariableMutation_NodeOutputSource.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): VariableMutation_NodeOutputSource { - const message = createBaseVariableMutation_NodeOutputSource(); - message.jsonpath = object.jsonpath ?? undefined; - return message; - }, -}; - -function createBaseVariableDef(): VariableDef { - return { type: VariableType.JSON_OBJ, name: "", defaultValue: undefined }; -} - -export const VariableDef = { - encode(message: VariableDef, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.type !== VariableType.JSON_OBJ) { - writer.uint32(8).int32(variableTypeToNumber(message.type)); - } - if (message.name !== "") { - writer.uint32(18).string(message.name); - } - if (message.defaultValue !== undefined) { - VariableValue.encode(message.defaultValue, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VariableDef { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariableDef(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.type = variableTypeFromJSON(reader.int32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.name = reader.string(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.defaultValue = VariableValue.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VariableDef { - return { - type: isSet(object.type) ? variableTypeFromJSON(object.type) : VariableType.JSON_OBJ, - name: isSet(object.name) ? globalThis.String(object.name) : "", - defaultValue: isSet(object.defaultValue) ? VariableValue.fromJSON(object.defaultValue) : undefined, - }; - }, - - toJSON(message: VariableDef): unknown { - const obj: any = {}; - if (message.type !== VariableType.JSON_OBJ) { - obj.type = variableTypeToJSON(message.type); - } - if (message.name !== "") { - obj.name = message.name; - } - if (message.defaultValue !== undefined) { - obj.defaultValue = VariableValue.toJSON(message.defaultValue); - } - return obj; - }, - - create, I>>(base?: I): VariableDef { - return VariableDef.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): VariableDef { - const message = createBaseVariableDef(); - message.type = object.type ?? VariableType.JSON_OBJ; - message.name = object.name ?? ""; - message.defaultValue = (object.defaultValue !== undefined && object.defaultValue !== null) - ? VariableValue.fromPartial(object.defaultValue) - : undefined; - return message; - }, -}; - -function createBaseUTActionTrigger(): UTActionTrigger { - return { - task: undefined, - cancel: undefined, - reassign: undefined, - delaySeconds: undefined, - hook: UTActionTrigger_UTHook.ON_ARRIVAL, - }; -} - -export const UTActionTrigger = { - encode(message: UTActionTrigger, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.task !== undefined) { - UTActionTrigger_UTATask.encode(message.task, writer.uint32(10).fork()).ldelim(); - } - if (message.cancel !== undefined) { - UTActionTrigger_UTACancel.encode(message.cancel, writer.uint32(18).fork()).ldelim(); - } - if (message.reassign !== undefined) { - UTActionTrigger_UTAReassign.encode(message.reassign, writer.uint32(26).fork()).ldelim(); - } - if (message.delaySeconds !== undefined) { - VariableAssignment.encode(message.delaySeconds, writer.uint32(42).fork()).ldelim(); - } - if (message.hook !== UTActionTrigger_UTHook.ON_ARRIVAL) { - writer.uint32(48).int32(uTActionTrigger_UTHookToNumber(message.hook)); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UTActionTrigger { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUTActionTrigger(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.task = UTActionTrigger_UTATask.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.cancel = UTActionTrigger_UTACancel.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.reassign = UTActionTrigger_UTAReassign.decode(reader, reader.uint32()); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.delaySeconds = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 6: - if (tag !== 48) { - break; - } - - message.hook = uTActionTrigger_UTHookFromJSON(reader.int32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UTActionTrigger { - return { - task: isSet(object.task) ? UTActionTrigger_UTATask.fromJSON(object.task) : undefined, - cancel: isSet(object.cancel) ? UTActionTrigger_UTACancel.fromJSON(object.cancel) : undefined, - reassign: isSet(object.reassign) ? UTActionTrigger_UTAReassign.fromJSON(object.reassign) : undefined, - delaySeconds: isSet(object.delaySeconds) ? VariableAssignment.fromJSON(object.delaySeconds) : undefined, - hook: isSet(object.hook) ? uTActionTrigger_UTHookFromJSON(object.hook) : UTActionTrigger_UTHook.ON_ARRIVAL, - }; - }, - - toJSON(message: UTActionTrigger): unknown { - const obj: any = {}; - if (message.task !== undefined) { - obj.task = UTActionTrigger_UTATask.toJSON(message.task); - } - if (message.cancel !== undefined) { - obj.cancel = UTActionTrigger_UTACancel.toJSON(message.cancel); - } - if (message.reassign !== undefined) { - obj.reassign = UTActionTrigger_UTAReassign.toJSON(message.reassign); - } - if (message.delaySeconds !== undefined) { - obj.delaySeconds = VariableAssignment.toJSON(message.delaySeconds); - } - if (message.hook !== UTActionTrigger_UTHook.ON_ARRIVAL) { - obj.hook = uTActionTrigger_UTHookToJSON(message.hook); - } - return obj; - }, - - create, I>>(base?: I): UTActionTrigger { - return UTActionTrigger.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UTActionTrigger { - const message = createBaseUTActionTrigger(); - message.task = (object.task !== undefined && object.task !== null) - ? UTActionTrigger_UTATask.fromPartial(object.task) - : undefined; - message.cancel = (object.cancel !== undefined && object.cancel !== null) - ? UTActionTrigger_UTACancel.fromPartial(object.cancel) - : undefined; - message.reassign = (object.reassign !== undefined && object.reassign !== null) - ? UTActionTrigger_UTAReassign.fromPartial(object.reassign) - : undefined; - message.delaySeconds = (object.delaySeconds !== undefined && object.delaySeconds !== null) - ? VariableAssignment.fromPartial(object.delaySeconds) - : undefined; - message.hook = object.hook ?? UTActionTrigger_UTHook.ON_ARRIVAL; - return message; - }, -}; - -function createBaseUTActionTrigger_UTACancel(): UTActionTrigger_UTACancel { - return {}; -} - -export const UTActionTrigger_UTACancel = { - encode(_: UTActionTrigger_UTACancel, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UTActionTrigger_UTACancel { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUTActionTrigger_UTACancel(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(_: any): UTActionTrigger_UTACancel { - return {}; - }, - - toJSON(_: UTActionTrigger_UTACancel): unknown { - const obj: any = {}; - return obj; - }, - - create, I>>(base?: I): UTActionTrigger_UTACancel { - return UTActionTrigger_UTACancel.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(_: I): UTActionTrigger_UTACancel { - const message = createBaseUTActionTrigger_UTACancel(); - return message; - }, -}; - -function createBaseUTActionTrigger_UTATask(): UTActionTrigger_UTATask { - return { task: undefined, mutations: [] }; -} - -export const UTActionTrigger_UTATask = { - encode(message: UTActionTrigger_UTATask, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.task !== undefined) { - TaskNode.encode(message.task, writer.uint32(10).fork()).ldelim(); - } - for (const v of message.mutations) { - VariableMutation.encode(v!, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UTActionTrigger_UTATask { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUTActionTrigger_UTATask(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.task = TaskNode.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.mutations.push(VariableMutation.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UTActionTrigger_UTATask { - return { - task: isSet(object.task) ? TaskNode.fromJSON(object.task) : undefined, - mutations: globalThis.Array.isArray(object?.mutations) - ? object.mutations.map((e: any) => VariableMutation.fromJSON(e)) - : [], - }; - }, - - toJSON(message: UTActionTrigger_UTATask): unknown { - const obj: any = {}; - if (message.task !== undefined) { - obj.task = TaskNode.toJSON(message.task); - } - if (message.mutations?.length) { - obj.mutations = message.mutations.map((e) => VariableMutation.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): UTActionTrigger_UTATask { - return UTActionTrigger_UTATask.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UTActionTrigger_UTATask { - const message = createBaseUTActionTrigger_UTATask(); - message.task = (object.task !== undefined && object.task !== null) ? TaskNode.fromPartial(object.task) : undefined; - message.mutations = object.mutations?.map((e) => VariableMutation.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseUTActionTrigger_UTAReassign(): UTActionTrigger_UTAReassign { - return { userId: undefined, userGroup: undefined }; -} - -export const UTActionTrigger_UTAReassign = { - encode(message: UTActionTrigger_UTAReassign, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.userId !== undefined) { - VariableAssignment.encode(message.userId, writer.uint32(10).fork()).ldelim(); - } - if (message.userGroup !== undefined) { - VariableAssignment.encode(message.userGroup, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UTActionTrigger_UTAReassign { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUTActionTrigger_UTAReassign(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.userId = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.userGroup = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UTActionTrigger_UTAReassign { - return { - userId: isSet(object.userId) ? VariableAssignment.fromJSON(object.userId) : undefined, - userGroup: isSet(object.userGroup) ? VariableAssignment.fromJSON(object.userGroup) : undefined, - }; - }, - - toJSON(message: UTActionTrigger_UTAReassign): unknown { - const obj: any = {}; - if (message.userId !== undefined) { - obj.userId = VariableAssignment.toJSON(message.userId); - } - if (message.userGroup !== undefined) { - obj.userGroup = VariableAssignment.toJSON(message.userGroup); - } - return obj; - }, - - create, I>>(base?: I): UTActionTrigger_UTAReassign { - return UTActionTrigger_UTAReassign.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UTActionTrigger_UTAReassign { - const message = createBaseUTActionTrigger_UTAReassign(); - message.userId = (object.userId !== undefined && object.userId !== null) - ? VariableAssignment.fromPartial(object.userId) - : undefined; - message.userGroup = (object.userGroup !== undefined && object.userGroup !== null) - ? VariableAssignment.fromPartial(object.userGroup) - : undefined; - return message; - }, -}; - -function createBaseExponentialBackoffRetryPolicy(): ExponentialBackoffRetryPolicy { - return { baseIntervalMs: 0, maxDelayMs: 0, multiplier: 0 }; -} - -export const ExponentialBackoffRetryPolicy = { - encode(message: ExponentialBackoffRetryPolicy, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.baseIntervalMs !== 0) { - writer.uint32(8).int32(message.baseIntervalMs); - } - if (message.maxDelayMs !== 0) { - writer.uint32(16).int64(message.maxDelayMs); - } - if (message.multiplier !== 0) { - writer.uint32(29).float(message.multiplier); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExponentialBackoffRetryPolicy { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExponentialBackoffRetryPolicy(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.baseIntervalMs = reader.int32(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.maxDelayMs = longToNumber(reader.int64() as Long); - continue; - case 3: - if (tag !== 29) { - break; - } - - message.multiplier = reader.float(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExponentialBackoffRetryPolicy { - return { - baseIntervalMs: isSet(object.baseIntervalMs) ? globalThis.Number(object.baseIntervalMs) : 0, - maxDelayMs: isSet(object.maxDelayMs) ? globalThis.Number(object.maxDelayMs) : 0, - multiplier: isSet(object.multiplier) ? globalThis.Number(object.multiplier) : 0, - }; - }, - - toJSON(message: ExponentialBackoffRetryPolicy): unknown { - const obj: any = {}; - if (message.baseIntervalMs !== 0) { - obj.baseIntervalMs = Math.round(message.baseIntervalMs); - } - if (message.maxDelayMs !== 0) { - obj.maxDelayMs = Math.round(message.maxDelayMs); - } - if (message.multiplier !== 0) { - obj.multiplier = message.multiplier; - } - return obj; - }, - - create, I>>(base?: I): ExponentialBackoffRetryPolicy { - return ExponentialBackoffRetryPolicy.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): ExponentialBackoffRetryPolicy { - const message = createBaseExponentialBackoffRetryPolicy(); - message.baseIntervalMs = object.baseIntervalMs ?? 0; - message.maxDelayMs = object.maxDelayMs ?? 0; - message.multiplier = object.multiplier ?? 0; - return message; - }, -}; - -function createBaseTaskNode(): TaskNode { - return { - taskDefId: undefined, - dynamicTask: undefined, - timeoutSeconds: 0, - retries: 0, - exponentialBackoff: undefined, - variables: [], - }; -} - -export const TaskNode = { - encode(message: TaskNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskDefId !== undefined) { - TaskDefId.encode(message.taskDefId, writer.uint32(10).fork()).ldelim(); - } - if (message.dynamicTask !== undefined) { - VariableAssignment.encode(message.dynamicTask, writer.uint32(50).fork()).ldelim(); - } - if (message.timeoutSeconds !== 0) { - writer.uint32(16).int32(message.timeoutSeconds); - } - if (message.retries !== 0) { - writer.uint32(24).int32(message.retries); - } - if (message.exponentialBackoff !== undefined) { - ExponentialBackoffRetryPolicy.encode(message.exponentialBackoff, writer.uint32(42).fork()).ldelim(); - } - for (const v of message.variables) { - VariableAssignment.encode(v!, writer.uint32(34).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskDefId = TaskDefId.decode(reader, reader.uint32()); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.dynamicTask = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.timeoutSeconds = reader.int32(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.retries = reader.int32(); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.exponentialBackoff = ExponentialBackoffRetryPolicy.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.variables.push(VariableAssignment.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskNode { - return { - taskDefId: isSet(object.taskDefId) ? TaskDefId.fromJSON(object.taskDefId) : undefined, - dynamicTask: isSet(object.dynamicTask) ? VariableAssignment.fromJSON(object.dynamicTask) : undefined, - timeoutSeconds: isSet(object.timeoutSeconds) ? globalThis.Number(object.timeoutSeconds) : 0, - retries: isSet(object.retries) ? globalThis.Number(object.retries) : 0, - exponentialBackoff: isSet(object.exponentialBackoff) - ? ExponentialBackoffRetryPolicy.fromJSON(object.exponentialBackoff) - : undefined, - variables: globalThis.Array.isArray(object?.variables) - ? object.variables.map((e: any) => VariableAssignment.fromJSON(e)) - : [], - }; - }, - - toJSON(message: TaskNode): unknown { - const obj: any = {}; - if (message.taskDefId !== undefined) { - obj.taskDefId = TaskDefId.toJSON(message.taskDefId); - } - if (message.dynamicTask !== undefined) { - obj.dynamicTask = VariableAssignment.toJSON(message.dynamicTask); - } - if (message.timeoutSeconds !== 0) { - obj.timeoutSeconds = Math.round(message.timeoutSeconds); - } - if (message.retries !== 0) { - obj.retries = Math.round(message.retries); - } - if (message.exponentialBackoff !== undefined) { - obj.exponentialBackoff = ExponentialBackoffRetryPolicy.toJSON(message.exponentialBackoff); - } - if (message.variables?.length) { - obj.variables = message.variables.map((e) => VariableAssignment.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): TaskNode { - return TaskNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskNode { - const message = createBaseTaskNode(); - message.taskDefId = (object.taskDefId !== undefined && object.taskDefId !== null) - ? TaskDefId.fromPartial(object.taskDefId) - : undefined; - message.dynamicTask = (object.dynamicTask !== undefined && object.dynamicTask !== null) - ? VariableAssignment.fromPartial(object.dynamicTask) - : undefined; - message.timeoutSeconds = object.timeoutSeconds ?? 0; - message.retries = object.retries ?? 0; - message.exponentialBackoff = (object.exponentialBackoff !== undefined && object.exponentialBackoff !== null) - ? ExponentialBackoffRetryPolicy.fromPartial(object.exponentialBackoff) - : undefined; - message.variables = object.variables?.map((e) => VariableAssignment.fromPartial(e)) || []; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function longToNumber(long: Long): number { - if (long.gt(globalThis.Number.MAX_SAFE_INTEGER)) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - return long.toNumber(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/external_event.ts b/dashboard/apps/web/littlehorse-public-api/external_event.ts deleted file mode 100644 index d1f0ac8e8..000000000 --- a/dashboard/apps/web/littlehorse-public-api/external_event.ts +++ /dev/null @@ -1,425 +0,0 @@ -/* eslint-disable */ -import Long from "long"; -import * as _m0 from "protobufjs/minimal"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { ExternalEventDefId, ExternalEventId } from "./object_id"; -import { VariableValue } from "./variable"; - -export const protobufPackage = "littlehorse"; - -/** - * An ExternalEvent represents A Thing That Happened outside the context of a WfRun. - * Generally, an ExternalEvent is used to represent a document getting signed, an incident - * being resolved, an order being fulfilled, etc. - * - * ExternalEvent's are created via the 'rpc PutExternalEvent' - * - * For more context on ExternalEvents, check our documentation here: - * https://littlehorse.dev/docs/concepts/external-events - */ -export interface ExternalEvent { - /** - * The ID of the ExternalEvent. This contains WfRunId, ExternalEventDefId, - * and a unique guid which can be used for idempotency of the `PutExternalEvent` - * rpc call. - */ - id: - | ExternalEventId - | undefined; - /** The time the ExternalEvent was registered with LittleHorse. */ - createdAt: - | string - | undefined; - /** The payload of this ExternalEvent. */ - content: - | VariableValue - | undefined; - /** - * If the ExternalEvent was claimed by a specific ThreadRun (via Interrupt or - * EXTERNAL_EVENT Node), this is set to the number of the relevant ThreadRun. - */ - threadRunNumber?: - | number - | undefined; - /** - * If the ExternalEvent was claimed by a specific ThreadRun (via EXTERNAL_EVENT - * Node; note that in the case of an Interrupt the node_run_position will never - * be set), this is set to the number of the relevant NodeRun. - */ - nodeRunPosition?: - | number - | undefined; - /** Whether the ExternalEvent has been claimed by a WfRun. */ - claimed: boolean; -} - -/** The ExternalEventDef defines the blueprint for an ExternalEvent. */ -export interface ExternalEventDef { - /** The id of the ExternalEventDef. */ - id: - | ExternalEventDefId - | undefined; - /** When the ExternalEventDef was created. */ - createdAt: - | string - | undefined; - /** - * The retention policy for ExternalEvent's of this ExternalEventDef. This applies to the - * ExternalEvent **only before** it is matched with a WfRun. - */ - retentionPolicy: ExternalEventRetentionPolicy | undefined; -} - -/** - * Policy to determine how long an ExternalEvent is retained after creation if it - * is not yet claimed by a WfRun. Note that once a WfRun has been matched with the - * ExternalEvent, the ExternalEvent is deleted if/when that WfRun is deleted. - * If not set, then ExternalEvent's are not deleted if they are not matched with - * a WfRun. - * - * A future version of LittleHorse will allow changing the retention_policy, which - * will trigger a cleanup of old `ExternalEvent`s. - */ -export interface ExternalEventRetentionPolicy { - /** - * Delete such an ExternalEvent X seconds after it has been registered if it - * has not yet been claimed by a WfRun. - */ - secondsAfterPut?: number | undefined; -} - -function createBaseExternalEvent(): ExternalEvent { - return { - id: undefined, - createdAt: undefined, - content: undefined, - threadRunNumber: undefined, - nodeRunPosition: undefined, - claimed: false, - }; -} - -export const ExternalEvent = { - encode(message: ExternalEvent, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - ExternalEventId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(18).fork()).ldelim(); - } - if (message.content !== undefined) { - VariableValue.encode(message.content, writer.uint32(26).fork()).ldelim(); - } - if (message.threadRunNumber !== undefined) { - writer.uint32(32).int32(message.threadRunNumber); - } - if (message.nodeRunPosition !== undefined) { - writer.uint32(40).int32(message.nodeRunPosition); - } - if (message.claimed !== false) { - writer.uint32(48).bool(message.claimed); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExternalEvent { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExternalEvent(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = ExternalEventId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.content = VariableValue.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.threadRunNumber = reader.int32(); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.nodeRunPosition = reader.int32(); - continue; - case 6: - if (tag !== 48) { - break; - } - - message.claimed = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExternalEvent { - return { - id: isSet(object.id) ? ExternalEventId.fromJSON(object.id) : undefined, - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - content: isSet(object.content) ? VariableValue.fromJSON(object.content) : undefined, - threadRunNumber: isSet(object.threadRunNumber) ? globalThis.Number(object.threadRunNumber) : undefined, - nodeRunPosition: isSet(object.nodeRunPosition) ? globalThis.Number(object.nodeRunPosition) : undefined, - claimed: isSet(object.claimed) ? globalThis.Boolean(object.claimed) : false, - }; - }, - - toJSON(message: ExternalEvent): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = ExternalEventId.toJSON(message.id); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - if (message.content !== undefined) { - obj.content = VariableValue.toJSON(message.content); - } - if (message.threadRunNumber !== undefined) { - obj.threadRunNumber = Math.round(message.threadRunNumber); - } - if (message.nodeRunPosition !== undefined) { - obj.nodeRunPosition = Math.round(message.nodeRunPosition); - } - if (message.claimed !== false) { - obj.claimed = message.claimed; - } - return obj; - }, - - create, I>>(base?: I): ExternalEvent { - return ExternalEvent.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExternalEvent { - const message = createBaseExternalEvent(); - message.id = (object.id !== undefined && object.id !== null) ? ExternalEventId.fromPartial(object.id) : undefined; - message.createdAt = object.createdAt ?? undefined; - message.content = (object.content !== undefined && object.content !== null) - ? VariableValue.fromPartial(object.content) - : undefined; - message.threadRunNumber = object.threadRunNumber ?? undefined; - message.nodeRunPosition = object.nodeRunPosition ?? undefined; - message.claimed = object.claimed ?? false; - return message; - }, -}; - -function createBaseExternalEventDef(): ExternalEventDef { - return { id: undefined, createdAt: undefined, retentionPolicy: undefined }; -} - -export const ExternalEventDef = { - encode(message: ExternalEventDef, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - ExternalEventDefId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(18).fork()).ldelim(); - } - if (message.retentionPolicy !== undefined) { - ExternalEventRetentionPolicy.encode(message.retentionPolicy, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExternalEventDef { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExternalEventDef(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = ExternalEventDefId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.retentionPolicy = ExternalEventRetentionPolicy.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExternalEventDef { - return { - id: isSet(object.id) ? ExternalEventDefId.fromJSON(object.id) : undefined, - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - retentionPolicy: isSet(object.retentionPolicy) - ? ExternalEventRetentionPolicy.fromJSON(object.retentionPolicy) - : undefined, - }; - }, - - toJSON(message: ExternalEventDef): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = ExternalEventDefId.toJSON(message.id); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - if (message.retentionPolicy !== undefined) { - obj.retentionPolicy = ExternalEventRetentionPolicy.toJSON(message.retentionPolicy); - } - return obj; - }, - - create, I>>(base?: I): ExternalEventDef { - return ExternalEventDef.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExternalEventDef { - const message = createBaseExternalEventDef(); - message.id = (object.id !== undefined && object.id !== null) - ? ExternalEventDefId.fromPartial(object.id) - : undefined; - message.createdAt = object.createdAt ?? undefined; - message.retentionPolicy = (object.retentionPolicy !== undefined && object.retentionPolicy !== null) - ? ExternalEventRetentionPolicy.fromPartial(object.retentionPolicy) - : undefined; - return message; - }, -}; - -function createBaseExternalEventRetentionPolicy(): ExternalEventRetentionPolicy { - return { secondsAfterPut: undefined }; -} - -export const ExternalEventRetentionPolicy = { - encode(message: ExternalEventRetentionPolicy, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.secondsAfterPut !== undefined) { - writer.uint32(8).int64(message.secondsAfterPut); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExternalEventRetentionPolicy { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExternalEventRetentionPolicy(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.secondsAfterPut = longToNumber(reader.int64() as Long); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExternalEventRetentionPolicy { - return { secondsAfterPut: isSet(object.secondsAfterPut) ? globalThis.Number(object.secondsAfterPut) : undefined }; - }, - - toJSON(message: ExternalEventRetentionPolicy): unknown { - const obj: any = {}; - if (message.secondsAfterPut !== undefined) { - obj.secondsAfterPut = Math.round(message.secondsAfterPut); - } - return obj; - }, - - create, I>>(base?: I): ExternalEventRetentionPolicy { - return ExternalEventRetentionPolicy.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExternalEventRetentionPolicy { - const message = createBaseExternalEventRetentionPolicy(); - message.secondsAfterPut = object.secondsAfterPut ?? undefined; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function longToNumber(long: Long): number { - if (long.gt(globalThis.Number.MAX_SAFE_INTEGER)) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - return long.toNumber(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/google/protobuf/empty.ts b/dashboard/apps/web/littlehorse-public-api/google/protobuf/empty.ts deleted file mode 100644 index 99db028f8..000000000 --- a/dashboard/apps/web/littlehorse-public-api/google/protobuf/empty.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* eslint-disable */ -import * as _m0 from "protobufjs/minimal"; - -export const protobufPackage = "google.protobuf"; - -/** - * A generic empty message that you can re-use to avoid defining duplicated - * empty messages in your APIs. A typical example is to use it as the request - * or the response type of an API method. For instance: - * - * service Foo { - * rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); - * } - */ -export interface Empty { -} - -function createBaseEmpty(): Empty { - return {}; -} - -export const Empty = { - encode(_: Empty, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Empty { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEmpty(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(_: any): Empty { - return {}; - }, - - toJSON(_: Empty): unknown { - const obj: any = {}; - return obj; - }, - - create, I>>(base?: I): Empty { - return Empty.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(_: I): Empty { - const message = createBaseEmpty(); - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; diff --git a/dashboard/apps/web/littlehorse-public-api/google/protobuf/timestamp.ts b/dashboard/apps/web/littlehorse-public-api/google/protobuf/timestamp.ts deleted file mode 100644 index 9a8d05e09..000000000 --- a/dashboard/apps/web/littlehorse-public-api/google/protobuf/timestamp.ts +++ /dev/null @@ -1,214 +0,0 @@ -/* eslint-disable */ -import Long from "long"; -import * as _m0 from "protobufjs/minimal"; - -export const protobufPackage = "google.protobuf"; - -/** - * A Timestamp represents a point in time independent of any time zone or local - * calendar, encoded as a count of seconds and fractions of seconds at - * nanosecond resolution. The count is relative to an epoch at UTC midnight on - * January 1, 1970, in the proleptic Gregorian calendar which extends the - * Gregorian calendar backwards to year one. - * - * All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap - * second table is needed for interpretation, using a [24-hour linear - * smear](https://developers.google.com/time/smear). - * - * The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By - * restricting to that range, we ensure that we can convert to and from [RFC - * 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. - * - * # Examples - * - * Example 1: Compute Timestamp from POSIX `time()`. - * - * Timestamp timestamp; - * timestamp.set_seconds(time(NULL)); - * timestamp.set_nanos(0); - * - * Example 2: Compute Timestamp from POSIX `gettimeofday()`. - * - * struct timeval tv; - * gettimeofday(&tv, NULL); - * - * Timestamp timestamp; - * timestamp.set_seconds(tv.tv_sec); - * timestamp.set_nanos(tv.tv_usec * 1000); - * - * Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. - * - * FILETIME ft; - * GetSystemTimeAsFileTime(&ft); - * UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; - * - * // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z - * // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. - * Timestamp timestamp; - * timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); - * timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); - * - * Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. - * - * long millis = System.currentTimeMillis(); - * - * Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) - * .setNanos((int) ((millis % 1000) * 1000000)).build(); - * - * Example 5: Compute Timestamp from Java `Instant.now()`. - * - * Instant now = Instant.now(); - * - * Timestamp timestamp = - * Timestamp.newBuilder().setSeconds(now.getEpochSecond()) - * .setNanos(now.getNano()).build(); - * - * Example 6: Compute Timestamp from current time in Python. - * - * timestamp = Timestamp() - * timestamp.GetCurrentTime() - * - * # JSON Mapping - * - * In JSON format, the Timestamp type is encoded as a string in the - * [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the - * format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" - * where {year} is always expressed using four digits while {month}, {day}, - * {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional - * seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), - * are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone - * is required. A proto3 JSON serializer should always use UTC (as indicated by - * "Z") when printing the Timestamp type and a proto3 JSON parser should be - * able to accept both UTC and other timezones (as indicated by an offset). - * - * For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past - * 01:30 UTC on January 15, 2017. - * - * In JavaScript, one can convert a Date object to this format using the - * standard - * [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) - * method. In Python, a standard `datetime.datetime` object can be converted - * to this format using - * [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with - * the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use - * the Joda Time's [`ISODateTimeFormat.dateTime()`]( - * http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() - * ) to obtain a formatter capable of generating timestamps in this format. - */ -export interface Timestamp { - /** - * Represents seconds of UTC time since Unix epoch - * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - * 9999-12-31T23:59:59Z inclusive. - */ - seconds: number; - /** - * Non-negative fractions of a second at nanosecond resolution. Negative - * second values with fractions must still have non-negative nanos values - * that count forward in time. Must be from 0 to 999,999,999 - * inclusive. - */ - nanos: number; -} - -function createBaseTimestamp(): Timestamp { - return { seconds: 0, nanos: 0 }; -} - -export const Timestamp = { - encode(message: Timestamp, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.seconds !== 0) { - writer.uint32(8).int64(message.seconds); - } - if (message.nanos !== 0) { - writer.uint32(16).int32(message.nanos); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Timestamp { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTimestamp(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.seconds = longToNumber(reader.int64() as Long); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.nanos = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): Timestamp { - return { - seconds: isSet(object.seconds) ? globalThis.Number(object.seconds) : 0, - nanos: isSet(object.nanos) ? globalThis.Number(object.nanos) : 0, - }; - }, - - toJSON(message: Timestamp): unknown { - const obj: any = {}; - if (message.seconds !== 0) { - obj.seconds = Math.round(message.seconds); - } - if (message.nanos !== 0) { - obj.nanos = Math.round(message.nanos); - } - return obj; - }, - - create, I>>(base?: I): Timestamp { - return Timestamp.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Timestamp { - const message = createBaseTimestamp(); - message.seconds = object.seconds ?? 0; - message.nanos = object.nanos ?? 0; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function longToNumber(long: Long): number { - if (long.gt(globalThis.Number.MAX_SAFE_INTEGER)) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - return long.toNumber(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/node_run.ts b/dashboard/apps/web/littlehorse-public-api/node_run.ts deleted file mode 100644 index 799f64b1f..000000000 --- a/dashboard/apps/web/littlehorse-public-api/node_run.ts +++ /dev/null @@ -1,1696 +0,0 @@ -/* eslint-disable */ -import * as _m0 from "protobufjs/minimal"; -import { LHStatus, lHStatusFromJSON, lHStatusToJSON, lHStatusToNumber } from "./common_enums"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { - ExternalEventDefId, - ExternalEventId, - NodeRunId, - TaskRunId, - UserTaskRunId, - WfSpecId, - WorkflowEventId, -} from "./object_id"; -import { VariableValue } from "./variable"; - -export const protobufPackage = "littlehorse"; - -/** - * A NodeRun is a running instance of a Node in a ThreadRun. Note that a NodeRun - * is a Getable object, meaning it can be retried from the LittleHorse grpc API. - */ -export interface NodeRun { - /** - * The ID of the NodeRun. Note that the NodeRunId contains the WfRunId, the - * ThreadRun's number, and the position of the NodeRun within that ThreadRun. - */ - id: - | NodeRunId - | undefined; - /** - * The ID of the WfSpec that this NodeRun is from. This is not _always_ the same - * as the ThreadRun it belongs to because of the upcoming WfSpec Version Migration - * feature. - */ - wfSpecId: - | WfSpecId - | undefined; - /** A list of all ThreadRun's that ran to handle a failure thrown by this NodeRun. */ - failureHandlerIds: number[]; - /** The status of this NodeRun. */ - status: LHStatus; - /** The time the ThreadRun arrived at this NodeRun. */ - arrivalTime: - | string - | undefined; - /** The time the NodeRun was terminated (failed or completed). */ - endTime?: - | string - | undefined; - /** The name of the ThreadSpec to which this NodeRun belongs. */ - threadSpecName: string; - /** The name of the Node in the ThreadSpec that this NodeRun belongs to. */ - nodeName: string; - /** - * A human-readable error message intended to help developers diagnose WfSpec - * problems. - */ - errorMessage?: - | string - | undefined; - /** A list of Failures thrown by this NodeRun. */ - failures: Failure[]; - /** Denotes a TASK node, which runs a TaskRun. */ - task?: - | TaskNodeRun - | undefined; - /** An EXTERNAL_EVENT node blocks until an ExternalEvent arrives. */ - externalEvent?: - | ExternalEventRun - | undefined; - /** An ENTRYPOINT node is the first thing that runs in a ThreadRun. */ - entrypoint?: - | EntrypointRun - | undefined; - /** An EXIT node completes a ThreadRun. */ - exit?: - | ExitRun - | undefined; - /** A START_THREAD node starts a child ThreadRun. */ - startThread?: - | StartThreadRun - | undefined; - /** A WAIT_THREADS node waits for one or more child ThreadRun's to complete. */ - waitThreads?: - | WaitForThreadsRun - | undefined; - /** A SLEEP node makes the ThreadRun block for a certain amount of time. */ - sleep?: - | SleepNodeRun - | undefined; - /** A USER_TASK node waits until a human executes some work and reports the result. */ - userTask?: - | UserTaskNodeRun - | undefined; - /** - * A START_MULTIPLE_THREADS node iterates over a JSON_ARR variable and spawns a - * child ThreadRun for each element in the list. - */ - startMultipleThreads?: StartMultipleThreadsRun | undefined; - throwEvent?: ThrowEventNodeRun | undefined; -} - -/** The sub-node structure for a TASK NodeRun. */ -export interface TaskNodeRun { - /** - * The ID of the TaskRun. Note that if the ThreadRun was halted when it arrived - * at this TASK Node, then the task_run_id will be unset. - */ - taskRunId?: TaskRunId | undefined; -} - -export interface ThrowEventNodeRun { - workflowEventId: WorkflowEventId | undefined; -} - -/** The sub-node structure for a USER_TASK NodeRun. */ -export interface UserTaskNodeRun { - /** - * The ID of the UserTaskRun. Note that if the ThreadRun was halted when it arrived - * at this USER_TASK node, then the user_task_run_id will be unset. - */ - userTaskRunId?: UserTaskRunId | undefined; -} - -/** The sub-node structure for an ENTRYPOINT NodeRun. Currently Empty. */ -export interface EntrypointRun { -} - -/** - * The sub-node structure for an EXIT NodeRun. Currently Empty, will contain info - * about ThreadRun Outputs once those are added in the future. - */ -export interface ExitRun { -} - -/** The sub-node structure for a START_THREAD NodeRun. */ -export interface StartThreadRun { - /** - * Contains the thread_run_number of the created Child ThreadRun, if it has - * been created already. - */ - childThreadId?: - | number - | undefined; - /** The thread_spec_name of the child thread_run. */ - threadSpecName: string; -} - -/** - * The sub-node structure for a START_MULTIPLE_THREADS NodeRun. - * - * Note: the output of this NodeRun, which can be used to mutate Variables, - * is a JSON_ARR variable containing the ID's of all the child threadRuns. - */ -export interface StartMultipleThreadsRun { - /** The thread_spec_name of the child thread_runs. */ - threadSpecName: string; - /** The list of all created child ThreadRun's */ - childThreadIds: number[]; -} - -/** The sub-node structure for a WAIT_FOR_THREADS NodeRun. */ -export interface WaitForThreadsRun { - /** The threads that are being waited for. */ - threads: WaitForThreadsRun_WaitForThread[]; -} - -/** The status of a single ThreadRun that we are waiting for. */ -export enum WaitForThreadsRun_WaitingThreadStatus { - /** THREAD_IN_PROGRESS - The ThreadRun is in progress (i.e. not COMPLETED nor EXCEPTION nor ERROR) */ - THREAD_IN_PROGRESS = "THREAD_IN_PROGRESS", - /** - * THREAD_HANDLING_FAILURE - The ThreadRun failed with some failure, and the FailureHandler is running - * for that Failure. - */ - THREAD_HANDLING_FAILURE = "THREAD_HANDLING_FAILURE", - /** - * THREAD_COMPLETED_OR_FAILURE_HANDLED - We can mark this ThreadRun as "already waited for", meaning that either: - * 1. It completed successfully, OR - * 2. It failed, and the Failure Handler successfully completed - */ - THREAD_COMPLETED_OR_FAILURE_HANDLED = "THREAD_COMPLETED_OR_FAILURE_HANDLED", - /** - * THREAD_UNSUCCESSFUL - The ThreadRun did not complete successfully, and there wasn't a successful - * run of a Failure Handler for the Failure that was thrown. - */ - THREAD_UNSUCCESSFUL = "THREAD_UNSUCCESSFUL", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function waitForThreadsRun_WaitingThreadStatusFromJSON(object: any): WaitForThreadsRun_WaitingThreadStatus { - switch (object) { - case 0: - case "THREAD_IN_PROGRESS": - return WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS; - case 1: - case "THREAD_HANDLING_FAILURE": - return WaitForThreadsRun_WaitingThreadStatus.THREAD_HANDLING_FAILURE; - case 2: - case "THREAD_COMPLETED_OR_FAILURE_HANDLED": - return WaitForThreadsRun_WaitingThreadStatus.THREAD_COMPLETED_OR_FAILURE_HANDLED; - case 3: - case "THREAD_UNSUCCESSFUL": - return WaitForThreadsRun_WaitingThreadStatus.THREAD_UNSUCCESSFUL; - case -1: - case "UNRECOGNIZED": - default: - return WaitForThreadsRun_WaitingThreadStatus.UNRECOGNIZED; - } -} - -export function waitForThreadsRun_WaitingThreadStatusToJSON(object: WaitForThreadsRun_WaitingThreadStatus): string { - switch (object) { - case WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS: - return "THREAD_IN_PROGRESS"; - case WaitForThreadsRun_WaitingThreadStatus.THREAD_HANDLING_FAILURE: - return "THREAD_HANDLING_FAILURE"; - case WaitForThreadsRun_WaitingThreadStatus.THREAD_COMPLETED_OR_FAILURE_HANDLED: - return "THREAD_COMPLETED_OR_FAILURE_HANDLED"; - case WaitForThreadsRun_WaitingThreadStatus.THREAD_UNSUCCESSFUL: - return "THREAD_UNSUCCESSFUL"; - case WaitForThreadsRun_WaitingThreadStatus.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function waitForThreadsRun_WaitingThreadStatusToNumber(object: WaitForThreadsRun_WaitingThreadStatus): number { - switch (object) { - case WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS: - return 0; - case WaitForThreadsRun_WaitingThreadStatus.THREAD_HANDLING_FAILURE: - return 1; - case WaitForThreadsRun_WaitingThreadStatus.THREAD_COMPLETED_OR_FAILURE_HANDLED: - return 2; - case WaitForThreadsRun_WaitingThreadStatus.THREAD_UNSUCCESSFUL: - return 3; - case WaitForThreadsRun_WaitingThreadStatus.UNRECOGNIZED: - default: - return -1; - } -} - -/** A 'WaitForThread' structure defines a thread that is being waited for. */ -export interface WaitForThreadsRun_WaitForThread { - /** - * The time at which the ThreadRun ended (successfully or not). Not set if the ThreadRun - * is still RUNNING, HALTED, or HALTING. - */ - threadEndTime?: - | string - | undefined; - /** The current status of the ThreadRun being waited for. */ - threadStatus: LHStatus; - /** The number of the ThreadRun being waited for. */ - threadRunNumber: number; - /** - * The "waiting status" of this specific thread: whether it's still running, - * already done, handling a failure, or completely failed. - */ - waitingStatus: WaitForThreadsRun_WaitingThreadStatus; - /** - * If there is a failure on the ThreadRun, and we have a failure handler defined - * for it, then we will start a failure handler for this threadrun. This field - * is the id of that threadRun. - */ - failureHandlerThreadRunId?: number | undefined; -} - -/** The sub-node structure for an EXTERNAL_EVENT NodeRun. */ -export interface ExternalEventRun { - /** The ExternalEventDefId that we are waiting for. */ - externalEventDefId: - | ExternalEventDefId - | undefined; - /** The time that the ExternalEvent arrived. Unset if still waiting. */ - eventTime?: - | string - | undefined; - /** The ExternalEventId of the ExternalEvent. Unset if still waiting. */ - externalEventId?: - | ExternalEventId - | undefined; - /** Whether we had a timeout while waiting for the ExternalEvent to come. */ - timedOut: boolean; -} - -/** The sub-node structure for a SLEEP NodeRun. */ -export interface SleepNodeRun { - /** - * The time at which the NodeRun is *SCHEDULED TO* wake up. In rare cases, if - * the LH Server is back-pressuring clients due to extreme load, the timer - * event which marks the sleep node as "matured" may come in slightly late. - */ - maturationTime: - | string - | undefined; - /** Whether the SleepNodeRun has been matured. */ - matured: boolean; -} - -/** - * Denotes a failure that happened during execution of a NodeRun or the outgoing - * edges. - */ -export interface Failure { - /** - * The name of the failure. LittleHorse has certain built-in failures, all named in - * UPPER_UNDERSCORE_CASE. Such failures correspond with the `LHStatus.ERROR`. - * - * Any Failure named in `kebab-case` is a user-defined business `EXCEPTION`, treated - * as an `LHStatus.EXCEPTION`. - */ - failureName: string; - /** The human-readable message associated with this Failure. */ - message: string; - /** - * A user-defined Failure can have a value; for example, in Java an Exception is an - * Object with arbitrary properties and behaviors. - * - * Future versions of LH will allow FailureHandler threads to accept that value as - * an input variable. - */ - content?: - | VariableValue - | undefined; - /** A boolean denoting whether a Failure Handler ThreadRun properly handled the Failure. */ - wasProperlyHandled: boolean; - /** - * If there is a defined failure handler for the NodeRun, then this field is set to the - * id of the failure handler thread run. - */ - failureHandlerThreadrunId?: number | undefined; -} - -function createBaseNodeRun(): NodeRun { - return { - id: undefined, - wfSpecId: undefined, - failureHandlerIds: [], - status: LHStatus.STARTING, - arrivalTime: undefined, - endTime: undefined, - threadSpecName: "", - nodeName: "", - errorMessage: undefined, - failures: [], - task: undefined, - externalEvent: undefined, - entrypoint: undefined, - exit: undefined, - startThread: undefined, - waitThreads: undefined, - sleep: undefined, - userTask: undefined, - startMultipleThreads: undefined, - throwEvent: undefined, - }; -} - -export const NodeRun = { - encode(message: NodeRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - NodeRunId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.wfSpecId !== undefined) { - WfSpecId.encode(message.wfSpecId, writer.uint32(34).fork()).ldelim(); - } - writer.uint32(42).fork(); - for (const v of message.failureHandlerIds) { - writer.int32(v); - } - writer.ldelim(); - if (message.status !== LHStatus.STARTING) { - writer.uint32(48).int32(lHStatusToNumber(message.status)); - } - if (message.arrivalTime !== undefined) { - Timestamp.encode(toTimestamp(message.arrivalTime), writer.uint32(58).fork()).ldelim(); - } - if (message.endTime !== undefined) { - Timestamp.encode(toTimestamp(message.endTime), writer.uint32(66).fork()).ldelim(); - } - if (message.threadSpecName !== "") { - writer.uint32(74).string(message.threadSpecName); - } - if (message.nodeName !== "") { - writer.uint32(82).string(message.nodeName); - } - if (message.errorMessage !== undefined) { - writer.uint32(90).string(message.errorMessage); - } - for (const v of message.failures) { - Failure.encode(v!, writer.uint32(98).fork()).ldelim(); - } - if (message.task !== undefined) { - TaskNodeRun.encode(message.task, writer.uint32(106).fork()).ldelim(); - } - if (message.externalEvent !== undefined) { - ExternalEventRun.encode(message.externalEvent, writer.uint32(114).fork()).ldelim(); - } - if (message.entrypoint !== undefined) { - EntrypointRun.encode(message.entrypoint, writer.uint32(122).fork()).ldelim(); - } - if (message.exit !== undefined) { - ExitRun.encode(message.exit, writer.uint32(130).fork()).ldelim(); - } - if (message.startThread !== undefined) { - StartThreadRun.encode(message.startThread, writer.uint32(138).fork()).ldelim(); - } - if (message.waitThreads !== undefined) { - WaitForThreadsRun.encode(message.waitThreads, writer.uint32(146).fork()).ldelim(); - } - if (message.sleep !== undefined) { - SleepNodeRun.encode(message.sleep, writer.uint32(154).fork()).ldelim(); - } - if (message.userTask !== undefined) { - UserTaskNodeRun.encode(message.userTask, writer.uint32(162).fork()).ldelim(); - } - if (message.startMultipleThreads !== undefined) { - StartMultipleThreadsRun.encode(message.startMultipleThreads, writer.uint32(170).fork()).ldelim(); - } - if (message.throwEvent !== undefined) { - ThrowEventNodeRun.encode(message.throwEvent, writer.uint32(178).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): NodeRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseNodeRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = NodeRunId.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.wfSpecId = WfSpecId.decode(reader, reader.uint32()); - continue; - case 5: - if (tag === 40) { - message.failureHandlerIds.push(reader.int32()); - - continue; - } - - if (tag === 42) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.failureHandlerIds.push(reader.int32()); - } - - continue; - } - - break; - case 6: - if (tag !== 48) { - break; - } - - message.status = lHStatusFromJSON(reader.int32()); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.arrivalTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.endTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 9: - if (tag !== 74) { - break; - } - - message.threadSpecName = reader.string(); - continue; - case 10: - if (tag !== 82) { - break; - } - - message.nodeName = reader.string(); - continue; - case 11: - if (tag !== 90) { - break; - } - - message.errorMessage = reader.string(); - continue; - case 12: - if (tag !== 98) { - break; - } - - message.failures.push(Failure.decode(reader, reader.uint32())); - continue; - case 13: - if (tag !== 106) { - break; - } - - message.task = TaskNodeRun.decode(reader, reader.uint32()); - continue; - case 14: - if (tag !== 114) { - break; - } - - message.externalEvent = ExternalEventRun.decode(reader, reader.uint32()); - continue; - case 15: - if (tag !== 122) { - break; - } - - message.entrypoint = EntrypointRun.decode(reader, reader.uint32()); - continue; - case 16: - if (tag !== 130) { - break; - } - - message.exit = ExitRun.decode(reader, reader.uint32()); - continue; - case 17: - if (tag !== 138) { - break; - } - - message.startThread = StartThreadRun.decode(reader, reader.uint32()); - continue; - case 18: - if (tag !== 146) { - break; - } - - message.waitThreads = WaitForThreadsRun.decode(reader, reader.uint32()); - continue; - case 19: - if (tag !== 154) { - break; - } - - message.sleep = SleepNodeRun.decode(reader, reader.uint32()); - continue; - case 20: - if (tag !== 162) { - break; - } - - message.userTask = UserTaskNodeRun.decode(reader, reader.uint32()); - continue; - case 21: - if (tag !== 170) { - break; - } - - message.startMultipleThreads = StartMultipleThreadsRun.decode(reader, reader.uint32()); - continue; - case 22: - if (tag !== 178) { - break; - } - - message.throwEvent = ThrowEventNodeRun.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): NodeRun { - return { - id: isSet(object.id) ? NodeRunId.fromJSON(object.id) : undefined, - wfSpecId: isSet(object.wfSpecId) ? WfSpecId.fromJSON(object.wfSpecId) : undefined, - failureHandlerIds: globalThis.Array.isArray(object?.failureHandlerIds) - ? object.failureHandlerIds.map((e: any) => globalThis.Number(e)) - : [], - status: isSet(object.status) ? lHStatusFromJSON(object.status) : LHStatus.STARTING, - arrivalTime: isSet(object.arrivalTime) ? globalThis.String(object.arrivalTime) : undefined, - endTime: isSet(object.endTime) ? globalThis.String(object.endTime) : undefined, - threadSpecName: isSet(object.threadSpecName) ? globalThis.String(object.threadSpecName) : "", - nodeName: isSet(object.nodeName) ? globalThis.String(object.nodeName) : "", - errorMessage: isSet(object.errorMessage) ? globalThis.String(object.errorMessage) : undefined, - failures: globalThis.Array.isArray(object?.failures) ? object.failures.map((e: any) => Failure.fromJSON(e)) : [], - task: isSet(object.task) ? TaskNodeRun.fromJSON(object.task) : undefined, - externalEvent: isSet(object.externalEvent) ? ExternalEventRun.fromJSON(object.externalEvent) : undefined, - entrypoint: isSet(object.entrypoint) ? EntrypointRun.fromJSON(object.entrypoint) : undefined, - exit: isSet(object.exit) ? ExitRun.fromJSON(object.exit) : undefined, - startThread: isSet(object.startThread) ? StartThreadRun.fromJSON(object.startThread) : undefined, - waitThreads: isSet(object.waitThreads) ? WaitForThreadsRun.fromJSON(object.waitThreads) : undefined, - sleep: isSet(object.sleep) ? SleepNodeRun.fromJSON(object.sleep) : undefined, - userTask: isSet(object.userTask) ? UserTaskNodeRun.fromJSON(object.userTask) : undefined, - startMultipleThreads: isSet(object.startMultipleThreads) - ? StartMultipleThreadsRun.fromJSON(object.startMultipleThreads) - : undefined, - throwEvent: isSet(object.throwEvent) ? ThrowEventNodeRun.fromJSON(object.throwEvent) : undefined, - }; - }, - - toJSON(message: NodeRun): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = NodeRunId.toJSON(message.id); - } - if (message.wfSpecId !== undefined) { - obj.wfSpecId = WfSpecId.toJSON(message.wfSpecId); - } - if (message.failureHandlerIds?.length) { - obj.failureHandlerIds = message.failureHandlerIds.map((e) => Math.round(e)); - } - if (message.status !== LHStatus.STARTING) { - obj.status = lHStatusToJSON(message.status); - } - if (message.arrivalTime !== undefined) { - obj.arrivalTime = message.arrivalTime; - } - if (message.endTime !== undefined) { - obj.endTime = message.endTime; - } - if (message.threadSpecName !== "") { - obj.threadSpecName = message.threadSpecName; - } - if (message.nodeName !== "") { - obj.nodeName = message.nodeName; - } - if (message.errorMessage !== undefined) { - obj.errorMessage = message.errorMessage; - } - if (message.failures?.length) { - obj.failures = message.failures.map((e) => Failure.toJSON(e)); - } - if (message.task !== undefined) { - obj.task = TaskNodeRun.toJSON(message.task); - } - if (message.externalEvent !== undefined) { - obj.externalEvent = ExternalEventRun.toJSON(message.externalEvent); - } - if (message.entrypoint !== undefined) { - obj.entrypoint = EntrypointRun.toJSON(message.entrypoint); - } - if (message.exit !== undefined) { - obj.exit = ExitRun.toJSON(message.exit); - } - if (message.startThread !== undefined) { - obj.startThread = StartThreadRun.toJSON(message.startThread); - } - if (message.waitThreads !== undefined) { - obj.waitThreads = WaitForThreadsRun.toJSON(message.waitThreads); - } - if (message.sleep !== undefined) { - obj.sleep = SleepNodeRun.toJSON(message.sleep); - } - if (message.userTask !== undefined) { - obj.userTask = UserTaskNodeRun.toJSON(message.userTask); - } - if (message.startMultipleThreads !== undefined) { - obj.startMultipleThreads = StartMultipleThreadsRun.toJSON(message.startMultipleThreads); - } - if (message.throwEvent !== undefined) { - obj.throwEvent = ThrowEventNodeRun.toJSON(message.throwEvent); - } - return obj; - }, - - create, I>>(base?: I): NodeRun { - return NodeRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): NodeRun { - const message = createBaseNodeRun(); - message.id = (object.id !== undefined && object.id !== null) ? NodeRunId.fromPartial(object.id) : undefined; - message.wfSpecId = (object.wfSpecId !== undefined && object.wfSpecId !== null) - ? WfSpecId.fromPartial(object.wfSpecId) - : undefined; - message.failureHandlerIds = object.failureHandlerIds?.map((e) => e) || []; - message.status = object.status ?? LHStatus.STARTING; - message.arrivalTime = object.arrivalTime ?? undefined; - message.endTime = object.endTime ?? undefined; - message.threadSpecName = object.threadSpecName ?? ""; - message.nodeName = object.nodeName ?? ""; - message.errorMessage = object.errorMessage ?? undefined; - message.failures = object.failures?.map((e) => Failure.fromPartial(e)) || []; - message.task = (object.task !== undefined && object.task !== null) - ? TaskNodeRun.fromPartial(object.task) - : undefined; - message.externalEvent = (object.externalEvent !== undefined && object.externalEvent !== null) - ? ExternalEventRun.fromPartial(object.externalEvent) - : undefined; - message.entrypoint = (object.entrypoint !== undefined && object.entrypoint !== null) - ? EntrypointRun.fromPartial(object.entrypoint) - : undefined; - message.exit = (object.exit !== undefined && object.exit !== null) ? ExitRun.fromPartial(object.exit) : undefined; - message.startThread = (object.startThread !== undefined && object.startThread !== null) - ? StartThreadRun.fromPartial(object.startThread) - : undefined; - message.waitThreads = (object.waitThreads !== undefined && object.waitThreads !== null) - ? WaitForThreadsRun.fromPartial(object.waitThreads) - : undefined; - message.sleep = (object.sleep !== undefined && object.sleep !== null) - ? SleepNodeRun.fromPartial(object.sleep) - : undefined; - message.userTask = (object.userTask !== undefined && object.userTask !== null) - ? UserTaskNodeRun.fromPartial(object.userTask) - : undefined; - message.startMultipleThreads = (object.startMultipleThreads !== undefined && object.startMultipleThreads !== null) - ? StartMultipleThreadsRun.fromPartial(object.startMultipleThreads) - : undefined; - message.throwEvent = (object.throwEvent !== undefined && object.throwEvent !== null) - ? ThrowEventNodeRun.fromPartial(object.throwEvent) - : undefined; - return message; - }, -}; - -function createBaseTaskNodeRun(): TaskNodeRun { - return { taskRunId: undefined }; -} - -export const TaskNodeRun = { - encode(message: TaskNodeRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskRunId !== undefined) { - TaskRunId.encode(message.taskRunId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskNodeRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskNodeRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskRunId = TaskRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskNodeRun { - return { taskRunId: isSet(object.taskRunId) ? TaskRunId.fromJSON(object.taskRunId) : undefined }; - }, - - toJSON(message: TaskNodeRun): unknown { - const obj: any = {}; - if (message.taskRunId !== undefined) { - obj.taskRunId = TaskRunId.toJSON(message.taskRunId); - } - return obj; - }, - - create, I>>(base?: I): TaskNodeRun { - return TaskNodeRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskNodeRun { - const message = createBaseTaskNodeRun(); - message.taskRunId = (object.taskRunId !== undefined && object.taskRunId !== null) - ? TaskRunId.fromPartial(object.taskRunId) - : undefined; - return message; - }, -}; - -function createBaseThrowEventNodeRun(): ThrowEventNodeRun { - return { workflowEventId: undefined }; -} - -export const ThrowEventNodeRun = { - encode(message: ThrowEventNodeRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.workflowEventId !== undefined) { - WorkflowEventId.encode(message.workflowEventId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ThrowEventNodeRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseThrowEventNodeRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.workflowEventId = WorkflowEventId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ThrowEventNodeRun { - return { - workflowEventId: isSet(object.workflowEventId) ? WorkflowEventId.fromJSON(object.workflowEventId) : undefined, - }; - }, - - toJSON(message: ThrowEventNodeRun): unknown { - const obj: any = {}; - if (message.workflowEventId !== undefined) { - obj.workflowEventId = WorkflowEventId.toJSON(message.workflowEventId); - } - return obj; - }, - - create, I>>(base?: I): ThrowEventNodeRun { - return ThrowEventNodeRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ThrowEventNodeRun { - const message = createBaseThrowEventNodeRun(); - message.workflowEventId = (object.workflowEventId !== undefined && object.workflowEventId !== null) - ? WorkflowEventId.fromPartial(object.workflowEventId) - : undefined; - return message; - }, -}; - -function createBaseUserTaskNodeRun(): UserTaskNodeRun { - return { userTaskRunId: undefined }; -} - -export const UserTaskNodeRun = { - encode(message: UserTaskNodeRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.userTaskRunId !== undefined) { - UserTaskRunId.encode(message.userTaskRunId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskNodeRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskNodeRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.userTaskRunId = UserTaskRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskNodeRun { - return { userTaskRunId: isSet(object.userTaskRunId) ? UserTaskRunId.fromJSON(object.userTaskRunId) : undefined }; - }, - - toJSON(message: UserTaskNodeRun): unknown { - const obj: any = {}; - if (message.userTaskRunId !== undefined) { - obj.userTaskRunId = UserTaskRunId.toJSON(message.userTaskRunId); - } - return obj; - }, - - create, I>>(base?: I): UserTaskNodeRun { - return UserTaskNodeRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskNodeRun { - const message = createBaseUserTaskNodeRun(); - message.userTaskRunId = (object.userTaskRunId !== undefined && object.userTaskRunId !== null) - ? UserTaskRunId.fromPartial(object.userTaskRunId) - : undefined; - return message; - }, -}; - -function createBaseEntrypointRun(): EntrypointRun { - return {}; -} - -export const EntrypointRun = { - encode(_: EntrypointRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): EntrypointRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEntrypointRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(_: any): EntrypointRun { - return {}; - }, - - toJSON(_: EntrypointRun): unknown { - const obj: any = {}; - return obj; - }, - - create, I>>(base?: I): EntrypointRun { - return EntrypointRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(_: I): EntrypointRun { - const message = createBaseEntrypointRun(); - return message; - }, -}; - -function createBaseExitRun(): ExitRun { - return {}; -} - -export const ExitRun = { - encode(_: ExitRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExitRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExitRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(_: any): ExitRun { - return {}; - }, - - toJSON(_: ExitRun): unknown { - const obj: any = {}; - return obj; - }, - - create, I>>(base?: I): ExitRun { - return ExitRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(_: I): ExitRun { - const message = createBaseExitRun(); - return message; - }, -}; - -function createBaseStartThreadRun(): StartThreadRun { - return { childThreadId: undefined, threadSpecName: "" }; -} - -export const StartThreadRun = { - encode(message: StartThreadRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.childThreadId !== undefined) { - writer.uint32(8).int32(message.childThreadId); - } - if (message.threadSpecName !== "") { - writer.uint32(18).string(message.threadSpecName); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): StartThreadRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseStartThreadRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.childThreadId = reader.int32(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.threadSpecName = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): StartThreadRun { - return { - childThreadId: isSet(object.childThreadId) ? globalThis.Number(object.childThreadId) : undefined, - threadSpecName: isSet(object.threadSpecName) ? globalThis.String(object.threadSpecName) : "", - }; - }, - - toJSON(message: StartThreadRun): unknown { - const obj: any = {}; - if (message.childThreadId !== undefined) { - obj.childThreadId = Math.round(message.childThreadId); - } - if (message.threadSpecName !== "") { - obj.threadSpecName = message.threadSpecName; - } - return obj; - }, - - create, I>>(base?: I): StartThreadRun { - return StartThreadRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): StartThreadRun { - const message = createBaseStartThreadRun(); - message.childThreadId = object.childThreadId ?? undefined; - message.threadSpecName = object.threadSpecName ?? ""; - return message; - }, -}; - -function createBaseStartMultipleThreadsRun(): StartMultipleThreadsRun { - return { threadSpecName: "", childThreadIds: [] }; -} - -export const StartMultipleThreadsRun = { - encode(message: StartMultipleThreadsRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.threadSpecName !== "") { - writer.uint32(10).string(message.threadSpecName); - } - writer.uint32(18).fork(); - for (const v of message.childThreadIds) { - writer.int32(v); - } - writer.ldelim(); - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): StartMultipleThreadsRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseStartMultipleThreadsRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.threadSpecName = reader.string(); - continue; - case 2: - if (tag === 16) { - message.childThreadIds.push(reader.int32()); - - continue; - } - - if (tag === 18) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.childThreadIds.push(reader.int32()); - } - - continue; - } - - break; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): StartMultipleThreadsRun { - return { - threadSpecName: isSet(object.threadSpecName) ? globalThis.String(object.threadSpecName) : "", - childThreadIds: globalThis.Array.isArray(object?.childThreadIds) - ? object.childThreadIds.map((e: any) => globalThis.Number(e)) - : [], - }; - }, - - toJSON(message: StartMultipleThreadsRun): unknown { - const obj: any = {}; - if (message.threadSpecName !== "") { - obj.threadSpecName = message.threadSpecName; - } - if (message.childThreadIds?.length) { - obj.childThreadIds = message.childThreadIds.map((e) => Math.round(e)); - } - return obj; - }, - - create, I>>(base?: I): StartMultipleThreadsRun { - return StartMultipleThreadsRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): StartMultipleThreadsRun { - const message = createBaseStartMultipleThreadsRun(); - message.threadSpecName = object.threadSpecName ?? ""; - message.childThreadIds = object.childThreadIds?.map((e) => e) || []; - return message; - }, -}; - -function createBaseWaitForThreadsRun(): WaitForThreadsRun { - return { threads: [] }; -} - -export const WaitForThreadsRun = { - encode(message: WaitForThreadsRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.threads) { - WaitForThreadsRun_WaitForThread.encode(v!, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WaitForThreadsRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWaitForThreadsRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.threads.push(WaitForThreadsRun_WaitForThread.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WaitForThreadsRun { - return { - threads: globalThis.Array.isArray(object?.threads) - ? object.threads.map((e: any) => WaitForThreadsRun_WaitForThread.fromJSON(e)) - : [], - }; - }, - - toJSON(message: WaitForThreadsRun): unknown { - const obj: any = {}; - if (message.threads?.length) { - obj.threads = message.threads.map((e) => WaitForThreadsRun_WaitForThread.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): WaitForThreadsRun { - return WaitForThreadsRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WaitForThreadsRun { - const message = createBaseWaitForThreadsRun(); - message.threads = object.threads?.map((e) => WaitForThreadsRun_WaitForThread.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseWaitForThreadsRun_WaitForThread(): WaitForThreadsRun_WaitForThread { - return { - threadEndTime: undefined, - threadStatus: LHStatus.STARTING, - threadRunNumber: 0, - waitingStatus: WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS, - failureHandlerThreadRunId: undefined, - }; -} - -export const WaitForThreadsRun_WaitForThread = { - encode(message: WaitForThreadsRun_WaitForThread, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.threadEndTime !== undefined) { - Timestamp.encode(toTimestamp(message.threadEndTime), writer.uint32(10).fork()).ldelim(); - } - if (message.threadStatus !== LHStatus.STARTING) { - writer.uint32(16).int32(lHStatusToNumber(message.threadStatus)); - } - if (message.threadRunNumber !== 0) { - writer.uint32(24).int32(message.threadRunNumber); - } - if (message.waitingStatus !== WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS) { - writer.uint32(32).int32(waitForThreadsRun_WaitingThreadStatusToNumber(message.waitingStatus)); - } - if (message.failureHandlerThreadRunId !== undefined) { - writer.uint32(40).int32(message.failureHandlerThreadRunId); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WaitForThreadsRun_WaitForThread { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWaitForThreadsRun_WaitForThread(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.threadEndTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.threadStatus = lHStatusFromJSON(reader.int32()); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.threadRunNumber = reader.int32(); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.waitingStatus = waitForThreadsRun_WaitingThreadStatusFromJSON(reader.int32()); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.failureHandlerThreadRunId = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WaitForThreadsRun_WaitForThread { - return { - threadEndTime: isSet(object.threadEndTime) ? globalThis.String(object.threadEndTime) : undefined, - threadStatus: isSet(object.threadStatus) ? lHStatusFromJSON(object.threadStatus) : LHStatus.STARTING, - threadRunNumber: isSet(object.threadRunNumber) ? globalThis.Number(object.threadRunNumber) : 0, - waitingStatus: isSet(object.waitingStatus) - ? waitForThreadsRun_WaitingThreadStatusFromJSON(object.waitingStatus) - : WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS, - failureHandlerThreadRunId: isSet(object.failureHandlerThreadRunId) - ? globalThis.Number(object.failureHandlerThreadRunId) - : undefined, - }; - }, - - toJSON(message: WaitForThreadsRun_WaitForThread): unknown { - const obj: any = {}; - if (message.threadEndTime !== undefined) { - obj.threadEndTime = message.threadEndTime; - } - if (message.threadStatus !== LHStatus.STARTING) { - obj.threadStatus = lHStatusToJSON(message.threadStatus); - } - if (message.threadRunNumber !== 0) { - obj.threadRunNumber = Math.round(message.threadRunNumber); - } - if (message.waitingStatus !== WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS) { - obj.waitingStatus = waitForThreadsRun_WaitingThreadStatusToJSON(message.waitingStatus); - } - if (message.failureHandlerThreadRunId !== undefined) { - obj.failureHandlerThreadRunId = Math.round(message.failureHandlerThreadRunId); - } - return obj; - }, - - create, I>>(base?: I): WaitForThreadsRun_WaitForThread { - return WaitForThreadsRun_WaitForThread.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): WaitForThreadsRun_WaitForThread { - const message = createBaseWaitForThreadsRun_WaitForThread(); - message.threadEndTime = object.threadEndTime ?? undefined; - message.threadStatus = object.threadStatus ?? LHStatus.STARTING; - message.threadRunNumber = object.threadRunNumber ?? 0; - message.waitingStatus = object.waitingStatus ?? WaitForThreadsRun_WaitingThreadStatus.THREAD_IN_PROGRESS; - message.failureHandlerThreadRunId = object.failureHandlerThreadRunId ?? undefined; - return message; - }, -}; - -function createBaseExternalEventRun(): ExternalEventRun { - return { externalEventDefId: undefined, eventTime: undefined, externalEventId: undefined, timedOut: false }; -} - -export const ExternalEventRun = { - encode(message: ExternalEventRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.externalEventDefId !== undefined) { - ExternalEventDefId.encode(message.externalEventDefId, writer.uint32(10).fork()).ldelim(); - } - if (message.eventTime !== undefined) { - Timestamp.encode(toTimestamp(message.eventTime), writer.uint32(18).fork()).ldelim(); - } - if (message.externalEventId !== undefined) { - ExternalEventId.encode(message.externalEventId, writer.uint32(26).fork()).ldelim(); - } - if (message.timedOut !== false) { - writer.uint32(32).bool(message.timedOut); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExternalEventRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExternalEventRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.externalEventDefId = ExternalEventDefId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.eventTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.externalEventId = ExternalEventId.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.timedOut = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExternalEventRun { - return { - externalEventDefId: isSet(object.externalEventDefId) - ? ExternalEventDefId.fromJSON(object.externalEventDefId) - : undefined, - eventTime: isSet(object.eventTime) ? globalThis.String(object.eventTime) : undefined, - externalEventId: isSet(object.externalEventId) ? ExternalEventId.fromJSON(object.externalEventId) : undefined, - timedOut: isSet(object.timedOut) ? globalThis.Boolean(object.timedOut) : false, - }; - }, - - toJSON(message: ExternalEventRun): unknown { - const obj: any = {}; - if (message.externalEventDefId !== undefined) { - obj.externalEventDefId = ExternalEventDefId.toJSON(message.externalEventDefId); - } - if (message.eventTime !== undefined) { - obj.eventTime = message.eventTime; - } - if (message.externalEventId !== undefined) { - obj.externalEventId = ExternalEventId.toJSON(message.externalEventId); - } - if (message.timedOut !== false) { - obj.timedOut = message.timedOut; - } - return obj; - }, - - create, I>>(base?: I): ExternalEventRun { - return ExternalEventRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExternalEventRun { - const message = createBaseExternalEventRun(); - message.externalEventDefId = (object.externalEventDefId !== undefined && object.externalEventDefId !== null) - ? ExternalEventDefId.fromPartial(object.externalEventDefId) - : undefined; - message.eventTime = object.eventTime ?? undefined; - message.externalEventId = (object.externalEventId !== undefined && object.externalEventId !== null) - ? ExternalEventId.fromPartial(object.externalEventId) - : undefined; - message.timedOut = object.timedOut ?? false; - return message; - }, -}; - -function createBaseSleepNodeRun(): SleepNodeRun { - return { maturationTime: undefined, matured: false }; -} - -export const SleepNodeRun = { - encode(message: SleepNodeRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.maturationTime !== undefined) { - Timestamp.encode(toTimestamp(message.maturationTime), writer.uint32(10).fork()).ldelim(); - } - if (message.matured !== false) { - writer.uint32(16).bool(message.matured); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SleepNodeRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSleepNodeRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.maturationTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.matured = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SleepNodeRun { - return { - maturationTime: isSet(object.maturationTime) ? globalThis.String(object.maturationTime) : undefined, - matured: isSet(object.matured) ? globalThis.Boolean(object.matured) : false, - }; - }, - - toJSON(message: SleepNodeRun): unknown { - const obj: any = {}; - if (message.maturationTime !== undefined) { - obj.maturationTime = message.maturationTime; - } - if (message.matured !== false) { - obj.matured = message.matured; - } - return obj; - }, - - create, I>>(base?: I): SleepNodeRun { - return SleepNodeRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SleepNodeRun { - const message = createBaseSleepNodeRun(); - message.maturationTime = object.maturationTime ?? undefined; - message.matured = object.matured ?? false; - return message; - }, -}; - -function createBaseFailure(): Failure { - return { - failureName: "", - message: "", - content: undefined, - wasProperlyHandled: false, - failureHandlerThreadrunId: undefined, - }; -} - -export const Failure = { - encode(message: Failure, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.failureName !== "") { - writer.uint32(10).string(message.failureName); - } - if (message.message !== "") { - writer.uint32(18).string(message.message); - } - if (message.content !== undefined) { - VariableValue.encode(message.content, writer.uint32(26).fork()).ldelim(); - } - if (message.wasProperlyHandled !== false) { - writer.uint32(32).bool(message.wasProperlyHandled); - } - if (message.failureHandlerThreadrunId !== undefined) { - writer.uint32(40).int32(message.failureHandlerThreadrunId); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Failure { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseFailure(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.failureName = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.message = reader.string(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.content = VariableValue.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.wasProperlyHandled = reader.bool(); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.failureHandlerThreadrunId = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): Failure { - return { - failureName: isSet(object.failureName) ? globalThis.String(object.failureName) : "", - message: isSet(object.message) ? globalThis.String(object.message) : "", - content: isSet(object.content) ? VariableValue.fromJSON(object.content) : undefined, - wasProperlyHandled: isSet(object.wasProperlyHandled) ? globalThis.Boolean(object.wasProperlyHandled) : false, - failureHandlerThreadrunId: isSet(object.failureHandlerThreadrunId) - ? globalThis.Number(object.failureHandlerThreadrunId) - : undefined, - }; - }, - - toJSON(message: Failure): unknown { - const obj: any = {}; - if (message.failureName !== "") { - obj.failureName = message.failureName; - } - if (message.message !== "") { - obj.message = message.message; - } - if (message.content !== undefined) { - obj.content = VariableValue.toJSON(message.content); - } - if (message.wasProperlyHandled !== false) { - obj.wasProperlyHandled = message.wasProperlyHandled; - } - if (message.failureHandlerThreadrunId !== undefined) { - obj.failureHandlerThreadrunId = Math.round(message.failureHandlerThreadrunId); - } - return obj; - }, - - create, I>>(base?: I): Failure { - return Failure.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Failure { - const message = createBaseFailure(); - message.failureName = object.failureName ?? ""; - message.message = object.message ?? ""; - message.content = (object.content !== undefined && object.content !== null) - ? VariableValue.fromPartial(object.content) - : undefined; - message.wasProperlyHandled = object.wasProperlyHandled ?? false; - message.failureHandlerThreadrunId = object.failureHandlerThreadrunId ?? undefined; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/object_id.ts b/dashboard/apps/web/littlehorse-public-api/object_id.ts deleted file mode 100644 index 86684d7e8..000000000 --- a/dashboard/apps/web/littlehorse-public-api/object_id.ts +++ /dev/null @@ -1,1537 +0,0 @@ -/* eslint-disable */ -import * as _m0 from "protobufjs/minimal"; -import { - MetricsWindowLength, - metricsWindowLengthFromJSON, - metricsWindowLengthToJSON, - metricsWindowLengthToNumber, -} from "./common_enums"; -import { Timestamp } from "./google/protobuf/timestamp"; - -export const protobufPackage = "littlehorse"; - -/** The ID of a WfSpec. */ -export interface WfSpecId { - /** Name of the WfSpec. */ - name: string; - /** - * Major Version of a WfSpec. - * - * Note that WfSpec's are versioned. Creating a new WfSpec with the same name - * and no breaking changes to the public Variables API results in a new WfSpec - * being created with the same MajorVersion and a new revision. Creating a - * WfSpec with a breaking change to the public Variables API results in a - * new WfSpec being created with the same name, an incremented major_version, - * and revision = 0. - */ - majorVersion: number; - /** - * Revision of a WfSpec. - * - * Note that WfSpec's are versioned. Creating a new WfSpec with the same name - * and no breaking changes to the public Variables API results in a new WfSpec - * being created with the same MajorVersion and a new revision. Creating a - * WfSpec with a breaking change to the public Variables API results in a - * new WfSpec being created with the same name, an incremented major_version, - * and revision = 0. - */ - revision: number; -} - -/** ID for a TaskDef. */ -export interface TaskDefId { - /** TaskDef's are uniquely identified by their name. */ - name: string; -} - -/** ID for ExternalEventDef */ -export interface ExternalEventDefId { - /** ExternalEventDef's are uniquedly identified by their name. */ - name: string; -} - -/** ID for a UserTaskDef */ -export interface UserTaskDefId { - /** The name of a UserTaskDef */ - name: string; - /** Note that UserTaskDef's use simple versioning. */ - version: number; -} - -/** ID for a WorkflowEventDef. */ -export interface WorkflowEventDefId { - /** The name of the WorkflowEventDef */ - name: string; -} - -/** ID for a TaskWorkerGroup. */ -export interface TaskWorkerGroupId { - /** TaskWorkerGroups are uniquely identified by their TaskDefId. */ - taskDefId: TaskDefId | undefined; -} - -/** Id for a Variable. */ -export interface VariableId { - /** - * WfRunId for the variable. Note that every Variable is associated with - * a WfRun. - */ - wfRunId: - | WfRunId - | undefined; - /** - * Each Variable is owned by a specific ThreadRun inside the WfRun it belongs - * to. This is that ThreadRun's number. - */ - threadRunNumber: number; - /** The name of the variable. */ - name: string; -} - -/** ID for an ExternalEvent. */ -export interface ExternalEventId { - /** - * WfRunId for the ExternalEvent. Note that every ExternalEvent is associated - * with a WfRun. - */ - wfRunId: - | WfRunId - | undefined; - /** The ExternalEventDef for this ExternalEvent. */ - externalEventDefId: - | ExternalEventDefId - | undefined; - /** - * A unique guid allowing for distinguishing this ExternalEvent from other events - * of the same ExternalEventDef and WfRun. - */ - guid: string; -} - -/** ID for a WfRun */ -export interface WfRunId { - /** The ID for this WfRun instance. */ - id: string; - /** A WfRun may have a parent WfRun. If so, this field is set to the parent's ID. */ - parentWfRunId?: WfRunId | undefined; -} - -/** ID for a NodeRun. */ -export interface NodeRunId { - /** - * ID of the WfRun for this NodeRun. Note that every NodeRun is associated with - * a WfRun. - */ - wfRunId: - | WfRunId - | undefined; - /** ThreadRun of this NodeRun. Note that each NodeRun belongs to a ThreadRun. */ - threadRunNumber: number; - /** Position of this NodeRun within its ThreadRun. */ - position: number; -} - -/** An ID for a WorkflowEvent. */ -export interface WorkflowEventId { - /** The Id of the WfRun that threw the event. */ - wfRunId: - | WfRunId - | undefined; - /** The ID of the WorkflowEventDef that this WorkflowEvent is a member of. */ - workflowEventDefId: - | WorkflowEventDefId - | undefined; - /** - * A sequence number that makes the WorkflowEventId unique among all WorkflowEvent's of the - * same type thrown by the WfRun. This field starts at zero and is incremented every - * time a WorkflowEvent of the same type is thrown by the same WfRun. - */ - number: number; -} - -/** ID for a TaskRun. */ -export interface TaskRunId { - /** - * WfRunId for this TaskRun. Note that every TaskRun is associated with - * a WfRun. - */ - wfRunId: - | WfRunId - | undefined; - /** Unique identifier for this TaskRun. Unique among the WfRun. */ - taskGuid: string; -} - -/** ID for a UserTaskRun */ -export interface UserTaskRunId { - /** - * WfRunId for this UserTaskRun. Note that every UserTaskRun is associated - * with a WfRun. - */ - wfRunId: - | WfRunId - | undefined; - /** Unique identifier for this UserTaskRun. */ - userTaskGuid: string; -} - -/** ID for a specific window of TaskDef metrics. */ -export interface TaskDefMetricsId { - /** The timestamp at which this metrics window starts. */ - windowStart: - | string - | undefined; - /** The length of this window. */ - windowType: MetricsWindowLength; - /** The TaskDefId that this metrics window reports on. */ - taskDefId: TaskDefId | undefined; -} - -/** ID for a specific window of WfSpec metrics. */ -export interface WfSpecMetricsId { - /** The timestamp at which this metrics window starts. */ - windowStart: - | string - | undefined; - /** The length of this window. */ - windowType: MetricsWindowLength; - /** The WfSpecId that this metrics window reports on. */ - wfSpecId: WfSpecId | undefined; -} - -/** ID for a Principal. */ -export interface PrincipalId { - /** - * The id of this principal. In OAuth, this is the OAuth Client ID (for - * machine principals) or the OAuth User Id (for human principals). - */ - id: string; -} - -/** ID for a Tenant. */ -export interface TenantId { - /** The Tenant ID. */ - id: string; -} - -function createBaseWfSpecId(): WfSpecId { - return { name: "", majorVersion: 0, revision: 0 }; -} - -export const WfSpecId = { - encode(message: WfSpecId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - if (message.majorVersion !== 0) { - writer.uint32(16).int32(message.majorVersion); - } - if (message.revision !== 0) { - writer.uint32(24).int32(message.revision); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfSpecId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfSpecId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.majorVersion = reader.int32(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.revision = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfSpecId { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - majorVersion: isSet(object.majorVersion) ? globalThis.Number(object.majorVersion) : 0, - revision: isSet(object.revision) ? globalThis.Number(object.revision) : 0, - }; - }, - - toJSON(message: WfSpecId): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.majorVersion !== 0) { - obj.majorVersion = Math.round(message.majorVersion); - } - if (message.revision !== 0) { - obj.revision = Math.round(message.revision); - } - return obj; - }, - - create, I>>(base?: I): WfSpecId { - return WfSpecId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfSpecId { - const message = createBaseWfSpecId(); - message.name = object.name ?? ""; - message.majorVersion = object.majorVersion ?? 0; - message.revision = object.revision ?? 0; - return message; - }, -}; - -function createBaseTaskDefId(): TaskDefId { - return { name: "" }; -} - -export const TaskDefId = { - encode(message: TaskDefId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskDefId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskDefId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskDefId { - return { name: isSet(object.name) ? globalThis.String(object.name) : "" }; - }, - - toJSON(message: TaskDefId): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - return obj; - }, - - create, I>>(base?: I): TaskDefId { - return TaskDefId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskDefId { - const message = createBaseTaskDefId(); - message.name = object.name ?? ""; - return message; - }, -}; - -function createBaseExternalEventDefId(): ExternalEventDefId { - return { name: "" }; -} - -export const ExternalEventDefId = { - encode(message: ExternalEventDefId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExternalEventDefId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExternalEventDefId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExternalEventDefId { - return { name: isSet(object.name) ? globalThis.String(object.name) : "" }; - }, - - toJSON(message: ExternalEventDefId): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - return obj; - }, - - create, I>>(base?: I): ExternalEventDefId { - return ExternalEventDefId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExternalEventDefId { - const message = createBaseExternalEventDefId(); - message.name = object.name ?? ""; - return message; - }, -}; - -function createBaseUserTaskDefId(): UserTaskDefId { - return { name: "", version: 0 }; -} - -export const UserTaskDefId = { - encode(message: UserTaskDefId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - if (message.version !== 0) { - writer.uint32(16).int32(message.version); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskDefId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskDefId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.version = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskDefId { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - version: isSet(object.version) ? globalThis.Number(object.version) : 0, - }; - }, - - toJSON(message: UserTaskDefId): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.version !== 0) { - obj.version = Math.round(message.version); - } - return obj; - }, - - create, I>>(base?: I): UserTaskDefId { - return UserTaskDefId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskDefId { - const message = createBaseUserTaskDefId(); - message.name = object.name ?? ""; - message.version = object.version ?? 0; - return message; - }, -}; - -function createBaseWorkflowEventDefId(): WorkflowEventDefId { - return { name: "" }; -} - -export const WorkflowEventDefId = { - encode(message: WorkflowEventDefId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WorkflowEventDefId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWorkflowEventDefId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WorkflowEventDefId { - return { name: isSet(object.name) ? globalThis.String(object.name) : "" }; - }, - - toJSON(message: WorkflowEventDefId): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - return obj; - }, - - create, I>>(base?: I): WorkflowEventDefId { - return WorkflowEventDefId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WorkflowEventDefId { - const message = createBaseWorkflowEventDefId(); - message.name = object.name ?? ""; - return message; - }, -}; - -function createBaseTaskWorkerGroupId(): TaskWorkerGroupId { - return { taskDefId: undefined }; -} - -export const TaskWorkerGroupId = { - encode(message: TaskWorkerGroupId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskDefId !== undefined) { - TaskDefId.encode(message.taskDefId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskWorkerGroupId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskWorkerGroupId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskDefId = TaskDefId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskWorkerGroupId { - return { taskDefId: isSet(object.taskDefId) ? TaskDefId.fromJSON(object.taskDefId) : undefined }; - }, - - toJSON(message: TaskWorkerGroupId): unknown { - const obj: any = {}; - if (message.taskDefId !== undefined) { - obj.taskDefId = TaskDefId.toJSON(message.taskDefId); - } - return obj; - }, - - create, I>>(base?: I): TaskWorkerGroupId { - return TaskWorkerGroupId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskWorkerGroupId { - const message = createBaseTaskWorkerGroupId(); - message.taskDefId = (object.taskDefId !== undefined && object.taskDefId !== null) - ? TaskDefId.fromPartial(object.taskDefId) - : undefined; - return message; - }, -}; - -function createBaseVariableId(): VariableId { - return { wfRunId: undefined, threadRunNumber: 0, name: "" }; -} - -export const VariableId = { - encode(message: VariableId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.threadRunNumber !== 0) { - writer.uint32(16).int32(message.threadRunNumber); - } - if (message.name !== "") { - writer.uint32(26).string(message.name); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VariableId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariableId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.threadRunNumber = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.name = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VariableId { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - threadRunNumber: isSet(object.threadRunNumber) ? globalThis.Number(object.threadRunNumber) : 0, - name: isSet(object.name) ? globalThis.String(object.name) : "", - }; - }, - - toJSON(message: VariableId): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.threadRunNumber !== 0) { - obj.threadRunNumber = Math.round(message.threadRunNumber); - } - if (message.name !== "") { - obj.name = message.name; - } - return obj; - }, - - create, I>>(base?: I): VariableId { - return VariableId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): VariableId { - const message = createBaseVariableId(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.threadRunNumber = object.threadRunNumber ?? 0; - message.name = object.name ?? ""; - return message; - }, -}; - -function createBaseExternalEventId(): ExternalEventId { - return { wfRunId: undefined, externalEventDefId: undefined, guid: "" }; -} - -export const ExternalEventId = { - encode(message: ExternalEventId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.externalEventDefId !== undefined) { - ExternalEventDefId.encode(message.externalEventDefId, writer.uint32(18).fork()).ldelim(); - } - if (message.guid !== "") { - writer.uint32(26).string(message.guid); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExternalEventId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExternalEventId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.externalEventDefId = ExternalEventDefId.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.guid = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExternalEventId { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - externalEventDefId: isSet(object.externalEventDefId) - ? ExternalEventDefId.fromJSON(object.externalEventDefId) - : undefined, - guid: isSet(object.guid) ? globalThis.String(object.guid) : "", - }; - }, - - toJSON(message: ExternalEventId): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.externalEventDefId !== undefined) { - obj.externalEventDefId = ExternalEventDefId.toJSON(message.externalEventDefId); - } - if (message.guid !== "") { - obj.guid = message.guid; - } - return obj; - }, - - create, I>>(base?: I): ExternalEventId { - return ExternalEventId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExternalEventId { - const message = createBaseExternalEventId(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.externalEventDefId = (object.externalEventDefId !== undefined && object.externalEventDefId !== null) - ? ExternalEventDefId.fromPartial(object.externalEventDefId) - : undefined; - message.guid = object.guid ?? ""; - return message; - }, -}; - -function createBaseWfRunId(): WfRunId { - return { id: "", parentWfRunId: undefined }; -} - -export const WfRunId = { - encode(message: WfRunId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== "") { - writer.uint32(10).string(message.id); - } - if (message.parentWfRunId !== undefined) { - WfRunId.encode(message.parentWfRunId, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfRunId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfRunId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.parentWfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfRunId { - return { - id: isSet(object.id) ? globalThis.String(object.id) : "", - parentWfRunId: isSet(object.parentWfRunId) ? WfRunId.fromJSON(object.parentWfRunId) : undefined, - }; - }, - - toJSON(message: WfRunId): unknown { - const obj: any = {}; - if (message.id !== "") { - obj.id = message.id; - } - if (message.parentWfRunId !== undefined) { - obj.parentWfRunId = WfRunId.toJSON(message.parentWfRunId); - } - return obj; - }, - - create, I>>(base?: I): WfRunId { - return WfRunId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfRunId { - const message = createBaseWfRunId(); - message.id = object.id ?? ""; - message.parentWfRunId = (object.parentWfRunId !== undefined && object.parentWfRunId !== null) - ? WfRunId.fromPartial(object.parentWfRunId) - : undefined; - return message; - }, -}; - -function createBaseNodeRunId(): NodeRunId { - return { wfRunId: undefined, threadRunNumber: 0, position: 0 }; -} - -export const NodeRunId = { - encode(message: NodeRunId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.threadRunNumber !== 0) { - writer.uint32(16).int32(message.threadRunNumber); - } - if (message.position !== 0) { - writer.uint32(24).int32(message.position); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): NodeRunId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseNodeRunId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.threadRunNumber = reader.int32(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.position = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): NodeRunId { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - threadRunNumber: isSet(object.threadRunNumber) ? globalThis.Number(object.threadRunNumber) : 0, - position: isSet(object.position) ? globalThis.Number(object.position) : 0, - }; - }, - - toJSON(message: NodeRunId): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.threadRunNumber !== 0) { - obj.threadRunNumber = Math.round(message.threadRunNumber); - } - if (message.position !== 0) { - obj.position = Math.round(message.position); - } - return obj; - }, - - create, I>>(base?: I): NodeRunId { - return NodeRunId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): NodeRunId { - const message = createBaseNodeRunId(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.threadRunNumber = object.threadRunNumber ?? 0; - message.position = object.position ?? 0; - return message; - }, -}; - -function createBaseWorkflowEventId(): WorkflowEventId { - return { wfRunId: undefined, workflowEventDefId: undefined, number: 0 }; -} - -export const WorkflowEventId = { - encode(message: WorkflowEventId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.workflowEventDefId !== undefined) { - WorkflowEventDefId.encode(message.workflowEventDefId, writer.uint32(18).fork()).ldelim(); - } - if (message.number !== 0) { - writer.uint32(24).int32(message.number); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WorkflowEventId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWorkflowEventId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.workflowEventDefId = WorkflowEventDefId.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.number = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WorkflowEventId { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - workflowEventDefId: isSet(object.workflowEventDefId) - ? WorkflowEventDefId.fromJSON(object.workflowEventDefId) - : undefined, - number: isSet(object.number) ? globalThis.Number(object.number) : 0, - }; - }, - - toJSON(message: WorkflowEventId): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.workflowEventDefId !== undefined) { - obj.workflowEventDefId = WorkflowEventDefId.toJSON(message.workflowEventDefId); - } - if (message.number !== 0) { - obj.number = Math.round(message.number); - } - return obj; - }, - - create, I>>(base?: I): WorkflowEventId { - return WorkflowEventId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WorkflowEventId { - const message = createBaseWorkflowEventId(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.workflowEventDefId = (object.workflowEventDefId !== undefined && object.workflowEventDefId !== null) - ? WorkflowEventDefId.fromPartial(object.workflowEventDefId) - : undefined; - message.number = object.number ?? 0; - return message; - }, -}; - -function createBaseTaskRunId(): TaskRunId { - return { wfRunId: undefined, taskGuid: "" }; -} - -export const TaskRunId = { - encode(message: TaskRunId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.taskGuid !== "") { - writer.uint32(18).string(message.taskGuid); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskRunId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskRunId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.taskGuid = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskRunId { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - taskGuid: isSet(object.taskGuid) ? globalThis.String(object.taskGuid) : "", - }; - }, - - toJSON(message: TaskRunId): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.taskGuid !== "") { - obj.taskGuid = message.taskGuid; - } - return obj; - }, - - create, I>>(base?: I): TaskRunId { - return TaskRunId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskRunId { - const message = createBaseTaskRunId(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.taskGuid = object.taskGuid ?? ""; - return message; - }, -}; - -function createBaseUserTaskRunId(): UserTaskRunId { - return { wfRunId: undefined, userTaskGuid: "" }; -} - -export const UserTaskRunId = { - encode(message: UserTaskRunId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.userTaskGuid !== "") { - writer.uint32(18).string(message.userTaskGuid); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskRunId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskRunId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.userTaskGuid = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskRunId { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - userTaskGuid: isSet(object.userTaskGuid) ? globalThis.String(object.userTaskGuid) : "", - }; - }, - - toJSON(message: UserTaskRunId): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.userTaskGuid !== "") { - obj.userTaskGuid = message.userTaskGuid; - } - return obj; - }, - - create, I>>(base?: I): UserTaskRunId { - return UserTaskRunId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskRunId { - const message = createBaseUserTaskRunId(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.userTaskGuid = object.userTaskGuid ?? ""; - return message; - }, -}; - -function createBaseTaskDefMetricsId(): TaskDefMetricsId { - return { windowStart: undefined, windowType: MetricsWindowLength.MINUTES_5, taskDefId: undefined }; -} - -export const TaskDefMetricsId = { - encode(message: TaskDefMetricsId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.windowStart !== undefined) { - Timestamp.encode(toTimestamp(message.windowStart), writer.uint32(10).fork()).ldelim(); - } - if (message.windowType !== MetricsWindowLength.MINUTES_5) { - writer.uint32(16).int32(metricsWindowLengthToNumber(message.windowType)); - } - if (message.taskDefId !== undefined) { - TaskDefId.encode(message.taskDefId, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskDefMetricsId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskDefMetricsId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.windowStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.windowType = metricsWindowLengthFromJSON(reader.int32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.taskDefId = TaskDefId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskDefMetricsId { - return { - windowStart: isSet(object.windowStart) ? globalThis.String(object.windowStart) : undefined, - windowType: isSet(object.windowType) - ? metricsWindowLengthFromJSON(object.windowType) - : MetricsWindowLength.MINUTES_5, - taskDefId: isSet(object.taskDefId) ? TaskDefId.fromJSON(object.taskDefId) : undefined, - }; - }, - - toJSON(message: TaskDefMetricsId): unknown { - const obj: any = {}; - if (message.windowStart !== undefined) { - obj.windowStart = message.windowStart; - } - if (message.windowType !== MetricsWindowLength.MINUTES_5) { - obj.windowType = metricsWindowLengthToJSON(message.windowType); - } - if (message.taskDefId !== undefined) { - obj.taskDefId = TaskDefId.toJSON(message.taskDefId); - } - return obj; - }, - - create, I>>(base?: I): TaskDefMetricsId { - return TaskDefMetricsId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskDefMetricsId { - const message = createBaseTaskDefMetricsId(); - message.windowStart = object.windowStart ?? undefined; - message.windowType = object.windowType ?? MetricsWindowLength.MINUTES_5; - message.taskDefId = (object.taskDefId !== undefined && object.taskDefId !== null) - ? TaskDefId.fromPartial(object.taskDefId) - : undefined; - return message; - }, -}; - -function createBaseWfSpecMetricsId(): WfSpecMetricsId { - return { windowStart: undefined, windowType: MetricsWindowLength.MINUTES_5, wfSpecId: undefined }; -} - -export const WfSpecMetricsId = { - encode(message: WfSpecMetricsId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.windowStart !== undefined) { - Timestamp.encode(toTimestamp(message.windowStart), writer.uint32(10).fork()).ldelim(); - } - if (message.windowType !== MetricsWindowLength.MINUTES_5) { - writer.uint32(16).int32(metricsWindowLengthToNumber(message.windowType)); - } - if (message.wfSpecId !== undefined) { - WfSpecId.encode(message.wfSpecId, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfSpecMetricsId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfSpecMetricsId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.windowStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.windowType = metricsWindowLengthFromJSON(reader.int32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.wfSpecId = WfSpecId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfSpecMetricsId { - return { - windowStart: isSet(object.windowStart) ? globalThis.String(object.windowStart) : undefined, - windowType: isSet(object.windowType) - ? metricsWindowLengthFromJSON(object.windowType) - : MetricsWindowLength.MINUTES_5, - wfSpecId: isSet(object.wfSpecId) ? WfSpecId.fromJSON(object.wfSpecId) : undefined, - }; - }, - - toJSON(message: WfSpecMetricsId): unknown { - const obj: any = {}; - if (message.windowStart !== undefined) { - obj.windowStart = message.windowStart; - } - if (message.windowType !== MetricsWindowLength.MINUTES_5) { - obj.windowType = metricsWindowLengthToJSON(message.windowType); - } - if (message.wfSpecId !== undefined) { - obj.wfSpecId = WfSpecId.toJSON(message.wfSpecId); - } - return obj; - }, - - create, I>>(base?: I): WfSpecMetricsId { - return WfSpecMetricsId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfSpecMetricsId { - const message = createBaseWfSpecMetricsId(); - message.windowStart = object.windowStart ?? undefined; - message.windowType = object.windowType ?? MetricsWindowLength.MINUTES_5; - message.wfSpecId = (object.wfSpecId !== undefined && object.wfSpecId !== null) - ? WfSpecId.fromPartial(object.wfSpecId) - : undefined; - return message; - }, -}; - -function createBasePrincipalId(): PrincipalId { - return { id: "" }; -} - -export const PrincipalId = { - encode(message: PrincipalId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== "") { - writer.uint32(10).string(message.id); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PrincipalId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePrincipalId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PrincipalId { - return { id: isSet(object.id) ? globalThis.String(object.id) : "" }; - }, - - toJSON(message: PrincipalId): unknown { - const obj: any = {}; - if (message.id !== "") { - obj.id = message.id; - } - return obj; - }, - - create, I>>(base?: I): PrincipalId { - return PrincipalId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PrincipalId { - const message = createBasePrincipalId(); - message.id = object.id ?? ""; - return message; - }, -}; - -function createBaseTenantId(): TenantId { - return { id: "" }; -} - -export const TenantId = { - encode(message: TenantId, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== "") { - writer.uint32(10).string(message.id); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TenantId { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTenantId(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TenantId { - return { id: isSet(object.id) ? globalThis.String(object.id) : "" }; - }, - - toJSON(message: TenantId): unknown { - const obj: any = {}; - if (message.id !== "") { - obj.id = message.id; - } - return obj; - }, - - create, I>>(base?: I): TenantId { - return TenantId.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TenantId { - const message = createBaseTenantId(); - message.id = object.id ?? ""; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/service.ts b/dashboard/apps/web/littlehorse-public-api/service.ts deleted file mode 100644 index dddc18605..000000000 --- a/dashboard/apps/web/littlehorse-public-api/service.ts +++ /dev/null @@ -1,9201 +0,0 @@ -/* eslint-disable */ -import Long from "long"; -import { type CallContext, type CallOptions } from "nice-grpc-common"; -import * as _m0 from "protobufjs/minimal"; -import { Principal, PutPrincipalRequest, PutTenantRequest, Tenant } from "./acls"; -import { - LHStatus, - lHStatusFromJSON, - lHStatusToJSON, - lHStatusToNumber, - MetricsWindowLength, - metricsWindowLengthFromJSON, - metricsWindowLengthToJSON, - metricsWindowLengthToNumber, - TaskStatus, - taskStatusFromJSON, - taskStatusToJSON, - taskStatusToNumber, - VariableType, - variableTypeFromJSON, - variableTypeToJSON, - variableTypeToNumber, -} from "./common_enums"; -import { VariableDef } from "./common_wfspec"; -import { ExternalEvent, ExternalEventDef, ExternalEventRetentionPolicy } from "./external_event"; -import { Empty } from "./google/protobuf/empty"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { NodeRun } from "./node_run"; -import { - ExternalEventDefId, - ExternalEventId, - NodeRunId, - TaskDefId, - TaskRunId, - TenantId, - UserTaskDefId, - UserTaskRunId, - VariableId, - WfRunId, - WfSpecId, - WorkflowEventDefId, - WorkflowEventId, -} from "./object_id"; -import { TaskDef } from "./task_def"; -import { LHTaskError, LHTaskException, TaskRun, TaskRunSource, VarNameAndVal } from "./task_run"; -import { - AssignUserTaskRunRequest, - CancelUserTaskRunRequest, - CompleteUserTaskRunRequest, - UserTaskDef, - UserTaskField, - UserTaskRun, - UserTaskRunStatus, - userTaskRunStatusFromJSON, - userTaskRunStatusToJSON, - userTaskRunStatusToNumber, -} from "./user_tasks"; -import { Variable, VariableValue } from "./variable"; -import { WfRun } from "./wf_run"; -import { - ThreadSpec, - WfSpec, - WfSpec_ParentWfSpecReference, - WfSpecVersionMigration, - WorkflowRetentionPolicy, -} from "./wf_spec"; -import { WorkflowEvent, WorkflowEventDef } from "./workflow_event"; - -export const protobufPackage = "littlehorse"; - -/** - * This enum controls the behavior of a PutWfSpecRequest when a WfSpec with the same - * name previously exists. - */ -export enum AllowedUpdateType { - /** - * ALL_UPDATES - Allows any update: both minor (revsion) changes and breaking (majorVersion) changes - * are accepted - */ - ALL_UPDATES = "ALL_UPDATES", - /** - * MINOR_REVISION_UPDATES - Allows only backwards-compatible changes that do not change the required input variables - * or the searchable variables in the WfSpec. - */ - MINOR_REVISION_UPDATES = "MINOR_REVISION_UPDATES", - /** NO_UPDATES - Rejects any changes to the WfSpec. */ - NO_UPDATES = "NO_UPDATES", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function allowedUpdateTypeFromJSON(object: any): AllowedUpdateType { - switch (object) { - case 0: - case "ALL_UPDATES": - return AllowedUpdateType.ALL_UPDATES; - case 1: - case "MINOR_REVISION_UPDATES": - return AllowedUpdateType.MINOR_REVISION_UPDATES; - case 2: - case "NO_UPDATES": - return AllowedUpdateType.NO_UPDATES; - case -1: - case "UNRECOGNIZED": - default: - return AllowedUpdateType.UNRECOGNIZED; - } -} - -export function allowedUpdateTypeToJSON(object: AllowedUpdateType): string { - switch (object) { - case AllowedUpdateType.ALL_UPDATES: - return "ALL_UPDATES"; - case AllowedUpdateType.MINOR_REVISION_UPDATES: - return "MINOR_REVISION_UPDATES"; - case AllowedUpdateType.NO_UPDATES: - return "NO_UPDATES"; - case AllowedUpdateType.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function allowedUpdateTypeToNumber(object: AllowedUpdateType): number { - switch (object) { - case AllowedUpdateType.ALL_UPDATES: - return 0; - case AllowedUpdateType.MINOR_REVISION_UPDATES: - return 1; - case AllowedUpdateType.NO_UPDATES: - return 2; - case AllowedUpdateType.UNRECOGNIZED: - default: - return -1; - } -} - -/** Returns the UserTaskDef with a given name and the highest version number. */ -export interface GetLatestUserTaskDefRequest { - /** The name of the UserTaskDef to search for. */ - name: string; -} - -/** - * Creates a WfSpec. Generally, this request is generated by the Workflow object in - * our various SDK's. - */ -export interface PutWfSpecRequest { - /** The name of the resulting WfSpec. */ - name: string; - /** Map from name the ThreadSpec. */ - threadSpecs: { [key: string]: ThreadSpec }; - /** The name of the ThreadSpec to be used as the workflow entrypoint. */ - entrypointThreadName: string; - /** - * Optional policy to determine how long a WfRun is retained in the data store after - * it is completed or terminated. - */ - retentionPolicy?: - | WorkflowRetentionPolicy - | undefined; - /** - * Parent WfSpec Reference. If this is set, then all WfRun's for this WfSpec *MUST* be - * Child WfRun's of the specified WfSpec. - */ - parentWfSpec?: - | WfSpec_ParentWfSpecReference - | undefined; - /** - * Configures the behavior of this individual request. Can be used to prevent - * breaking changes to the WfSpec, prevent any changes to the WfSpec, or allow - * all changes to the WfSpec. - */ - allowedUpdates: AllowedUpdateType; -} - -export interface PutWfSpecRequest_ThreadSpecsEntry { - key: string; - value: ThreadSpec | undefined; -} - -/** Creates a TaskDef. */ -export interface PutTaskDefRequest { - /** The name of the TaskDef to create. */ - name: string; - /** - * Variables required to execute the TaskDef. Normally, these are automatically - * generated by the Task Worker SDK. - */ - inputVars: VariableDef[]; -} - -/** EXPERIMENTAL: Creates a WorkflowEventDef */ -export interface PutWorkflowEventDefRequest { - name: string; - type: VariableType; -} - -/** Creates a UserTaskDef. */ -export interface PutUserTaskDefRequest { - /** The name of the UserTaskDef to create. */ - name: string; - /** - * The fields that should be presented to the user on the screen in order to fill - * out the User Task. Note that these fields also define a data contract for the - * result of the UserTaskDef. - */ - fields: UserTaskField[]; - /** - * Optional metadata field to store user-defined data. Does not impact workflow - * execution. Fine to store up to a few KB of text here. - */ - description?: string | undefined; -} - -/** Field to create an ExternalEventDef. */ -export interface PutExternalEventDefRequest { - /** The name of the resulting ExternalEventDef. */ - name: string; - /** - * Policy to determine how long an ExternalEvent is retained after creation if it - * is not yet claimed by a WfRun. Note that once a WfRun has been matched with the - * ExternalEvent, the ExternalEvent is deleted if/when that WfRun is deleted. - * If not set, then ExternalEvent's are not deleted if they are not matched with - * a WfRun. - * - * A future version of LittleHorse will allow changing the retention_policy, which - * will trigger a cleanup of old `ExternalEvent`s. - */ - retentionPolicy: ExternalEventRetentionPolicy | undefined; -} - -/** Request used to create an ExternalEvent. */ -export interface PutExternalEventRequest { - /** The ID of the WfRun that this Event is sent to. */ - wfRunId: - | WfRunId - | undefined; - /** The ID of the ExternalEventDef that this event implements. */ - externalEventDefId: - | ExternalEventDefId - | undefined; - /** - * Note that an ExternalEventDefId is a three-part ID: - * 1. WfRunId - * 2. ExternalEventDef Name - * 3. A guid - * The guid from part 3) can be optionally provided to the PutExternalEventRequest - * in order to make it idempotent. It is a best practice to do so. - */ - guid?: - | string - | undefined; - /** The content of this event. */ - content: - | VariableValue - | undefined; - /** Optionally specify that this ExternalEvent may only be claimed by a specific ThreadRun. */ - threadRunNumber?: - | number - | undefined; - /** - * Optionally specify that this ExternalEvent may only be claimed by a specific NodeRun. - * In order for this to be set, you must also set thread_run_number. - */ - nodeRunPosition?: number | undefined; -} - -/** Deletes an ExternalEvent. */ -export interface DeleteExternalEventRequest { - /** The ID of the ExternalEvent to delete. */ - id: ExternalEventId | undefined; -} - -/** Deletes a WfRun. */ -export interface DeleteWfRunRequest { - /** The ID of the WfRun to delete. */ - id: WfRunId | undefined; -} - -/** Deletes a TaskDef. */ -export interface DeleteTaskDefRequest { - /** The ID of the TaskDef to delete. */ - id: TaskDefId | undefined; -} - -/** Deletes a UserTaskDef. */ -export interface DeleteUserTaskDefRequest { - /** The ID of the UserTaskDef to delete. */ - id: UserTaskDefId | undefined; -} - -/** Deletes a WfSpec */ -export interface DeleteWfSpecRequest { - /** The ID of the WfSpec to delete */ - id: WfSpecId | undefined; -} - -/** Deletes an ExternalEventDef */ -export interface DeleteExternalEventDefRequest { - /** The ID of the ExternalEventDef to delete. */ - id: ExternalEventDefId | undefined; -} - -/** Create a Workflow Run. */ -export interface RunWfRequest { - /** The name of the WfSpec to run. */ - wfSpecName: string; - /** - * Optionally specify the major version of the WfSpec to run. This guarantees that - * the "signature" of the WfSpec (i.e. the required input variables, and searchable - * variables) will not change for this app. - */ - majorVersion?: - | number - | undefined; - /** - * Optionally specify the specific revision of the WfSpec to run. It is not recommended - * to use this in practice, as the WfSpec logic should be de-coupled from the applications - * that run WfRun's. - */ - revision?: - | number - | undefined; - /** - * A map from Variable Name to Values for those variables. The provided variables are - * passed as input to the Entrypoint ThreadRun. - */ - variables: { [key: string]: VariableValue }; - /** - * You can optionally specify the ID of this WfRun. This is a recommended best practice - * as it also makes your request idempotent and allows you to easily find the WfRun at - * a later time. - */ - id?: string | undefined; - parentWfRunId?: WfRunId | undefined; -} - -export interface RunWfRequest_VariablesEntry { - key: string; - value: VariableValue | undefined; -} - -/** - * Used by a SearchWfRunRequest to filter WfRun's and only return those whose Variable's - * match a certain filter. - */ -export interface VariableMatch { - /** The name of the variable to inspect. */ - varName: string; - /** The value that the Variable must have in order to satisfy this VariableMatch */ - value: VariableValue | undefined; -} - -/** - * Request to await until a WorkflowEvent of a certain WorkflowEventDef on a certain WfRun - * is thrown. Relies upon native GRPC deadlines to configure timeouts. - */ -export interface AwaitWorkflowEventRequest { - /** The ID of the WfRun which must throw the WorkflowEvent. */ - wfRunId: - | WfRunId - | undefined; - /** - * The IDs of the WorkflowEventDef that must be thrown. The request will return the first matching - * WorkflowEvent is thrown. If event_def_ids is empty, then the request will return the first - * WorkflowEvent thrown by the WfRun. - */ - eventDefIds: WorkflowEventDefId[]; - /** - * Since a single WfRun may throw multiple WorkflowEvent's with the same WorkflowEventDefId, it - * is necessary to provide a client the ability to "ignore" WorkflowEvent's that have already been - * 'awaited'. Any WorkflowEvent specified by this field is ignored by the rpc. - */ - workflowEventsToIgnore: WorkflowEventId[]; -} - -/** A request used to retrieve a list of WfRunId's by certain criteria. */ -export interface SearchWfRunRequest { - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: - | number - | undefined; - /** The WfSpec whose WfRun's we are searching for. This is required. */ - wfSpecName: string; - /** Specifies to return only WfRun's from this WfSpec Major Version. */ - wfSpecMajorVersion?: - | number - | undefined; - /** - * Specifies to return only WfRun's from this WfSpec Revision. Can only be set if - * wf_spec_major_version is also set. - */ - wfSpecRevision?: - | number - | undefined; - /** Specifies to return only WfRun's matching this status. */ - status?: - | LHStatus - | undefined; - /** Specifies to return only WfRun's that started after this time */ - earliestStart?: - | string - | undefined; - /** Specifies to return only WfRun's that started before this time */ - latestStart?: - | string - | undefined; - /** - * Allows filtering WfRun's based on the value of the Variables. This ONLY - * works for the Variables in the entrypiont threadrun (that is, variables - * where the threadRunNumber == 0). - */ - variableFilters: VariableMatch[]; -} - -/** List of WfRun Id's */ -export interface WfRunIdList { - /** The resulting object id's. */ - results: WfRunId[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** Searches for TaskRuns by various criteria. */ -export interface SearchTaskRunRequest { - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: - | number - | undefined; - /** Specifies the TaskDef of TaskRun's to return. This is required. */ - taskDefName: string; - /** Specifies to only return TaskRun's matching this status. */ - status?: - | TaskStatus - | undefined; - /** Specifies to only return TaskRun's that were scheduled after this time. */ - earliestStart?: - | string - | undefined; - /** Specifies to only return TaskRun's that were scheduled before this time. */ - latestStart?: string | undefined; -} - -/** List of TaskRun ID's. */ -export interface TaskRunIdList { - /** The resulting object id's. */ - results: TaskRunId[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** Search for NodeRun's by certain criteria. */ -export interface SearchNodeRunRequest { - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: - | number - | undefined; - /** Only return NodeRun's created after this time. */ - earliestStart?: - | string - | undefined; - /** Only return NodeRun's created before this time. */ - latestStart?: - | string - | undefined; - /** Specifies the type of NodeRun to search for. */ - nodeType: SearchNodeRunRequest_NodeType; - /** Specifies the status of NodeRun to search for. */ - status: LHStatus; -} - -/** This enum denotes the type of a NodeRun. */ -export enum SearchNodeRunRequest_NodeType { - /** TASK - TASK node schedules a TaskRun */ - TASK = "TASK", - /** EXTERNAL_EVENT - EXTERNAL_EVENT blocks the ThreadRun until a specified ExternalEvent arrives */ - EXTERNAL_EVENT = "EXTERNAL_EVENT", - /** ENTRYPOINT - ENTRYPOINT kicks off a ThreadRun */ - ENTRYPOINT = "ENTRYPOINT", - /** EXIT - EXIT completes a ThreadRun */ - EXIT = "EXIT", - /** START_THREAD - START_THREAD creates a Child ThreadRun */ - START_THREAD = "START_THREAD", - /** WAIT_THREADS - WAIT_THREADS waits for one or more child ThreadRuns to complete */ - WAIT_THREADS = "WAIT_THREADS", - /** SLEEP - SLEEP makes the ThreadRun sleep for a specified time */ - SLEEP = "SLEEP", - /** USER_TASK - USER_TASK creates a UserTaskRun and blocks until the UserTaskRun is completed. */ - USER_TASK = "USER_TASK", - /** START_MULTIPLE_THREADS - START_MULTIPLE_THREADS iterates over a list and starts a Child Thread for each item */ - START_MULTIPLE_THREADS = "START_MULTIPLE_THREADS", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function searchNodeRunRequest_NodeTypeFromJSON(object: any): SearchNodeRunRequest_NodeType { - switch (object) { - case 0: - case "TASK": - return SearchNodeRunRequest_NodeType.TASK; - case 1: - case "EXTERNAL_EVENT": - return SearchNodeRunRequest_NodeType.EXTERNAL_EVENT; - case 2: - case "ENTRYPOINT": - return SearchNodeRunRequest_NodeType.ENTRYPOINT; - case 3: - case "EXIT": - return SearchNodeRunRequest_NodeType.EXIT; - case 4: - case "START_THREAD": - return SearchNodeRunRequest_NodeType.START_THREAD; - case 5: - case "WAIT_THREADS": - return SearchNodeRunRequest_NodeType.WAIT_THREADS; - case 6: - case "SLEEP": - return SearchNodeRunRequest_NodeType.SLEEP; - case 7: - case "USER_TASK": - return SearchNodeRunRequest_NodeType.USER_TASK; - case 8: - case "START_MULTIPLE_THREADS": - return SearchNodeRunRequest_NodeType.START_MULTIPLE_THREADS; - case -1: - case "UNRECOGNIZED": - default: - return SearchNodeRunRequest_NodeType.UNRECOGNIZED; - } -} - -export function searchNodeRunRequest_NodeTypeToJSON(object: SearchNodeRunRequest_NodeType): string { - switch (object) { - case SearchNodeRunRequest_NodeType.TASK: - return "TASK"; - case SearchNodeRunRequest_NodeType.EXTERNAL_EVENT: - return "EXTERNAL_EVENT"; - case SearchNodeRunRequest_NodeType.ENTRYPOINT: - return "ENTRYPOINT"; - case SearchNodeRunRequest_NodeType.EXIT: - return "EXIT"; - case SearchNodeRunRequest_NodeType.START_THREAD: - return "START_THREAD"; - case SearchNodeRunRequest_NodeType.WAIT_THREADS: - return "WAIT_THREADS"; - case SearchNodeRunRequest_NodeType.SLEEP: - return "SLEEP"; - case SearchNodeRunRequest_NodeType.USER_TASK: - return "USER_TASK"; - case SearchNodeRunRequest_NodeType.START_MULTIPLE_THREADS: - return "START_MULTIPLE_THREADS"; - case SearchNodeRunRequest_NodeType.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function searchNodeRunRequest_NodeTypeToNumber(object: SearchNodeRunRequest_NodeType): number { - switch (object) { - case SearchNodeRunRequest_NodeType.TASK: - return 0; - case SearchNodeRunRequest_NodeType.EXTERNAL_EVENT: - return 1; - case SearchNodeRunRequest_NodeType.ENTRYPOINT: - return 2; - case SearchNodeRunRequest_NodeType.EXIT: - return 3; - case SearchNodeRunRequest_NodeType.START_THREAD: - return 4; - case SearchNodeRunRequest_NodeType.WAIT_THREADS: - return 5; - case SearchNodeRunRequest_NodeType.SLEEP: - return 6; - case SearchNodeRunRequest_NodeType.USER_TASK: - return 7; - case SearchNodeRunRequest_NodeType.START_MULTIPLE_THREADS: - return 8; - case SearchNodeRunRequest_NodeType.UNRECOGNIZED: - default: - return -1; - } -} - -/** List of NodeRun Id's. */ -export interface NodeRunIdList { - /** The resulting object id's. */ - results: NodeRunId[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** - * Search for UserTaskRun's matching certain criteria. The attributes are additive, - * you may specify any combination of fields in this request. Only UserTaskRun's - * matching all criteria will be returned. - */ -export interface SearchUserTaskRunRequest { - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: - | number - | undefined; - /** Status of UserTaskRun's to return. */ - status?: - | UserTaskRunStatus - | undefined; - /** UserTaskDef name to search for. */ - userTaskDefName?: - | string - | undefined; - /** Search for UserTaskRun's assigned to this user id. */ - userId?: - | string - | undefined; - /** Search for UserTaskRun's assigned to this user group. */ - userGroup?: - | string - | undefined; - /** Search for UserTaskRun's that were created after this time. */ - earliestStart?: - | string - | undefined; - /** Search for UserTaskRun's that were created before this time. */ - latestStart?: string | undefined; -} - -/** A list of UserTaskRun Id's */ -export interface UserTaskRunIdList { - /** The resulting object id's. */ - results: UserTaskRunId[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** - * Search for Variables by their value. This request is also highly useful to search for - * WfRun's based on the value of Variable's that are not in the Entrypoint ThreadRun, - * and also when you are using LittleHorse as a data store and need to perform a search. - * - * You may only search for a Variable that has an index specified on it. This may be done - * via th `.searchable()` method on our SDK's. - * - * Note that we do not yet support searching JSON_OBJ or JSON_ARR fields, but you may - * still mark those fields as searchable. We will soon add the ability to query those - * fields via the indices. - */ -export interface SearchVariableRequest { - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: - | number - | undefined; - /** Specifies the value that the variable must be. Exact match is required. */ - value: - | VariableValue - | undefined; - /** Specifies major version of the WfSpec for the associated WfRun. */ - wfSpecMajorVersion?: - | number - | undefined; - /** Specifies the revision of the WfSpec for the associated WfRun. */ - wfSpecRevision?: - | number - | undefined; - /** Specifies the name of the variable to search for. This is required. */ - varName: string; - /** Specifies the name of the WfSpec for the associated WfRun's. This is required. */ - wfSpecName: string; -} - -/** This is a list of Variable ID's. */ -export interface VariableIdList { - /** The resulting object id's. */ - results: VariableId[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** Search for TaskDef's based on certain criteria. */ -export interface SearchTaskDefRequest { - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: - | number - | undefined; - /** Optionally specify to only return TaskDef's with a specific prefix. */ - prefix?: string | undefined; -} - -/** List of TaskDef Id's. */ -export interface TaskDefIdList { - /** The resulting object id's. */ - results: TaskDefId[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** Search for UserTaskDef's. */ -export interface SearchUserTaskDefRequest { - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: - | number - | undefined; - /** Return all UserTaskDef's with a specific prefix. */ - prefix?: - | string - | undefined; - /** Return all UserTaskDef's with a specific name. */ - name?: string | undefined; -} - -/** List of UserTaskDef Id's. */ -export interface UserTaskDefIdList { - /** The resulting object id's. */ - results: UserTaskDefId[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** Search for WfSpec's. */ -export interface SearchWfSpecRequest { - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: - | number - | undefined; - /** Return WfSpec's with a specific name. */ - name?: - | string - | undefined; - /** Return WfSpec's with a specific prefix. */ - prefix?: - | string - | undefined; - /** Return all WfSpec's that make use of a given TaskDef. */ - taskDefName?: string | undefined; -} - -/** List of WfSpec Id's. */ -export interface WfSpecIdList { - /** The resulting object id's. */ - results: WfSpecId[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** Search for ExternalEventDef's. */ -export interface SearchExternalEventDefRequest { - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: - | number - | undefined; - /** Optionally search only for ExternalEventDef's whose name starts with this prefix. */ - prefix?: string | undefined; -} - -/** List of ExternalEventDef Id's. */ -export interface ExternalEventDefIdList { - /** The resulting object id's. */ - results: ExternalEventDefId[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** Search for all available TenantIds for current Principal */ -export interface SearchTenantRequest { - /** Maximum results to return in one request. */ - limit?: - | number - | undefined; - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: Uint8Array | undefined; -} - -export interface TenantIdList { - /** The resulting object id's. */ - results: TenantId[]; - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: Uint8Array | undefined; -} - -/** - * EVOLVING: Search for ExternalEvent's. - * - * Currently, this request allows you to search for ExternalEvent's based on either: - * 1. A WfRunId - * 2. An ExternalEventDefName and status. - * - * This specific RPC is under discussions for a Refactor and will soon experience breaking changes. - * It is recommended for applications needing to search by WfRunId to instead use the - * `rpc ListExternalEvents` call, as we plan to remove the 'by WfRunId' option from this request. - * - * Specifically, we plan to remove the "by wfRunId" option (which is redundant with the ListExternalEvents - * request), and "flatten" the "ByExtEvtDefNameAndStatusRequest" fields into the main message. - */ -export interface SearchExternalEventRequest { - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: number | undefined; - wfRunId?: WfRunId | undefined; - externalEventDefNameAndStatus?: SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest | undefined; -} - -/** - * EVOLVING: message encapsulating criteria to search for ExternalEvent's by their status - * and ExternalEventDefName. - */ -export interface SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest { - externalEventDefName: string; - isClaimed?: boolean | undefined; -} - -/** List of ExternalEvent Id's */ -export interface ExternalEventIdList { - /** The resulting object id's. */ - results: ExternalEventId[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** - * List all NodeRun's for a given WfRun. Note that List requests return actual NodeRun Objects, - * not NodeRunId's. - */ -export interface ListNodeRunsRequest { - /** The WfRun for whom we list NodeRun's. */ - wfRunId: - | WfRunId - | undefined; - /** Optionally specify the thread run number to filter NodeRun's by. */ - threadRunNumber?: - | number - | undefined; - /** Bookmark for cursor-based pagination; pass if applicable. */ - bookmark?: - | Uint8Array - | undefined; - /** Maximum results to return in one request. */ - limit?: number | undefined; -} - -/** A list of NodeRun Objects. */ -export interface NodeRunList { - /** A list of NodeRun Objects. */ - results: NodeRun[]; - /** - * The bookmark can be used for cursor-based pagination. If it is null, the server - * has returned all results. If it is set, you can pass it into your next request - * to resume searching where your previous request left off. - */ - bookmark?: Uint8Array | undefined; -} - -/** - * List all Variables for a specific WfRun. Note that List requests return actual Variable Objects, - * not VariableId's. - */ -export interface ListVariablesRequest { - /** The WfRun for whom we will list Variables. */ - wfRunId: WfRunId | undefined; -} - -/** A list of Variables. */ -export interface VariableList { - /** A list of Variable objects. */ - results: Variable[]; -} - -/** - * List all ExternalEvents for a specific WfRunId. Note that List Requests return actual - * ExternalEvent objects, not ExternalEventId's. - */ -export interface ListExternalEventsRequest { - /** The WfRunId for whom we list ExternalEvent's. */ - wfRunId: WfRunId | undefined; -} - -/** A list of ExternalEvents. */ -export interface ExternalEventList { - /** A list of ExternalEvent objects. */ - results: ExternalEvent[]; -} - -/** - * Message used by Task Worker to register itself to the server and ask for assignments of - * servers to poll. - * - * Used by the Task Worker SDK; generally, you shouldn't have to touch this manually. - */ -export interface RegisterTaskWorkerRequest { - /** Is the ID of the Task Worker. */ - taskWorkerId: string; - /** The TaskDef the worker wants to poll for. */ - taskDefId: - | TaskDefId - | undefined; - /** - * The listener that the worker is polling on. Used by the server to determine which - * advertised hosts to return. - */ - listenerName: string; -} - -/** - * Message used by Task Worker to register itself to the server and ask for assignments of - * servers to poll. - * - * Used by the Task Worker SDK; generally, you shouldn't have to touch this manually. - */ -export interface TaskWorkerHeartBeatRequest { - clientId: string; - taskDefId: TaskDefId | undefined; - listenerName: string; -} - -/** - * Response containing list of Servers that the Task Worker should connect to and start polling from. - * Only used internally by the Task Worker SDK. - */ -export interface RegisterTaskWorkerResponse { - /** The list of LH Server hosts that the Task Worker should start polling. */ - yourHosts: LHHostInfo[]; - /** Whether the LH Cluster is healthy. */ - isClusterHealthy?: boolean | undefined; -} - -/** Information about a specific LH Server to contact. */ -export interface LHHostInfo { - /** The host on the server */ - host: string; - /** The port for the specified listener. */ - port: number; -} - -/** - * Request sent by the Task Worker SDK to tell the Server that the Task Worker is ready - * to execute a TaskRun. Generally used only by the Task Worker SDK. - */ -export interface PollTaskRequest { - /** Is the TaskDefId that the Task Worker wants to execute. */ - taskDefId: - | TaskDefId - | undefined; - /** Is the ID of the Task Worker. */ - clientId: string; - /** - * Optionally specifies the version of the Task Worker, so that it can be recorded - * for debugging purposes on the TaskRun itself. - */ - taskWorkerVersion?: string | undefined; -} - -/** - * Message sent by server to Task Worker SDK specifying a specific TaskRun to be executed. - * This is used and handled internally by the Task Worker SDK. - */ -export interface ScheduledTask { - /** Id of the TaskRun to execute. */ - taskRunId: - | TaskRunId - | undefined; - /** ID of the TaskDef to which the TaskRun belongs. */ - taskDefId: - | TaskDefId - | undefined; - /** - * Attempt number of the TaskRun, zero indexed. attempt_number of `0` means this is the - * first attempt; `1` means this is the first retry, etc. - */ - attemptNumber: number; - /** Input variables for this TaskRun. */ - variables: VarNameAndVal[]; - createdAt: - | string - | undefined; - /** - * Source of the TaskRun. Currently, there are two options: - * 1. A TASK node - * 2. A reminder task scheduled by a trigger on a User Task. - */ - source: TaskRunSource | undefined; -} - -/** Response from the server for PollTaskRequest. */ -export interface PollTaskResponse { - /** If possible, a ScheduledTask is returned. */ - result?: ScheduledTask | undefined; -} - -/** Request used by the Task Worker SDK to report the result of a TaskRun execution. */ -export interface ReportTaskRun { - /** ID of the TaskRun */ - taskRunId: - | TaskRunId - | undefined; - /** When the TaskRun was executed */ - time: - | string - | undefined; - /** Status of the TaskRun */ - status: TaskStatus; - /** Optional information for logging or exceptions */ - logOutput?: - | VariableValue - | undefined; - /** Attempt number of the TaskRun */ - attemptNumber: number; - /** Successfully completed task */ - output?: - | VariableValue - | undefined; - /** Technical error */ - error?: - | LHTaskError - | undefined; - /** Business exception */ - exception?: LHTaskException | undefined; -} - -/** Message to HALT a WfRun. */ -export interface StopWfRunRequest { - /** Is the WfRunId */ - wfRunId: - | WfRunId - | undefined; - /** - * The number of the ThreadRun to halt. Note that halting the entrypoint ThreadRun (which - * always has number `0`) causes the whole WfRun to halt. If you do not manually set - * the thread_run_number field, it defaults to zero, so stopping the entire WfRun is the - * default behavior. - */ - threadRunNumber: number; -} - -/** Resume a WfRun. */ -export interface ResumeWfRunRequest { - /** Is the WfRunId */ - wfRunId: - | WfRunId - | undefined; - /** - * The number of the ThreadRun to resume. Note that resuming the entrypoint ThreadRun (which - * always has number `0`) causes the whole WfRun to resume. If you do not manually set - * the thread_run_number field, it defaults to zero, so resuming the entire WfRun is the - * default behavior. - */ - threadRunNumber: number; -} - -/** Query to retrieve a specific TaskDef Metrics Window. */ -export interface TaskDefMetricsQueryRequest { - /** - * Return the window *containing* this timestamp. The window start is not guaranteed to - * align perfectly with the request. - */ - windowStart: - | string - | undefined; - /** The window size */ - windowType: MetricsWindowLength; - /** The name of the specific TaskDef for which we are calculating metrics. */ - taskDefName?: string | undefined; -} - -/** Query to retrieve TaskDef Metrics over a period of time. */ -export interface ListTaskMetricsRequest { - /** TaskDef id for whichwe retrieve metrics. */ - taskDefId: - | TaskDefId - | undefined; - /** - * This parameter is a timestamp that is used to determine the *last* window returned. The - * server will then return `num_windows` worth of data from before this timestamp. - */ - lastWindowStart: - | string - | undefined; - /** Window size */ - windowLength: MetricsWindowLength; - /** Number of windows to retrieve. */ - numWindows: number; -} - -/** A list of TaskDef Metrics WIndows */ -export interface ListTaskMetricsResponse { - /** List of TaskDef Metrics Windows */ - results: TaskDefMetrics[]; -} - -/** Query to retrieve a specific WfSpec Metrics Window. */ -export interface WfSpecMetricsQueryRequest { - /** WfSpecId of metrics to get. */ - wfSpecId: - | WfSpecId - | undefined; - /** - * Return the window *containing* this timestamp. The window start is not guaranteed to - * align perfectly with the request. - */ - windowStart: - | string - | undefined; - /** The window size */ - windowLength: MetricsWindowLength; -} - -/** Query to retrieve WfSpec Metrics over a period of time. */ -export interface ListWfMetricsRequest { - /** WfSpecId of metrics to get. */ - wfSpecId: - | WfSpecId - | undefined; - /** - * This parameter is a timestamp that is used to determine the *last* window returned. The - * server will then return `num_windows` worth of data from before this timestamp. - */ - lastWindowStart: - | string - | undefined; - /** The window size */ - windowLength: MetricsWindowLength; - /** Number of windows to retrieve */ - numWindows: number; -} - -/** A list of WfSpec Metrics Windows */ -export interface ListWfMetricsResponse { - /** List of WfSpec Metrics Windows */ - results: WfSpecMetrics[]; -} - -/** Metrics for a TaskDef in a certain time period. */ -export interface TaskDefMetrics { - /** TaskDef that the metrics apply to. */ - taskDefId: - | TaskDefId - | undefined; - /** When the window started. */ - windowStart: - | string - | undefined; - /** Length of the window. */ - type: MetricsWindowLength; - /** Longest time that a TaskRun was in the TASK_SCHEDULED state */ - scheduleToStartMax: number; - /** Average time that a TaskRun was in the TASK_SCHEDULED state */ - scheduleToStartAvg: number; - /** Longest time between a TaskRun being started and completed */ - startToCompleteMax: number; - /** Average time between a TaskRun being started and completed */ - startToCompleteAvg: number; - /** Total number of TaskRun's that reached the TASK_SUCCESS state */ - totalCompleted: number; - /** Total number of TaskRun's that reached the TASK_ERROR state */ - totalErrored: number; - /** Total number of TaskRun's that transitioned to the TASK_RUNNING state */ - totalStarted: number; - /** Total number of TaskRun's that were scheduled */ - totalScheduled: number; -} - -/** Metrics for a WfSpec in a specific time window */ -export interface WfSpecMetrics { - /** The WfSpecId that these metrics analyze */ - wfSpecId: - | WfSpecId - | undefined; - /** The time that the window started */ - windowStart: - | string - | undefined; - /** The length of the window */ - type: MetricsWindowLength; - /** Total number of WfRun's created for this WfSpec */ - totalStarted: number; - /** Total number of WfRun's that reached the COMPLETED state */ - totalCompleted: number; - /** Total number of WfRun's that reached the ERROR state */ - totalErrored: number; - /** Longest time between a WfRun being started and reaching the COMPLETED state */ - startToCompleteMax: number; - /** Average time that a WfRun took to reach the COMPLETED state */ - startToCompleteAvg: number; -} - -/** List UserTaskRun's for a specific WfRun */ -export interface ListUserTaskRunRequest { - /** The WfRun for which to list UserTaskRuns */ - wfRunId: WfRunId | undefined; -} - -/** List of UserTaskRuns */ -export interface UserTaskRunList { - /** A list of UserTaskRun Objects */ - results: UserTaskRun[]; -} - -/** List TaskRun's for a specific WfRun */ -export interface ListTaskRunsRequest { - /** The WfRun for which to list TaskRun's */ - wfRunId: WfRunId | undefined; -} - -/** A list of TaskRun's */ -export interface TaskRunList { - /** A list of TaskRun Objects */ - results: TaskRun[]; -} - -/** EXPERIMENTAL: migrate live WfRun's from one version of a WfSpec to another. */ -export interface MigrateWfSpecRequest { - oldWfSpec: WfSpecId | undefined; - migration: WfSpecVersionMigration | undefined; -} - -/** Get the latest WfSpec with a given name and optionally majorVersion */ -export interface GetLatestWfSpecRequest { - /** The name of the WfSpec to get. This is required. */ - name: string; - /** - * Optionally get only WfSpec's that have the same major version. This can be useful - * if you want to guarantee that there have been no breaking changes to the API of the - * WfSpec, for example, to ensure that there have been no changes to searchable variables - * or required input variables. - */ - majorVersion?: number | undefined; -} - -/** The version of the LH Server according to Semantic Versioning */ -export interface ServerVersionResponse { - /** Server Major Version */ - majorVersion: number; - /** Server Minor Version */ - minorVersion: number; - /** Server Patch Version */ - patchVersion: number; - /** - * Prerelease Identifier. If this is set, then the server is NOT a production release - * but rather a release candidate or experimental pre-release. - */ - preReleaseIdentifier?: string | undefined; -} - -function createBaseGetLatestUserTaskDefRequest(): GetLatestUserTaskDefRequest { - return { name: "" }; -} - -export const GetLatestUserTaskDefRequest = { - encode(message: GetLatestUserTaskDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): GetLatestUserTaskDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGetLatestUserTaskDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): GetLatestUserTaskDefRequest { - return { name: isSet(object.name) ? globalThis.String(object.name) : "" }; - }, - - toJSON(message: GetLatestUserTaskDefRequest): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - return obj; - }, - - create, I>>(base?: I): GetLatestUserTaskDefRequest { - return GetLatestUserTaskDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): GetLatestUserTaskDefRequest { - const message = createBaseGetLatestUserTaskDefRequest(); - message.name = object.name ?? ""; - return message; - }, -}; - -function createBasePutWfSpecRequest(): PutWfSpecRequest { - return { - name: "", - threadSpecs: {}, - entrypointThreadName: "", - retentionPolicy: undefined, - parentWfSpec: undefined, - allowedUpdates: AllowedUpdateType.ALL_UPDATES, - }; -} - -export const PutWfSpecRequest = { - encode(message: PutWfSpecRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - Object.entries(message.threadSpecs).forEach(([key, value]) => { - PutWfSpecRequest_ThreadSpecsEntry.encode({ key: key as any, value }, writer.uint32(42).fork()).ldelim(); - }); - if (message.entrypointThreadName !== "") { - writer.uint32(50).string(message.entrypointThreadName); - } - if (message.retentionPolicy !== undefined) { - WorkflowRetentionPolicy.encode(message.retentionPolicy, writer.uint32(66).fork()).ldelim(); - } - if (message.parentWfSpec !== undefined) { - WfSpec_ParentWfSpecReference.encode(message.parentWfSpec, writer.uint32(74).fork()).ldelim(); - } - if (message.allowedUpdates !== AllowedUpdateType.ALL_UPDATES) { - writer.uint32(80).int32(allowedUpdateTypeToNumber(message.allowedUpdates)); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PutWfSpecRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePutWfSpecRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 5: - if (tag !== 42) { - break; - } - - const entry5 = PutWfSpecRequest_ThreadSpecsEntry.decode(reader, reader.uint32()); - if (entry5.value !== undefined) { - message.threadSpecs[entry5.key] = entry5.value; - } - continue; - case 6: - if (tag !== 50) { - break; - } - - message.entrypointThreadName = reader.string(); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.retentionPolicy = WorkflowRetentionPolicy.decode(reader, reader.uint32()); - continue; - case 9: - if (tag !== 74) { - break; - } - - message.parentWfSpec = WfSpec_ParentWfSpecReference.decode(reader, reader.uint32()); - continue; - case 10: - if (tag !== 80) { - break; - } - - message.allowedUpdates = allowedUpdateTypeFromJSON(reader.int32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PutWfSpecRequest { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - threadSpecs: isObject(object.threadSpecs) - ? Object.entries(object.threadSpecs).reduce<{ [key: string]: ThreadSpec }>((acc, [key, value]) => { - acc[key] = ThreadSpec.fromJSON(value); - return acc; - }, {}) - : {}, - entrypointThreadName: isSet(object.entrypointThreadName) ? globalThis.String(object.entrypointThreadName) : "", - retentionPolicy: isSet(object.retentionPolicy) - ? WorkflowRetentionPolicy.fromJSON(object.retentionPolicy) - : undefined, - parentWfSpec: isSet(object.parentWfSpec) ? WfSpec_ParentWfSpecReference.fromJSON(object.parentWfSpec) : undefined, - allowedUpdates: isSet(object.allowedUpdates) - ? allowedUpdateTypeFromJSON(object.allowedUpdates) - : AllowedUpdateType.ALL_UPDATES, - }; - }, - - toJSON(message: PutWfSpecRequest): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.threadSpecs) { - const entries = Object.entries(message.threadSpecs); - if (entries.length > 0) { - obj.threadSpecs = {}; - entries.forEach(([k, v]) => { - obj.threadSpecs[k] = ThreadSpec.toJSON(v); - }); - } - } - if (message.entrypointThreadName !== "") { - obj.entrypointThreadName = message.entrypointThreadName; - } - if (message.retentionPolicy !== undefined) { - obj.retentionPolicy = WorkflowRetentionPolicy.toJSON(message.retentionPolicy); - } - if (message.parentWfSpec !== undefined) { - obj.parentWfSpec = WfSpec_ParentWfSpecReference.toJSON(message.parentWfSpec); - } - if (message.allowedUpdates !== AllowedUpdateType.ALL_UPDATES) { - obj.allowedUpdates = allowedUpdateTypeToJSON(message.allowedUpdates); - } - return obj; - }, - - create, I>>(base?: I): PutWfSpecRequest { - return PutWfSpecRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PutWfSpecRequest { - const message = createBasePutWfSpecRequest(); - message.name = object.name ?? ""; - message.threadSpecs = Object.entries(object.threadSpecs ?? {}).reduce<{ [key: string]: ThreadSpec }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = ThreadSpec.fromPartial(value); - } - return acc; - }, - {}, - ); - message.entrypointThreadName = object.entrypointThreadName ?? ""; - message.retentionPolicy = (object.retentionPolicy !== undefined && object.retentionPolicy !== null) - ? WorkflowRetentionPolicy.fromPartial(object.retentionPolicy) - : undefined; - message.parentWfSpec = (object.parentWfSpec !== undefined && object.parentWfSpec !== null) - ? WfSpec_ParentWfSpecReference.fromPartial(object.parentWfSpec) - : undefined; - message.allowedUpdates = object.allowedUpdates ?? AllowedUpdateType.ALL_UPDATES; - return message; - }, -}; - -function createBasePutWfSpecRequest_ThreadSpecsEntry(): PutWfSpecRequest_ThreadSpecsEntry { - return { key: "", value: undefined }; -} - -export const PutWfSpecRequest_ThreadSpecsEntry = { - encode(message: PutWfSpecRequest_ThreadSpecsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - ThreadSpec.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PutWfSpecRequest_ThreadSpecsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePutWfSpecRequest_ThreadSpecsEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = ThreadSpec.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PutWfSpecRequest_ThreadSpecsEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? ThreadSpec.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: PutWfSpecRequest_ThreadSpecsEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = ThreadSpec.toJSON(message.value); - } - return obj; - }, - - create, I>>( - base?: I, - ): PutWfSpecRequest_ThreadSpecsEntry { - return PutWfSpecRequest_ThreadSpecsEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): PutWfSpecRequest_ThreadSpecsEntry { - const message = createBasePutWfSpecRequest_ThreadSpecsEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? ThreadSpec.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBasePutTaskDefRequest(): PutTaskDefRequest { - return { name: "", inputVars: [] }; -} - -export const PutTaskDefRequest = { - encode(message: PutTaskDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - for (const v of message.inputVars) { - VariableDef.encode(v!, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PutTaskDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePutTaskDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.inputVars.push(VariableDef.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PutTaskDefRequest { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - inputVars: globalThis.Array.isArray(object?.inputVars) - ? object.inputVars.map((e: any) => VariableDef.fromJSON(e)) - : [], - }; - }, - - toJSON(message: PutTaskDefRequest): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.inputVars?.length) { - obj.inputVars = message.inputVars.map((e) => VariableDef.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): PutTaskDefRequest { - return PutTaskDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PutTaskDefRequest { - const message = createBasePutTaskDefRequest(); - message.name = object.name ?? ""; - message.inputVars = object.inputVars?.map((e) => VariableDef.fromPartial(e)) || []; - return message; - }, -}; - -function createBasePutWorkflowEventDefRequest(): PutWorkflowEventDefRequest { - return { name: "", type: VariableType.JSON_OBJ }; -} - -export const PutWorkflowEventDefRequest = { - encode(message: PutWorkflowEventDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - if (message.type !== VariableType.JSON_OBJ) { - writer.uint32(16).int32(variableTypeToNumber(message.type)); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PutWorkflowEventDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePutWorkflowEventDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.type = variableTypeFromJSON(reader.int32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PutWorkflowEventDefRequest { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - type: isSet(object.type) ? variableTypeFromJSON(object.type) : VariableType.JSON_OBJ, - }; - }, - - toJSON(message: PutWorkflowEventDefRequest): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.type !== VariableType.JSON_OBJ) { - obj.type = variableTypeToJSON(message.type); - } - return obj; - }, - - create, I>>(base?: I): PutWorkflowEventDefRequest { - return PutWorkflowEventDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PutWorkflowEventDefRequest { - const message = createBasePutWorkflowEventDefRequest(); - message.name = object.name ?? ""; - message.type = object.type ?? VariableType.JSON_OBJ; - return message; - }, -}; - -function createBasePutUserTaskDefRequest(): PutUserTaskDefRequest { - return { name: "", fields: [], description: undefined }; -} - -export const PutUserTaskDefRequest = { - encode(message: PutUserTaskDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - for (const v of message.fields) { - UserTaskField.encode(v!, writer.uint32(18).fork()).ldelim(); - } - if (message.description !== undefined) { - writer.uint32(26).string(message.description); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PutUserTaskDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePutUserTaskDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.fields.push(UserTaskField.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.description = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PutUserTaskDefRequest { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - fields: globalThis.Array.isArray(object?.fields) ? object.fields.map((e: any) => UserTaskField.fromJSON(e)) : [], - description: isSet(object.description) ? globalThis.String(object.description) : undefined, - }; - }, - - toJSON(message: PutUserTaskDefRequest): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.fields?.length) { - obj.fields = message.fields.map((e) => UserTaskField.toJSON(e)); - } - if (message.description !== undefined) { - obj.description = message.description; - } - return obj; - }, - - create, I>>(base?: I): PutUserTaskDefRequest { - return PutUserTaskDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PutUserTaskDefRequest { - const message = createBasePutUserTaskDefRequest(); - message.name = object.name ?? ""; - message.fields = object.fields?.map((e) => UserTaskField.fromPartial(e)) || []; - message.description = object.description ?? undefined; - return message; - }, -}; - -function createBasePutExternalEventDefRequest(): PutExternalEventDefRequest { - return { name: "", retentionPolicy: undefined }; -} - -export const PutExternalEventDefRequest = { - encode(message: PutExternalEventDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - if (message.retentionPolicy !== undefined) { - ExternalEventRetentionPolicy.encode(message.retentionPolicy, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PutExternalEventDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePutExternalEventDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.retentionPolicy = ExternalEventRetentionPolicy.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PutExternalEventDefRequest { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - retentionPolicy: isSet(object.retentionPolicy) - ? ExternalEventRetentionPolicy.fromJSON(object.retentionPolicy) - : undefined, - }; - }, - - toJSON(message: PutExternalEventDefRequest): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.retentionPolicy !== undefined) { - obj.retentionPolicy = ExternalEventRetentionPolicy.toJSON(message.retentionPolicy); - } - return obj; - }, - - create, I>>(base?: I): PutExternalEventDefRequest { - return PutExternalEventDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PutExternalEventDefRequest { - const message = createBasePutExternalEventDefRequest(); - message.name = object.name ?? ""; - message.retentionPolicy = (object.retentionPolicy !== undefined && object.retentionPolicy !== null) - ? ExternalEventRetentionPolicy.fromPartial(object.retentionPolicy) - : undefined; - return message; - }, -}; - -function createBasePutExternalEventRequest(): PutExternalEventRequest { - return { - wfRunId: undefined, - externalEventDefId: undefined, - guid: undefined, - content: undefined, - threadRunNumber: undefined, - nodeRunPosition: undefined, - }; -} - -export const PutExternalEventRequest = { - encode(message: PutExternalEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.externalEventDefId !== undefined) { - ExternalEventDefId.encode(message.externalEventDefId, writer.uint32(18).fork()).ldelim(); - } - if (message.guid !== undefined) { - writer.uint32(26).string(message.guid); - } - if (message.content !== undefined) { - VariableValue.encode(message.content, writer.uint32(42).fork()).ldelim(); - } - if (message.threadRunNumber !== undefined) { - writer.uint32(48).int32(message.threadRunNumber); - } - if (message.nodeRunPosition !== undefined) { - writer.uint32(56).int32(message.nodeRunPosition); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PutExternalEventRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePutExternalEventRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.externalEventDefId = ExternalEventDefId.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.guid = reader.string(); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.content = VariableValue.decode(reader, reader.uint32()); - continue; - case 6: - if (tag !== 48) { - break; - } - - message.threadRunNumber = reader.int32(); - continue; - case 7: - if (tag !== 56) { - break; - } - - message.nodeRunPosition = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PutExternalEventRequest { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - externalEventDefId: isSet(object.externalEventDefId) - ? ExternalEventDefId.fromJSON(object.externalEventDefId) - : undefined, - guid: isSet(object.guid) ? globalThis.String(object.guid) : undefined, - content: isSet(object.content) ? VariableValue.fromJSON(object.content) : undefined, - threadRunNumber: isSet(object.threadRunNumber) ? globalThis.Number(object.threadRunNumber) : undefined, - nodeRunPosition: isSet(object.nodeRunPosition) ? globalThis.Number(object.nodeRunPosition) : undefined, - }; - }, - - toJSON(message: PutExternalEventRequest): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.externalEventDefId !== undefined) { - obj.externalEventDefId = ExternalEventDefId.toJSON(message.externalEventDefId); - } - if (message.guid !== undefined) { - obj.guid = message.guid; - } - if (message.content !== undefined) { - obj.content = VariableValue.toJSON(message.content); - } - if (message.threadRunNumber !== undefined) { - obj.threadRunNumber = Math.round(message.threadRunNumber); - } - if (message.nodeRunPosition !== undefined) { - obj.nodeRunPosition = Math.round(message.nodeRunPosition); - } - return obj; - }, - - create, I>>(base?: I): PutExternalEventRequest { - return PutExternalEventRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PutExternalEventRequest { - const message = createBasePutExternalEventRequest(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.externalEventDefId = (object.externalEventDefId !== undefined && object.externalEventDefId !== null) - ? ExternalEventDefId.fromPartial(object.externalEventDefId) - : undefined; - message.guid = object.guid ?? undefined; - message.content = (object.content !== undefined && object.content !== null) - ? VariableValue.fromPartial(object.content) - : undefined; - message.threadRunNumber = object.threadRunNumber ?? undefined; - message.nodeRunPosition = object.nodeRunPosition ?? undefined; - return message; - }, -}; - -function createBaseDeleteExternalEventRequest(): DeleteExternalEventRequest { - return { id: undefined }; -} - -export const DeleteExternalEventRequest = { - encode(message: DeleteExternalEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - ExternalEventId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): DeleteExternalEventRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDeleteExternalEventRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = ExternalEventId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): DeleteExternalEventRequest { - return { id: isSet(object.id) ? ExternalEventId.fromJSON(object.id) : undefined }; - }, - - toJSON(message: DeleteExternalEventRequest): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = ExternalEventId.toJSON(message.id); - } - return obj; - }, - - create, I>>(base?: I): DeleteExternalEventRequest { - return DeleteExternalEventRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): DeleteExternalEventRequest { - const message = createBaseDeleteExternalEventRequest(); - message.id = (object.id !== undefined && object.id !== null) ? ExternalEventId.fromPartial(object.id) : undefined; - return message; - }, -}; - -function createBaseDeleteWfRunRequest(): DeleteWfRunRequest { - return { id: undefined }; -} - -export const DeleteWfRunRequest = { - encode(message: DeleteWfRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - WfRunId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): DeleteWfRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDeleteWfRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = WfRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): DeleteWfRunRequest { - return { id: isSet(object.id) ? WfRunId.fromJSON(object.id) : undefined }; - }, - - toJSON(message: DeleteWfRunRequest): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = WfRunId.toJSON(message.id); - } - return obj; - }, - - create, I>>(base?: I): DeleteWfRunRequest { - return DeleteWfRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): DeleteWfRunRequest { - const message = createBaseDeleteWfRunRequest(); - message.id = (object.id !== undefined && object.id !== null) ? WfRunId.fromPartial(object.id) : undefined; - return message; - }, -}; - -function createBaseDeleteTaskDefRequest(): DeleteTaskDefRequest { - return { id: undefined }; -} - -export const DeleteTaskDefRequest = { - encode(message: DeleteTaskDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - TaskDefId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): DeleteTaskDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDeleteTaskDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = TaskDefId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): DeleteTaskDefRequest { - return { id: isSet(object.id) ? TaskDefId.fromJSON(object.id) : undefined }; - }, - - toJSON(message: DeleteTaskDefRequest): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = TaskDefId.toJSON(message.id); - } - return obj; - }, - - create, I>>(base?: I): DeleteTaskDefRequest { - return DeleteTaskDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): DeleteTaskDefRequest { - const message = createBaseDeleteTaskDefRequest(); - message.id = (object.id !== undefined && object.id !== null) ? TaskDefId.fromPartial(object.id) : undefined; - return message; - }, -}; - -function createBaseDeleteUserTaskDefRequest(): DeleteUserTaskDefRequest { - return { id: undefined }; -} - -export const DeleteUserTaskDefRequest = { - encode(message: DeleteUserTaskDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - UserTaskDefId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): DeleteUserTaskDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDeleteUserTaskDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = UserTaskDefId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): DeleteUserTaskDefRequest { - return { id: isSet(object.id) ? UserTaskDefId.fromJSON(object.id) : undefined }; - }, - - toJSON(message: DeleteUserTaskDefRequest): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = UserTaskDefId.toJSON(message.id); - } - return obj; - }, - - create, I>>(base?: I): DeleteUserTaskDefRequest { - return DeleteUserTaskDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): DeleteUserTaskDefRequest { - const message = createBaseDeleteUserTaskDefRequest(); - message.id = (object.id !== undefined && object.id !== null) ? UserTaskDefId.fromPartial(object.id) : undefined; - return message; - }, -}; - -function createBaseDeleteWfSpecRequest(): DeleteWfSpecRequest { - return { id: undefined }; -} - -export const DeleteWfSpecRequest = { - encode(message: DeleteWfSpecRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - WfSpecId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): DeleteWfSpecRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDeleteWfSpecRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = WfSpecId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): DeleteWfSpecRequest { - return { id: isSet(object.id) ? WfSpecId.fromJSON(object.id) : undefined }; - }, - - toJSON(message: DeleteWfSpecRequest): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = WfSpecId.toJSON(message.id); - } - return obj; - }, - - create, I>>(base?: I): DeleteWfSpecRequest { - return DeleteWfSpecRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): DeleteWfSpecRequest { - const message = createBaseDeleteWfSpecRequest(); - message.id = (object.id !== undefined && object.id !== null) ? WfSpecId.fromPartial(object.id) : undefined; - return message; - }, -}; - -function createBaseDeleteExternalEventDefRequest(): DeleteExternalEventDefRequest { - return { id: undefined }; -} - -export const DeleteExternalEventDefRequest = { - encode(message: DeleteExternalEventDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - ExternalEventDefId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): DeleteExternalEventDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDeleteExternalEventDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = ExternalEventDefId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): DeleteExternalEventDefRequest { - return { id: isSet(object.id) ? ExternalEventDefId.fromJSON(object.id) : undefined }; - }, - - toJSON(message: DeleteExternalEventDefRequest): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = ExternalEventDefId.toJSON(message.id); - } - return obj; - }, - - create, I>>(base?: I): DeleteExternalEventDefRequest { - return DeleteExternalEventDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): DeleteExternalEventDefRequest { - const message = createBaseDeleteExternalEventDefRequest(); - message.id = (object.id !== undefined && object.id !== null) - ? ExternalEventDefId.fromPartial(object.id) - : undefined; - return message; - }, -}; - -function createBaseRunWfRequest(): RunWfRequest { - return { - wfSpecName: "", - majorVersion: undefined, - revision: undefined, - variables: {}, - id: undefined, - parentWfRunId: undefined, - }; -} - -export const RunWfRequest = { - encode(message: RunWfRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfSpecName !== "") { - writer.uint32(10).string(message.wfSpecName); - } - if (message.majorVersion !== undefined) { - writer.uint32(16).int32(message.majorVersion); - } - if (message.revision !== undefined) { - writer.uint32(24).int32(message.revision); - } - Object.entries(message.variables).forEach(([key, value]) => { - RunWfRequest_VariablesEntry.encode({ key: key as any, value }, writer.uint32(34).fork()).ldelim(); - }); - if (message.id !== undefined) { - writer.uint32(42).string(message.id); - } - if (message.parentWfRunId !== undefined) { - WfRunId.encode(message.parentWfRunId, writer.uint32(50).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): RunWfRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseRunWfRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfSpecName = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.majorVersion = reader.int32(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.revision = reader.int32(); - continue; - case 4: - if (tag !== 34) { - break; - } - - const entry4 = RunWfRequest_VariablesEntry.decode(reader, reader.uint32()); - if (entry4.value !== undefined) { - message.variables[entry4.key] = entry4.value; - } - continue; - case 5: - if (tag !== 42) { - break; - } - - message.id = reader.string(); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.parentWfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): RunWfRequest { - return { - wfSpecName: isSet(object.wfSpecName) ? globalThis.String(object.wfSpecName) : "", - majorVersion: isSet(object.majorVersion) ? globalThis.Number(object.majorVersion) : undefined, - revision: isSet(object.revision) ? globalThis.Number(object.revision) : undefined, - variables: isObject(object.variables) - ? Object.entries(object.variables).reduce<{ [key: string]: VariableValue }>((acc, [key, value]) => { - acc[key] = VariableValue.fromJSON(value); - return acc; - }, {}) - : {}, - id: isSet(object.id) ? globalThis.String(object.id) : undefined, - parentWfRunId: isSet(object.parentWfRunId) ? WfRunId.fromJSON(object.parentWfRunId) : undefined, - }; - }, - - toJSON(message: RunWfRequest): unknown { - const obj: any = {}; - if (message.wfSpecName !== "") { - obj.wfSpecName = message.wfSpecName; - } - if (message.majorVersion !== undefined) { - obj.majorVersion = Math.round(message.majorVersion); - } - if (message.revision !== undefined) { - obj.revision = Math.round(message.revision); - } - if (message.variables) { - const entries = Object.entries(message.variables); - if (entries.length > 0) { - obj.variables = {}; - entries.forEach(([k, v]) => { - obj.variables[k] = VariableValue.toJSON(v); - }); - } - } - if (message.id !== undefined) { - obj.id = message.id; - } - if (message.parentWfRunId !== undefined) { - obj.parentWfRunId = WfRunId.toJSON(message.parentWfRunId); - } - return obj; - }, - - create, I>>(base?: I): RunWfRequest { - return RunWfRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): RunWfRequest { - const message = createBaseRunWfRequest(); - message.wfSpecName = object.wfSpecName ?? ""; - message.majorVersion = object.majorVersion ?? undefined; - message.revision = object.revision ?? undefined; - message.variables = Object.entries(object.variables ?? {}).reduce<{ [key: string]: VariableValue }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = VariableValue.fromPartial(value); - } - return acc; - }, - {}, - ); - message.id = object.id ?? undefined; - message.parentWfRunId = (object.parentWfRunId !== undefined && object.parentWfRunId !== null) - ? WfRunId.fromPartial(object.parentWfRunId) - : undefined; - return message; - }, -}; - -function createBaseRunWfRequest_VariablesEntry(): RunWfRequest_VariablesEntry { - return { key: "", value: undefined }; -} - -export const RunWfRequest_VariablesEntry = { - encode(message: RunWfRequest_VariablesEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - VariableValue.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): RunWfRequest_VariablesEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseRunWfRequest_VariablesEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = VariableValue.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): RunWfRequest_VariablesEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? VariableValue.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: RunWfRequest_VariablesEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = VariableValue.toJSON(message.value); - } - return obj; - }, - - create, I>>(base?: I): RunWfRequest_VariablesEntry { - return RunWfRequest_VariablesEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): RunWfRequest_VariablesEntry { - const message = createBaseRunWfRequest_VariablesEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? VariableValue.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseVariableMatch(): VariableMatch { - return { varName: "", value: undefined }; -} - -export const VariableMatch = { - encode(message: VariableMatch, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.varName !== "") { - writer.uint32(10).string(message.varName); - } - if (message.value !== undefined) { - VariableValue.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VariableMatch { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariableMatch(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.varName = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = VariableValue.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VariableMatch { - return { - varName: isSet(object.varName) ? globalThis.String(object.varName) : "", - value: isSet(object.value) ? VariableValue.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: VariableMatch): unknown { - const obj: any = {}; - if (message.varName !== "") { - obj.varName = message.varName; - } - if (message.value !== undefined) { - obj.value = VariableValue.toJSON(message.value); - } - return obj; - }, - - create, I>>(base?: I): VariableMatch { - return VariableMatch.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): VariableMatch { - const message = createBaseVariableMatch(); - message.varName = object.varName ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? VariableValue.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseAwaitWorkflowEventRequest(): AwaitWorkflowEventRequest { - return { wfRunId: undefined, eventDefIds: [], workflowEventsToIgnore: [] }; -} - -export const AwaitWorkflowEventRequest = { - encode(message: AwaitWorkflowEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - for (const v of message.eventDefIds) { - WorkflowEventDefId.encode(v!, writer.uint32(18).fork()).ldelim(); - } - for (const v of message.workflowEventsToIgnore) { - WorkflowEventId.encode(v!, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): AwaitWorkflowEventRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseAwaitWorkflowEventRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.eventDefIds.push(WorkflowEventDefId.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.workflowEventsToIgnore.push(WorkflowEventId.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): AwaitWorkflowEventRequest { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - eventDefIds: globalThis.Array.isArray(object?.eventDefIds) - ? object.eventDefIds.map((e: any) => WorkflowEventDefId.fromJSON(e)) - : [], - workflowEventsToIgnore: globalThis.Array.isArray(object?.workflowEventsToIgnore) - ? object.workflowEventsToIgnore.map((e: any) => WorkflowEventId.fromJSON(e)) - : [], - }; - }, - - toJSON(message: AwaitWorkflowEventRequest): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.eventDefIds?.length) { - obj.eventDefIds = message.eventDefIds.map((e) => WorkflowEventDefId.toJSON(e)); - } - if (message.workflowEventsToIgnore?.length) { - obj.workflowEventsToIgnore = message.workflowEventsToIgnore.map((e) => WorkflowEventId.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): AwaitWorkflowEventRequest { - return AwaitWorkflowEventRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): AwaitWorkflowEventRequest { - const message = createBaseAwaitWorkflowEventRequest(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.eventDefIds = object.eventDefIds?.map((e) => WorkflowEventDefId.fromPartial(e)) || []; - message.workflowEventsToIgnore = object.workflowEventsToIgnore?.map((e) => WorkflowEventId.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseSearchWfRunRequest(): SearchWfRunRequest { - return { - bookmark: undefined, - limit: undefined, - wfSpecName: "", - wfSpecMajorVersion: undefined, - wfSpecRevision: undefined, - status: undefined, - earliestStart: undefined, - latestStart: undefined, - variableFilters: [], - }; -} - -export const SearchWfRunRequest = { - encode(message: SearchWfRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.bookmark !== undefined) { - writer.uint32(10).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(16).int32(message.limit); - } - if (message.wfSpecName !== "") { - writer.uint32(26).string(message.wfSpecName); - } - if (message.wfSpecMajorVersion !== undefined) { - writer.uint32(32).int32(message.wfSpecMajorVersion); - } - if (message.wfSpecRevision !== undefined) { - writer.uint32(40).int32(message.wfSpecRevision); - } - if (message.status !== undefined) { - writer.uint32(48).int32(lHStatusToNumber(message.status)); - } - if (message.earliestStart !== undefined) { - Timestamp.encode(toTimestamp(message.earliestStart), writer.uint32(58).fork()).ldelim(); - } - if (message.latestStart !== undefined) { - Timestamp.encode(toTimestamp(message.latestStart), writer.uint32(66).fork()).ldelim(); - } - for (const v of message.variableFilters) { - VariableMatch.encode(v!, writer.uint32(74).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchWfRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchWfRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.limit = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.wfSpecName = reader.string(); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.wfSpecMajorVersion = reader.int32(); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.wfSpecRevision = reader.int32(); - continue; - case 6: - if (tag !== 48) { - break; - } - - message.status = lHStatusFromJSON(reader.int32()); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.earliestStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.latestStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 9: - if (tag !== 74) { - break; - } - - message.variableFilters.push(VariableMatch.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchWfRunRequest { - return { - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - wfSpecName: isSet(object.wfSpecName) ? globalThis.String(object.wfSpecName) : "", - wfSpecMajorVersion: isSet(object.wfSpecMajorVersion) ? globalThis.Number(object.wfSpecMajorVersion) : undefined, - wfSpecRevision: isSet(object.wfSpecRevision) ? globalThis.Number(object.wfSpecRevision) : undefined, - status: isSet(object.status) ? lHStatusFromJSON(object.status) : undefined, - earliestStart: isSet(object.earliestStart) ? globalThis.String(object.earliestStart) : undefined, - latestStart: isSet(object.latestStart) ? globalThis.String(object.latestStart) : undefined, - variableFilters: globalThis.Array.isArray(object?.variableFilters) - ? object.variableFilters.map((e: any) => VariableMatch.fromJSON(e)) - : [], - }; - }, - - toJSON(message: SearchWfRunRequest): unknown { - const obj: any = {}; - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.wfSpecName !== "") { - obj.wfSpecName = message.wfSpecName; - } - if (message.wfSpecMajorVersion !== undefined) { - obj.wfSpecMajorVersion = Math.round(message.wfSpecMajorVersion); - } - if (message.wfSpecRevision !== undefined) { - obj.wfSpecRevision = Math.round(message.wfSpecRevision); - } - if (message.status !== undefined) { - obj.status = lHStatusToJSON(message.status); - } - if (message.earliestStart !== undefined) { - obj.earliestStart = message.earliestStart; - } - if (message.latestStart !== undefined) { - obj.latestStart = message.latestStart; - } - if (message.variableFilters?.length) { - obj.variableFilters = message.variableFilters.map((e) => VariableMatch.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): SearchWfRunRequest { - return SearchWfRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchWfRunRequest { - const message = createBaseSearchWfRunRequest(); - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - message.wfSpecName = object.wfSpecName ?? ""; - message.wfSpecMajorVersion = object.wfSpecMajorVersion ?? undefined; - message.wfSpecRevision = object.wfSpecRevision ?? undefined; - message.status = object.status ?? undefined; - message.earliestStart = object.earliestStart ?? undefined; - message.latestStart = object.latestStart ?? undefined; - message.variableFilters = object.variableFilters?.map((e) => VariableMatch.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseWfRunIdList(): WfRunIdList { - return { results: [], bookmark: undefined }; -} - -export const WfRunIdList = { - encode(message: WfRunIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - WfRunId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfRunIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfRunIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(WfRunId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfRunIdList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => WfRunId.fromJSON(e)) : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: WfRunIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => WfRunId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): WfRunIdList { - return WfRunIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfRunIdList { - const message = createBaseWfRunIdList(); - message.results = object.results?.map((e) => WfRunId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseSearchTaskRunRequest(): SearchTaskRunRequest { - return { - bookmark: undefined, - limit: undefined, - taskDefName: "", - status: undefined, - earliestStart: undefined, - latestStart: undefined, - }; -} - -export const SearchTaskRunRequest = { - encode(message: SearchTaskRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.bookmark !== undefined) { - writer.uint32(10).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(16).int32(message.limit); - } - if (message.taskDefName !== "") { - writer.uint32(26).string(message.taskDefName); - } - if (message.status !== undefined) { - writer.uint32(32).int32(taskStatusToNumber(message.status)); - } - if (message.earliestStart !== undefined) { - Timestamp.encode(toTimestamp(message.earliestStart), writer.uint32(42).fork()).ldelim(); - } - if (message.latestStart !== undefined) { - Timestamp.encode(toTimestamp(message.latestStart), writer.uint32(50).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchTaskRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchTaskRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.limit = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.taskDefName = reader.string(); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.status = taskStatusFromJSON(reader.int32()); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.earliestStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.latestStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchTaskRunRequest { - return { - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - taskDefName: isSet(object.taskDefName) ? globalThis.String(object.taskDefName) : "", - status: isSet(object.status) ? taskStatusFromJSON(object.status) : undefined, - earliestStart: isSet(object.earliestStart) ? globalThis.String(object.earliestStart) : undefined, - latestStart: isSet(object.latestStart) ? globalThis.String(object.latestStart) : undefined, - }; - }, - - toJSON(message: SearchTaskRunRequest): unknown { - const obj: any = {}; - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.taskDefName !== "") { - obj.taskDefName = message.taskDefName; - } - if (message.status !== undefined) { - obj.status = taskStatusToJSON(message.status); - } - if (message.earliestStart !== undefined) { - obj.earliestStart = message.earliestStart; - } - if (message.latestStart !== undefined) { - obj.latestStart = message.latestStart; - } - return obj; - }, - - create, I>>(base?: I): SearchTaskRunRequest { - return SearchTaskRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchTaskRunRequest { - const message = createBaseSearchTaskRunRequest(); - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - message.taskDefName = object.taskDefName ?? ""; - message.status = object.status ?? undefined; - message.earliestStart = object.earliestStart ?? undefined; - message.latestStart = object.latestStart ?? undefined; - return message; - }, -}; - -function createBaseTaskRunIdList(): TaskRunIdList { - return { results: [], bookmark: undefined }; -} - -export const TaskRunIdList = { - encode(message: TaskRunIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - TaskRunId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskRunIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskRunIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(TaskRunId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskRunIdList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => TaskRunId.fromJSON(e)) : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: TaskRunIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => TaskRunId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): TaskRunIdList { - return TaskRunIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskRunIdList { - const message = createBaseTaskRunIdList(); - message.results = object.results?.map((e) => TaskRunId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseSearchNodeRunRequest(): SearchNodeRunRequest { - return { - bookmark: undefined, - limit: undefined, - earliestStart: undefined, - latestStart: undefined, - nodeType: SearchNodeRunRequest_NodeType.TASK, - status: LHStatus.STARTING, - }; -} - -export const SearchNodeRunRequest = { - encode(message: SearchNodeRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.bookmark !== undefined) { - writer.uint32(10).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(16).int32(message.limit); - } - if (message.earliestStart !== undefined) { - Timestamp.encode(toTimestamp(message.earliestStart), writer.uint32(26).fork()).ldelim(); - } - if (message.latestStart !== undefined) { - Timestamp.encode(toTimestamp(message.latestStart), writer.uint32(34).fork()).ldelim(); - } - if (message.nodeType !== SearchNodeRunRequest_NodeType.TASK) { - writer.uint32(40).int32(searchNodeRunRequest_NodeTypeToNumber(message.nodeType)); - } - if (message.status !== LHStatus.STARTING) { - writer.uint32(48).int32(lHStatusToNumber(message.status)); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchNodeRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchNodeRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.limit = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.earliestStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.latestStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.nodeType = searchNodeRunRequest_NodeTypeFromJSON(reader.int32()); - continue; - case 6: - if (tag !== 48) { - break; - } - - message.status = lHStatusFromJSON(reader.int32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchNodeRunRequest { - return { - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - earliestStart: isSet(object.earliestStart) ? globalThis.String(object.earliestStart) : undefined, - latestStart: isSet(object.latestStart) ? globalThis.String(object.latestStart) : undefined, - nodeType: isSet(object.nodeType) - ? searchNodeRunRequest_NodeTypeFromJSON(object.nodeType) - : SearchNodeRunRequest_NodeType.TASK, - status: isSet(object.status) ? lHStatusFromJSON(object.status) : LHStatus.STARTING, - }; - }, - - toJSON(message: SearchNodeRunRequest): unknown { - const obj: any = {}; - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.earliestStart !== undefined) { - obj.earliestStart = message.earliestStart; - } - if (message.latestStart !== undefined) { - obj.latestStart = message.latestStart; - } - if (message.nodeType !== SearchNodeRunRequest_NodeType.TASK) { - obj.nodeType = searchNodeRunRequest_NodeTypeToJSON(message.nodeType); - } - if (message.status !== LHStatus.STARTING) { - obj.status = lHStatusToJSON(message.status); - } - return obj; - }, - - create, I>>(base?: I): SearchNodeRunRequest { - return SearchNodeRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchNodeRunRequest { - const message = createBaseSearchNodeRunRequest(); - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - message.earliestStart = object.earliestStart ?? undefined; - message.latestStart = object.latestStart ?? undefined; - message.nodeType = object.nodeType ?? SearchNodeRunRequest_NodeType.TASK; - message.status = object.status ?? LHStatus.STARTING; - return message; - }, -}; - -function createBaseNodeRunIdList(): NodeRunIdList { - return { results: [], bookmark: undefined }; -} - -export const NodeRunIdList = { - encode(message: NodeRunIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - NodeRunId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): NodeRunIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseNodeRunIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(NodeRunId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): NodeRunIdList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => NodeRunId.fromJSON(e)) : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: NodeRunIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => NodeRunId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): NodeRunIdList { - return NodeRunIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): NodeRunIdList { - const message = createBaseNodeRunIdList(); - message.results = object.results?.map((e) => NodeRunId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseSearchUserTaskRunRequest(): SearchUserTaskRunRequest { - return { - bookmark: undefined, - limit: undefined, - status: undefined, - userTaskDefName: undefined, - userId: undefined, - userGroup: undefined, - earliestStart: undefined, - latestStart: undefined, - }; -} - -export const SearchUserTaskRunRequest = { - encode(message: SearchUserTaskRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.bookmark !== undefined) { - writer.uint32(10).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(16).int32(message.limit); - } - if (message.status !== undefined) { - writer.uint32(24).int32(userTaskRunStatusToNumber(message.status)); - } - if (message.userTaskDefName !== undefined) { - writer.uint32(34).string(message.userTaskDefName); - } - if (message.userId !== undefined) { - writer.uint32(42).string(message.userId); - } - if (message.userGroup !== undefined) { - writer.uint32(50).string(message.userGroup); - } - if (message.earliestStart !== undefined) { - Timestamp.encode(toTimestamp(message.earliestStart), writer.uint32(58).fork()).ldelim(); - } - if (message.latestStart !== undefined) { - Timestamp.encode(toTimestamp(message.latestStart), writer.uint32(66).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchUserTaskRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchUserTaskRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.limit = reader.int32(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.status = userTaskRunStatusFromJSON(reader.int32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.userTaskDefName = reader.string(); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.userId = reader.string(); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.userGroup = reader.string(); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.earliestStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.latestStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchUserTaskRunRequest { - return { - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - status: isSet(object.status) ? userTaskRunStatusFromJSON(object.status) : undefined, - userTaskDefName: isSet(object.userTaskDefName) ? globalThis.String(object.userTaskDefName) : undefined, - userId: isSet(object.userId) ? globalThis.String(object.userId) : undefined, - userGroup: isSet(object.userGroup) ? globalThis.String(object.userGroup) : undefined, - earliestStart: isSet(object.earliestStart) ? globalThis.String(object.earliestStart) : undefined, - latestStart: isSet(object.latestStart) ? globalThis.String(object.latestStart) : undefined, - }; - }, - - toJSON(message: SearchUserTaskRunRequest): unknown { - const obj: any = {}; - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.status !== undefined) { - obj.status = userTaskRunStatusToJSON(message.status); - } - if (message.userTaskDefName !== undefined) { - obj.userTaskDefName = message.userTaskDefName; - } - if (message.userId !== undefined) { - obj.userId = message.userId; - } - if (message.userGroup !== undefined) { - obj.userGroup = message.userGroup; - } - if (message.earliestStart !== undefined) { - obj.earliestStart = message.earliestStart; - } - if (message.latestStart !== undefined) { - obj.latestStart = message.latestStart; - } - return obj; - }, - - create, I>>(base?: I): SearchUserTaskRunRequest { - return SearchUserTaskRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchUserTaskRunRequest { - const message = createBaseSearchUserTaskRunRequest(); - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - message.status = object.status ?? undefined; - message.userTaskDefName = object.userTaskDefName ?? undefined; - message.userId = object.userId ?? undefined; - message.userGroup = object.userGroup ?? undefined; - message.earliestStart = object.earliestStart ?? undefined; - message.latestStart = object.latestStart ?? undefined; - return message; - }, -}; - -function createBaseUserTaskRunIdList(): UserTaskRunIdList { - return { results: [], bookmark: undefined }; -} - -export const UserTaskRunIdList = { - encode(message: UserTaskRunIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - UserTaskRunId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskRunIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskRunIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(UserTaskRunId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskRunIdList { - return { - results: globalThis.Array.isArray(object?.results) - ? object.results.map((e: any) => UserTaskRunId.fromJSON(e)) - : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: UserTaskRunIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => UserTaskRunId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): UserTaskRunIdList { - return UserTaskRunIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskRunIdList { - const message = createBaseUserTaskRunIdList(); - message.results = object.results?.map((e) => UserTaskRunId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseSearchVariableRequest(): SearchVariableRequest { - return { - bookmark: undefined, - limit: undefined, - value: undefined, - wfSpecMajorVersion: undefined, - wfSpecRevision: undefined, - varName: "", - wfSpecName: "", - }; -} - -export const SearchVariableRequest = { - encode(message: SearchVariableRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.bookmark !== undefined) { - writer.uint32(10).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(16).int32(message.limit); - } - if (message.value !== undefined) { - VariableValue.encode(message.value, writer.uint32(26).fork()).ldelim(); - } - if (message.wfSpecMajorVersion !== undefined) { - writer.uint32(32).int32(message.wfSpecMajorVersion); - } - if (message.wfSpecRevision !== undefined) { - writer.uint32(40).int32(message.wfSpecRevision); - } - if (message.varName !== "") { - writer.uint32(50).string(message.varName); - } - if (message.wfSpecName !== "") { - writer.uint32(58).string(message.wfSpecName); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchVariableRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchVariableRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.limit = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.value = VariableValue.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.wfSpecMajorVersion = reader.int32(); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.wfSpecRevision = reader.int32(); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.varName = reader.string(); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.wfSpecName = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchVariableRequest { - return { - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - value: isSet(object.value) ? VariableValue.fromJSON(object.value) : undefined, - wfSpecMajorVersion: isSet(object.wfSpecMajorVersion) ? globalThis.Number(object.wfSpecMajorVersion) : undefined, - wfSpecRevision: isSet(object.wfSpecRevision) ? globalThis.Number(object.wfSpecRevision) : undefined, - varName: isSet(object.varName) ? globalThis.String(object.varName) : "", - wfSpecName: isSet(object.wfSpecName) ? globalThis.String(object.wfSpecName) : "", - }; - }, - - toJSON(message: SearchVariableRequest): unknown { - const obj: any = {}; - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.value !== undefined) { - obj.value = VariableValue.toJSON(message.value); - } - if (message.wfSpecMajorVersion !== undefined) { - obj.wfSpecMajorVersion = Math.round(message.wfSpecMajorVersion); - } - if (message.wfSpecRevision !== undefined) { - obj.wfSpecRevision = Math.round(message.wfSpecRevision); - } - if (message.varName !== "") { - obj.varName = message.varName; - } - if (message.wfSpecName !== "") { - obj.wfSpecName = message.wfSpecName; - } - return obj; - }, - - create, I>>(base?: I): SearchVariableRequest { - return SearchVariableRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchVariableRequest { - const message = createBaseSearchVariableRequest(); - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - message.value = (object.value !== undefined && object.value !== null) - ? VariableValue.fromPartial(object.value) - : undefined; - message.wfSpecMajorVersion = object.wfSpecMajorVersion ?? undefined; - message.wfSpecRevision = object.wfSpecRevision ?? undefined; - message.varName = object.varName ?? ""; - message.wfSpecName = object.wfSpecName ?? ""; - return message; - }, -}; - -function createBaseVariableIdList(): VariableIdList { - return { results: [], bookmark: undefined }; -} - -export const VariableIdList = { - encode(message: VariableIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - VariableId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VariableIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariableIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(VariableId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VariableIdList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => VariableId.fromJSON(e)) : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: VariableIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => VariableId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): VariableIdList { - return VariableIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): VariableIdList { - const message = createBaseVariableIdList(); - message.results = object.results?.map((e) => VariableId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseSearchTaskDefRequest(): SearchTaskDefRequest { - return { bookmark: undefined, limit: undefined, prefix: undefined }; -} - -export const SearchTaskDefRequest = { - encode(message: SearchTaskDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.bookmark !== undefined) { - writer.uint32(10).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(16).int32(message.limit); - } - if (message.prefix !== undefined) { - writer.uint32(26).string(message.prefix); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchTaskDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchTaskDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.limit = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.prefix = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchTaskDefRequest { - return { - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - prefix: isSet(object.prefix) ? globalThis.String(object.prefix) : undefined, - }; - }, - - toJSON(message: SearchTaskDefRequest): unknown { - const obj: any = {}; - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.prefix !== undefined) { - obj.prefix = message.prefix; - } - return obj; - }, - - create, I>>(base?: I): SearchTaskDefRequest { - return SearchTaskDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchTaskDefRequest { - const message = createBaseSearchTaskDefRequest(); - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - message.prefix = object.prefix ?? undefined; - return message; - }, -}; - -function createBaseTaskDefIdList(): TaskDefIdList { - return { results: [], bookmark: undefined }; -} - -export const TaskDefIdList = { - encode(message: TaskDefIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - TaskDefId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskDefIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskDefIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(TaskDefId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskDefIdList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => TaskDefId.fromJSON(e)) : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: TaskDefIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => TaskDefId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): TaskDefIdList { - return TaskDefIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskDefIdList { - const message = createBaseTaskDefIdList(); - message.results = object.results?.map((e) => TaskDefId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseSearchUserTaskDefRequest(): SearchUserTaskDefRequest { - return { bookmark: undefined, limit: undefined, prefix: undefined, name: undefined }; -} - -export const SearchUserTaskDefRequest = { - encode(message: SearchUserTaskDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.bookmark !== undefined) { - writer.uint32(10).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(16).int32(message.limit); - } - if (message.prefix !== undefined) { - writer.uint32(26).string(message.prefix); - } - if (message.name !== undefined) { - writer.uint32(34).string(message.name); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchUserTaskDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchUserTaskDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.limit = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.prefix = reader.string(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.name = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchUserTaskDefRequest { - return { - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - prefix: isSet(object.prefix) ? globalThis.String(object.prefix) : undefined, - name: isSet(object.name) ? globalThis.String(object.name) : undefined, - }; - }, - - toJSON(message: SearchUserTaskDefRequest): unknown { - const obj: any = {}; - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.prefix !== undefined) { - obj.prefix = message.prefix; - } - if (message.name !== undefined) { - obj.name = message.name; - } - return obj; - }, - - create, I>>(base?: I): SearchUserTaskDefRequest { - return SearchUserTaskDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchUserTaskDefRequest { - const message = createBaseSearchUserTaskDefRequest(); - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - message.prefix = object.prefix ?? undefined; - message.name = object.name ?? undefined; - return message; - }, -}; - -function createBaseUserTaskDefIdList(): UserTaskDefIdList { - return { results: [], bookmark: undefined }; -} - -export const UserTaskDefIdList = { - encode(message: UserTaskDefIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - UserTaskDefId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskDefIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskDefIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(UserTaskDefId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskDefIdList { - return { - results: globalThis.Array.isArray(object?.results) - ? object.results.map((e: any) => UserTaskDefId.fromJSON(e)) - : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: UserTaskDefIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => UserTaskDefId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): UserTaskDefIdList { - return UserTaskDefIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskDefIdList { - const message = createBaseUserTaskDefIdList(); - message.results = object.results?.map((e) => UserTaskDefId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseSearchWfSpecRequest(): SearchWfSpecRequest { - return { bookmark: undefined, limit: undefined, name: undefined, prefix: undefined, taskDefName: undefined }; -} - -export const SearchWfSpecRequest = { - encode(message: SearchWfSpecRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.bookmark !== undefined) { - writer.uint32(10).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(16).int32(message.limit); - } - if (message.name !== undefined) { - writer.uint32(26).string(message.name); - } - if (message.prefix !== undefined) { - writer.uint32(34).string(message.prefix); - } - if (message.taskDefName !== undefined) { - writer.uint32(42).string(message.taskDefName); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchWfSpecRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchWfSpecRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.limit = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.name = reader.string(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.prefix = reader.string(); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.taskDefName = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchWfSpecRequest { - return { - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - name: isSet(object.name) ? globalThis.String(object.name) : undefined, - prefix: isSet(object.prefix) ? globalThis.String(object.prefix) : undefined, - taskDefName: isSet(object.taskDefName) ? globalThis.String(object.taskDefName) : undefined, - }; - }, - - toJSON(message: SearchWfSpecRequest): unknown { - const obj: any = {}; - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.name !== undefined) { - obj.name = message.name; - } - if (message.prefix !== undefined) { - obj.prefix = message.prefix; - } - if (message.taskDefName !== undefined) { - obj.taskDefName = message.taskDefName; - } - return obj; - }, - - create, I>>(base?: I): SearchWfSpecRequest { - return SearchWfSpecRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchWfSpecRequest { - const message = createBaseSearchWfSpecRequest(); - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - message.name = object.name ?? undefined; - message.prefix = object.prefix ?? undefined; - message.taskDefName = object.taskDefName ?? undefined; - return message; - }, -}; - -function createBaseWfSpecIdList(): WfSpecIdList { - return { results: [], bookmark: undefined }; -} - -export const WfSpecIdList = { - encode(message: WfSpecIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - WfSpecId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfSpecIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfSpecIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(WfSpecId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfSpecIdList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => WfSpecId.fromJSON(e)) : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: WfSpecIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => WfSpecId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): WfSpecIdList { - return WfSpecIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfSpecIdList { - const message = createBaseWfSpecIdList(); - message.results = object.results?.map((e) => WfSpecId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseSearchExternalEventDefRequest(): SearchExternalEventDefRequest { - return { bookmark: undefined, limit: undefined, prefix: undefined }; -} - -export const SearchExternalEventDefRequest = { - encode(message: SearchExternalEventDefRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.bookmark !== undefined) { - writer.uint32(10).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(16).int32(message.limit); - } - if (message.prefix !== undefined) { - writer.uint32(26).string(message.prefix); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchExternalEventDefRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchExternalEventDefRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.limit = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.prefix = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchExternalEventDefRequest { - return { - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - prefix: isSet(object.prefix) ? globalThis.String(object.prefix) : undefined, - }; - }, - - toJSON(message: SearchExternalEventDefRequest): unknown { - const obj: any = {}; - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.prefix !== undefined) { - obj.prefix = message.prefix; - } - return obj; - }, - - create, I>>(base?: I): SearchExternalEventDefRequest { - return SearchExternalEventDefRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): SearchExternalEventDefRequest { - const message = createBaseSearchExternalEventDefRequest(); - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - message.prefix = object.prefix ?? undefined; - return message; - }, -}; - -function createBaseExternalEventDefIdList(): ExternalEventDefIdList { - return { results: [], bookmark: undefined }; -} - -export const ExternalEventDefIdList = { - encode(message: ExternalEventDefIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - ExternalEventDefId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExternalEventDefIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExternalEventDefIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(ExternalEventDefId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExternalEventDefIdList { - return { - results: globalThis.Array.isArray(object?.results) - ? object.results.map((e: any) => ExternalEventDefId.fromJSON(e)) - : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: ExternalEventDefIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => ExternalEventDefId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): ExternalEventDefIdList { - return ExternalEventDefIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExternalEventDefIdList { - const message = createBaseExternalEventDefIdList(); - message.results = object.results?.map((e) => ExternalEventDefId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseSearchTenantRequest(): SearchTenantRequest { - return { limit: undefined, bookmark: undefined }; -} - -export const SearchTenantRequest = { - encode(message: SearchTenantRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.limit !== undefined) { - writer.uint32(8).int32(message.limit); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchTenantRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchTenantRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.limit = reader.int32(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchTenantRequest { - return { - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: SearchTenantRequest): unknown { - const obj: any = {}; - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): SearchTenantRequest { - return SearchTenantRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchTenantRequest { - const message = createBaseSearchTenantRequest(); - message.limit = object.limit ?? undefined; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseTenantIdList(): TenantIdList { - return { results: [], bookmark: undefined }; -} - -export const TenantIdList = { - encode(message: TenantIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - TenantId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TenantIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTenantIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(TenantId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TenantIdList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => TenantId.fromJSON(e)) : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: TenantIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => TenantId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): TenantIdList { - return TenantIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TenantIdList { - const message = createBaseTenantIdList(); - message.results = object.results?.map((e) => TenantId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseSearchExternalEventRequest(): SearchExternalEventRequest { - return { bookmark: undefined, limit: undefined, wfRunId: undefined, externalEventDefNameAndStatus: undefined }; -} - -export const SearchExternalEventRequest = { - encode(message: SearchExternalEventRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.bookmark !== undefined) { - writer.uint32(10).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(16).int32(message.limit); - } - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(26).fork()).ldelim(); - } - if (message.externalEventDefNameAndStatus !== undefined) { - SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest.encode( - message.externalEventDefNameAndStatus, - writer.uint32(34).fork(), - ).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchExternalEventRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchExternalEventRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.limit = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.externalEventDefNameAndStatus = SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest.decode( - reader, - reader.uint32(), - ); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchExternalEventRequest { - return { - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - externalEventDefNameAndStatus: isSet(object.externalEventDefNameAndStatus) - ? SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest.fromJSON(object.externalEventDefNameAndStatus) - : undefined, - }; - }, - - toJSON(message: SearchExternalEventRequest): unknown { - const obj: any = {}; - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.externalEventDefNameAndStatus !== undefined) { - obj.externalEventDefNameAndStatus = SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest.toJSON( - message.externalEventDefNameAndStatus, - ); - } - return obj; - }, - - create, I>>(base?: I): SearchExternalEventRequest { - return SearchExternalEventRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchExternalEventRequest { - const message = createBaseSearchExternalEventRequest(); - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.externalEventDefNameAndStatus = - (object.externalEventDefNameAndStatus !== undefined && object.externalEventDefNameAndStatus !== null) - ? SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest.fromPartial(object.externalEventDefNameAndStatus) - : undefined; - return message; - }, -}; - -function createBaseSearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest(): SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest { - return { externalEventDefName: "", isClaimed: undefined }; -} - -export const SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest = { - encode( - message: SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest, - writer: _m0.Writer = _m0.Writer.create(), - ): _m0.Writer { - if (message.externalEventDefName !== "") { - writer.uint32(10).string(message.externalEventDefName); - } - if (message.isClaimed !== undefined) { - writer.uint32(16).bool(message.isClaimed); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.externalEventDefName = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.isClaimed = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest { - return { - externalEventDefName: isSet(object.externalEventDefName) ? globalThis.String(object.externalEventDefName) : "", - isClaimed: isSet(object.isClaimed) ? globalThis.Boolean(object.isClaimed) : undefined, - }; - }, - - toJSON(message: SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest): unknown { - const obj: any = {}; - if (message.externalEventDefName !== "") { - obj.externalEventDefName = message.externalEventDefName; - } - if (message.isClaimed !== undefined) { - obj.isClaimed = message.isClaimed; - } - return obj; - }, - - create, I>>( - base?: I, - ): SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest { - return SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): SearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest { - const message = createBaseSearchExternalEventRequest_ByExtEvtDefNameAndStatusRequest(); - message.externalEventDefName = object.externalEventDefName ?? ""; - message.isClaimed = object.isClaimed ?? undefined; - return message; - }, -}; - -function createBaseExternalEventIdList(): ExternalEventIdList { - return { results: [], bookmark: undefined }; -} - -export const ExternalEventIdList = { - encode(message: ExternalEventIdList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - ExternalEventId.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExternalEventIdList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExternalEventIdList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(ExternalEventId.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExternalEventIdList { - return { - results: globalThis.Array.isArray(object?.results) - ? object.results.map((e: any) => ExternalEventId.fromJSON(e)) - : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: ExternalEventIdList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => ExternalEventId.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): ExternalEventIdList { - return ExternalEventIdList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExternalEventIdList { - const message = createBaseExternalEventIdList(); - message.results = object.results?.map((e) => ExternalEventId.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseListNodeRunsRequest(): ListNodeRunsRequest { - return { wfRunId: undefined, threadRunNumber: undefined, bookmark: undefined, limit: undefined }; -} - -export const ListNodeRunsRequest = { - encode(message: ListNodeRunsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.threadRunNumber !== undefined) { - writer.uint32(16).int32(message.threadRunNumber); - } - if (message.bookmark !== undefined) { - writer.uint32(26).bytes(message.bookmark); - } - if (message.limit !== undefined) { - writer.uint32(32).int32(message.limit); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ListNodeRunsRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListNodeRunsRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.threadRunNumber = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.bookmark = reader.bytes(); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.limit = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListNodeRunsRequest { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - threadRunNumber: isSet(object.threadRunNumber) ? globalThis.Number(object.threadRunNumber) : undefined, - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined, - }; - }, - - toJSON(message: ListNodeRunsRequest): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.threadRunNumber !== undefined) { - obj.threadRunNumber = Math.round(message.threadRunNumber); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - if (message.limit !== undefined) { - obj.limit = Math.round(message.limit); - } - return obj; - }, - - create, I>>(base?: I): ListNodeRunsRequest { - return ListNodeRunsRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListNodeRunsRequest { - const message = createBaseListNodeRunsRequest(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.threadRunNumber = object.threadRunNumber ?? undefined; - message.bookmark = object.bookmark ?? undefined; - message.limit = object.limit ?? undefined; - return message; - }, -}; - -function createBaseNodeRunList(): NodeRunList { - return { results: [], bookmark: undefined }; -} - -export const NodeRunList = { - encode(message: NodeRunList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - NodeRun.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.bookmark !== undefined) { - writer.uint32(18).bytes(message.bookmark); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): NodeRunList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseNodeRunList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(NodeRun.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.bookmark = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): NodeRunList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => NodeRun.fromJSON(e)) : [], - bookmark: isSet(object.bookmark) ? bytesFromBase64(object.bookmark) : undefined, - }; - }, - - toJSON(message: NodeRunList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => NodeRun.toJSON(e)); - } - if (message.bookmark !== undefined) { - obj.bookmark = base64FromBytes(message.bookmark); - } - return obj; - }, - - create, I>>(base?: I): NodeRunList { - return NodeRunList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): NodeRunList { - const message = createBaseNodeRunList(); - message.results = object.results?.map((e) => NodeRun.fromPartial(e)) || []; - message.bookmark = object.bookmark ?? undefined; - return message; - }, -}; - -function createBaseListVariablesRequest(): ListVariablesRequest { - return { wfRunId: undefined }; -} - -export const ListVariablesRequest = { - encode(message: ListVariablesRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ListVariablesRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListVariablesRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListVariablesRequest { - return { wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined }; - }, - - toJSON(message: ListVariablesRequest): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - return obj; - }, - - create, I>>(base?: I): ListVariablesRequest { - return ListVariablesRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListVariablesRequest { - const message = createBaseListVariablesRequest(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - return message; - }, -}; - -function createBaseVariableList(): VariableList { - return { results: [] }; -} - -export const VariableList = { - encode(message: VariableList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - Variable.encode(v!, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VariableList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariableList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(Variable.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VariableList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => Variable.fromJSON(e)) : [], - }; - }, - - toJSON(message: VariableList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => Variable.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): VariableList { - return VariableList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): VariableList { - const message = createBaseVariableList(); - message.results = object.results?.map((e) => Variable.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseListExternalEventsRequest(): ListExternalEventsRequest { - return { wfRunId: undefined }; -} - -export const ListExternalEventsRequest = { - encode(message: ListExternalEventsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ListExternalEventsRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListExternalEventsRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListExternalEventsRequest { - return { wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined }; - }, - - toJSON(message: ListExternalEventsRequest): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - return obj; - }, - - create, I>>(base?: I): ListExternalEventsRequest { - return ListExternalEventsRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListExternalEventsRequest { - const message = createBaseListExternalEventsRequest(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - return message; - }, -}; - -function createBaseExternalEventList(): ExternalEventList { - return { results: [] }; -} - -export const ExternalEventList = { - encode(message: ExternalEventList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - ExternalEvent.encode(v!, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExternalEventList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExternalEventList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(ExternalEvent.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExternalEventList { - return { - results: globalThis.Array.isArray(object?.results) - ? object.results.map((e: any) => ExternalEvent.fromJSON(e)) - : [], - }; - }, - - toJSON(message: ExternalEventList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => ExternalEvent.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): ExternalEventList { - return ExternalEventList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExternalEventList { - const message = createBaseExternalEventList(); - message.results = object.results?.map((e) => ExternalEvent.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseRegisterTaskWorkerRequest(): RegisterTaskWorkerRequest { - return { taskWorkerId: "", taskDefId: undefined, listenerName: "" }; -} - -export const RegisterTaskWorkerRequest = { - encode(message: RegisterTaskWorkerRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskWorkerId !== "") { - writer.uint32(10).string(message.taskWorkerId); - } - if (message.taskDefId !== undefined) { - TaskDefId.encode(message.taskDefId, writer.uint32(18).fork()).ldelim(); - } - if (message.listenerName !== "") { - writer.uint32(26).string(message.listenerName); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): RegisterTaskWorkerRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseRegisterTaskWorkerRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskWorkerId = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.taskDefId = TaskDefId.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.listenerName = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): RegisterTaskWorkerRequest { - return { - taskWorkerId: isSet(object.taskWorkerId) ? globalThis.String(object.taskWorkerId) : "", - taskDefId: isSet(object.taskDefId) ? TaskDefId.fromJSON(object.taskDefId) : undefined, - listenerName: isSet(object.listenerName) ? globalThis.String(object.listenerName) : "", - }; - }, - - toJSON(message: RegisterTaskWorkerRequest): unknown { - const obj: any = {}; - if (message.taskWorkerId !== "") { - obj.taskWorkerId = message.taskWorkerId; - } - if (message.taskDefId !== undefined) { - obj.taskDefId = TaskDefId.toJSON(message.taskDefId); - } - if (message.listenerName !== "") { - obj.listenerName = message.listenerName; - } - return obj; - }, - - create, I>>(base?: I): RegisterTaskWorkerRequest { - return RegisterTaskWorkerRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): RegisterTaskWorkerRequest { - const message = createBaseRegisterTaskWorkerRequest(); - message.taskWorkerId = object.taskWorkerId ?? ""; - message.taskDefId = (object.taskDefId !== undefined && object.taskDefId !== null) - ? TaskDefId.fromPartial(object.taskDefId) - : undefined; - message.listenerName = object.listenerName ?? ""; - return message; - }, -}; - -function createBaseTaskWorkerHeartBeatRequest(): TaskWorkerHeartBeatRequest { - return { clientId: "", taskDefId: undefined, listenerName: "" }; -} - -export const TaskWorkerHeartBeatRequest = { - encode(message: TaskWorkerHeartBeatRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.clientId !== "") { - writer.uint32(10).string(message.clientId); - } - if (message.taskDefId !== undefined) { - TaskDefId.encode(message.taskDefId, writer.uint32(18).fork()).ldelim(); - } - if (message.listenerName !== "") { - writer.uint32(26).string(message.listenerName); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskWorkerHeartBeatRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskWorkerHeartBeatRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.clientId = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.taskDefId = TaskDefId.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.listenerName = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskWorkerHeartBeatRequest { - return { - clientId: isSet(object.clientId) ? globalThis.String(object.clientId) : "", - taskDefId: isSet(object.taskDefId) ? TaskDefId.fromJSON(object.taskDefId) : undefined, - listenerName: isSet(object.listenerName) ? globalThis.String(object.listenerName) : "", - }; - }, - - toJSON(message: TaskWorkerHeartBeatRequest): unknown { - const obj: any = {}; - if (message.clientId !== "") { - obj.clientId = message.clientId; - } - if (message.taskDefId !== undefined) { - obj.taskDefId = TaskDefId.toJSON(message.taskDefId); - } - if (message.listenerName !== "") { - obj.listenerName = message.listenerName; - } - return obj; - }, - - create, I>>(base?: I): TaskWorkerHeartBeatRequest { - return TaskWorkerHeartBeatRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskWorkerHeartBeatRequest { - const message = createBaseTaskWorkerHeartBeatRequest(); - message.clientId = object.clientId ?? ""; - message.taskDefId = (object.taskDefId !== undefined && object.taskDefId !== null) - ? TaskDefId.fromPartial(object.taskDefId) - : undefined; - message.listenerName = object.listenerName ?? ""; - return message; - }, -}; - -function createBaseRegisterTaskWorkerResponse(): RegisterTaskWorkerResponse { - return { yourHosts: [], isClusterHealthy: undefined }; -} - -export const RegisterTaskWorkerResponse = { - encode(message: RegisterTaskWorkerResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.yourHosts) { - LHHostInfo.encode(v!, writer.uint32(10).fork()).ldelim(); - } - if (message.isClusterHealthy !== undefined) { - writer.uint32(16).bool(message.isClusterHealthy); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): RegisterTaskWorkerResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseRegisterTaskWorkerResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.yourHosts.push(LHHostInfo.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.isClusterHealthy = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): RegisterTaskWorkerResponse { - return { - yourHosts: globalThis.Array.isArray(object?.yourHosts) - ? object.yourHosts.map((e: any) => LHHostInfo.fromJSON(e)) - : [], - isClusterHealthy: isSet(object.isClusterHealthy) ? globalThis.Boolean(object.isClusterHealthy) : undefined, - }; - }, - - toJSON(message: RegisterTaskWorkerResponse): unknown { - const obj: any = {}; - if (message.yourHosts?.length) { - obj.yourHosts = message.yourHosts.map((e) => LHHostInfo.toJSON(e)); - } - if (message.isClusterHealthy !== undefined) { - obj.isClusterHealthy = message.isClusterHealthy; - } - return obj; - }, - - create, I>>(base?: I): RegisterTaskWorkerResponse { - return RegisterTaskWorkerResponse.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): RegisterTaskWorkerResponse { - const message = createBaseRegisterTaskWorkerResponse(); - message.yourHosts = object.yourHosts?.map((e) => LHHostInfo.fromPartial(e)) || []; - message.isClusterHealthy = object.isClusterHealthy ?? undefined; - return message; - }, -}; - -function createBaseLHHostInfo(): LHHostInfo { - return { host: "", port: 0 }; -} - -export const LHHostInfo = { - encode(message: LHHostInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.host !== "") { - writer.uint32(10).string(message.host); - } - if (message.port !== 0) { - writer.uint32(16).int32(message.port); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): LHHostInfo { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseLHHostInfo(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.host = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.port = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): LHHostInfo { - return { - host: isSet(object.host) ? globalThis.String(object.host) : "", - port: isSet(object.port) ? globalThis.Number(object.port) : 0, - }; - }, - - toJSON(message: LHHostInfo): unknown { - const obj: any = {}; - if (message.host !== "") { - obj.host = message.host; - } - if (message.port !== 0) { - obj.port = Math.round(message.port); - } - return obj; - }, - - create, I>>(base?: I): LHHostInfo { - return LHHostInfo.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): LHHostInfo { - const message = createBaseLHHostInfo(); - message.host = object.host ?? ""; - message.port = object.port ?? 0; - return message; - }, -}; - -function createBasePollTaskRequest(): PollTaskRequest { - return { taskDefId: undefined, clientId: "", taskWorkerVersion: undefined }; -} - -export const PollTaskRequest = { - encode(message: PollTaskRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskDefId !== undefined) { - TaskDefId.encode(message.taskDefId, writer.uint32(10).fork()).ldelim(); - } - if (message.clientId !== "") { - writer.uint32(18).string(message.clientId); - } - if (message.taskWorkerVersion !== undefined) { - writer.uint32(26).string(message.taskWorkerVersion); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PollTaskRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePollTaskRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskDefId = TaskDefId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.clientId = reader.string(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.taskWorkerVersion = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PollTaskRequest { - return { - taskDefId: isSet(object.taskDefId) ? TaskDefId.fromJSON(object.taskDefId) : undefined, - clientId: isSet(object.clientId) ? globalThis.String(object.clientId) : "", - taskWorkerVersion: isSet(object.taskWorkerVersion) ? globalThis.String(object.taskWorkerVersion) : undefined, - }; - }, - - toJSON(message: PollTaskRequest): unknown { - const obj: any = {}; - if (message.taskDefId !== undefined) { - obj.taskDefId = TaskDefId.toJSON(message.taskDefId); - } - if (message.clientId !== "") { - obj.clientId = message.clientId; - } - if (message.taskWorkerVersion !== undefined) { - obj.taskWorkerVersion = message.taskWorkerVersion; - } - return obj; - }, - - create, I>>(base?: I): PollTaskRequest { - return PollTaskRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PollTaskRequest { - const message = createBasePollTaskRequest(); - message.taskDefId = (object.taskDefId !== undefined && object.taskDefId !== null) - ? TaskDefId.fromPartial(object.taskDefId) - : undefined; - message.clientId = object.clientId ?? ""; - message.taskWorkerVersion = object.taskWorkerVersion ?? undefined; - return message; - }, -}; - -function createBaseScheduledTask(): ScheduledTask { - return { - taskRunId: undefined, - taskDefId: undefined, - attemptNumber: 0, - variables: [], - createdAt: undefined, - source: undefined, - }; -} - -export const ScheduledTask = { - encode(message: ScheduledTask, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskRunId !== undefined) { - TaskRunId.encode(message.taskRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.taskDefId !== undefined) { - TaskDefId.encode(message.taskDefId, writer.uint32(18).fork()).ldelim(); - } - if (message.attemptNumber !== 0) { - writer.uint32(24).int32(message.attemptNumber); - } - for (const v of message.variables) { - VarNameAndVal.encode(v!, writer.uint32(34).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(42).fork()).ldelim(); - } - if (message.source !== undefined) { - TaskRunSource.encode(message.source, writer.uint32(50).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ScheduledTask { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseScheduledTask(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskRunId = TaskRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.taskDefId = TaskDefId.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.attemptNumber = reader.int32(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.variables.push(VarNameAndVal.decode(reader, reader.uint32())); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.source = TaskRunSource.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ScheduledTask { - return { - taskRunId: isSet(object.taskRunId) ? TaskRunId.fromJSON(object.taskRunId) : undefined, - taskDefId: isSet(object.taskDefId) ? TaskDefId.fromJSON(object.taskDefId) : undefined, - attemptNumber: isSet(object.attemptNumber) ? globalThis.Number(object.attemptNumber) : 0, - variables: globalThis.Array.isArray(object?.variables) - ? object.variables.map((e: any) => VarNameAndVal.fromJSON(e)) - : [], - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - source: isSet(object.source) ? TaskRunSource.fromJSON(object.source) : undefined, - }; - }, - - toJSON(message: ScheduledTask): unknown { - const obj: any = {}; - if (message.taskRunId !== undefined) { - obj.taskRunId = TaskRunId.toJSON(message.taskRunId); - } - if (message.taskDefId !== undefined) { - obj.taskDefId = TaskDefId.toJSON(message.taskDefId); - } - if (message.attemptNumber !== 0) { - obj.attemptNumber = Math.round(message.attemptNumber); - } - if (message.variables?.length) { - obj.variables = message.variables.map((e) => VarNameAndVal.toJSON(e)); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - if (message.source !== undefined) { - obj.source = TaskRunSource.toJSON(message.source); - } - return obj; - }, - - create, I>>(base?: I): ScheduledTask { - return ScheduledTask.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ScheduledTask { - const message = createBaseScheduledTask(); - message.taskRunId = (object.taskRunId !== undefined && object.taskRunId !== null) - ? TaskRunId.fromPartial(object.taskRunId) - : undefined; - message.taskDefId = (object.taskDefId !== undefined && object.taskDefId !== null) - ? TaskDefId.fromPartial(object.taskDefId) - : undefined; - message.attemptNumber = object.attemptNumber ?? 0; - message.variables = object.variables?.map((e) => VarNameAndVal.fromPartial(e)) || []; - message.createdAt = object.createdAt ?? undefined; - message.source = (object.source !== undefined && object.source !== null) - ? TaskRunSource.fromPartial(object.source) - : undefined; - return message; - }, -}; - -function createBasePollTaskResponse(): PollTaskResponse { - return { result: undefined }; -} - -export const PollTaskResponse = { - encode(message: PollTaskResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.result !== undefined) { - ScheduledTask.encode(message.result, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PollTaskResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePollTaskResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.result = ScheduledTask.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PollTaskResponse { - return { result: isSet(object.result) ? ScheduledTask.fromJSON(object.result) : undefined }; - }, - - toJSON(message: PollTaskResponse): unknown { - const obj: any = {}; - if (message.result !== undefined) { - obj.result = ScheduledTask.toJSON(message.result); - } - return obj; - }, - - create, I>>(base?: I): PollTaskResponse { - return PollTaskResponse.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PollTaskResponse { - const message = createBasePollTaskResponse(); - message.result = (object.result !== undefined && object.result !== null) - ? ScheduledTask.fromPartial(object.result) - : undefined; - return message; - }, -}; - -function createBaseReportTaskRun(): ReportTaskRun { - return { - taskRunId: undefined, - time: undefined, - status: TaskStatus.TASK_SCHEDULED, - logOutput: undefined, - attemptNumber: 0, - output: undefined, - error: undefined, - exception: undefined, - }; -} - -export const ReportTaskRun = { - encode(message: ReportTaskRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskRunId !== undefined) { - TaskRunId.encode(message.taskRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.time !== undefined) { - Timestamp.encode(toTimestamp(message.time), writer.uint32(18).fork()).ldelim(); - } - if (message.status !== TaskStatus.TASK_SCHEDULED) { - writer.uint32(24).int32(taskStatusToNumber(message.status)); - } - if (message.logOutput !== undefined) { - VariableValue.encode(message.logOutput, writer.uint32(42).fork()).ldelim(); - } - if (message.attemptNumber !== 0) { - writer.uint32(48).int32(message.attemptNumber); - } - if (message.output !== undefined) { - VariableValue.encode(message.output, writer.uint32(34).fork()).ldelim(); - } - if (message.error !== undefined) { - LHTaskError.encode(message.error, writer.uint32(58).fork()).ldelim(); - } - if (message.exception !== undefined) { - LHTaskException.encode(message.exception, writer.uint32(66).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ReportTaskRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseReportTaskRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskRunId = TaskRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.time = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.status = taskStatusFromJSON(reader.int32()); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.logOutput = VariableValue.decode(reader, reader.uint32()); - continue; - case 6: - if (tag !== 48) { - break; - } - - message.attemptNumber = reader.int32(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.output = VariableValue.decode(reader, reader.uint32()); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.error = LHTaskError.decode(reader, reader.uint32()); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.exception = LHTaskException.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ReportTaskRun { - return { - taskRunId: isSet(object.taskRunId) ? TaskRunId.fromJSON(object.taskRunId) : undefined, - time: isSet(object.time) ? globalThis.String(object.time) : undefined, - status: isSet(object.status) ? taskStatusFromJSON(object.status) : TaskStatus.TASK_SCHEDULED, - logOutput: isSet(object.logOutput) ? VariableValue.fromJSON(object.logOutput) : undefined, - attemptNumber: isSet(object.attemptNumber) ? globalThis.Number(object.attemptNumber) : 0, - output: isSet(object.output) ? VariableValue.fromJSON(object.output) : undefined, - error: isSet(object.error) ? LHTaskError.fromJSON(object.error) : undefined, - exception: isSet(object.exception) ? LHTaskException.fromJSON(object.exception) : undefined, - }; - }, - - toJSON(message: ReportTaskRun): unknown { - const obj: any = {}; - if (message.taskRunId !== undefined) { - obj.taskRunId = TaskRunId.toJSON(message.taskRunId); - } - if (message.time !== undefined) { - obj.time = message.time; - } - if (message.status !== TaskStatus.TASK_SCHEDULED) { - obj.status = taskStatusToJSON(message.status); - } - if (message.logOutput !== undefined) { - obj.logOutput = VariableValue.toJSON(message.logOutput); - } - if (message.attemptNumber !== 0) { - obj.attemptNumber = Math.round(message.attemptNumber); - } - if (message.output !== undefined) { - obj.output = VariableValue.toJSON(message.output); - } - if (message.error !== undefined) { - obj.error = LHTaskError.toJSON(message.error); - } - if (message.exception !== undefined) { - obj.exception = LHTaskException.toJSON(message.exception); - } - return obj; - }, - - create, I>>(base?: I): ReportTaskRun { - return ReportTaskRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ReportTaskRun { - const message = createBaseReportTaskRun(); - message.taskRunId = (object.taskRunId !== undefined && object.taskRunId !== null) - ? TaskRunId.fromPartial(object.taskRunId) - : undefined; - message.time = object.time ?? undefined; - message.status = object.status ?? TaskStatus.TASK_SCHEDULED; - message.logOutput = (object.logOutput !== undefined && object.logOutput !== null) - ? VariableValue.fromPartial(object.logOutput) - : undefined; - message.attemptNumber = object.attemptNumber ?? 0; - message.output = (object.output !== undefined && object.output !== null) - ? VariableValue.fromPartial(object.output) - : undefined; - message.error = (object.error !== undefined && object.error !== null) - ? LHTaskError.fromPartial(object.error) - : undefined; - message.exception = (object.exception !== undefined && object.exception !== null) - ? LHTaskException.fromPartial(object.exception) - : undefined; - return message; - }, -}; - -function createBaseStopWfRunRequest(): StopWfRunRequest { - return { wfRunId: undefined, threadRunNumber: 0 }; -} - -export const StopWfRunRequest = { - encode(message: StopWfRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.threadRunNumber !== 0) { - writer.uint32(16).int32(message.threadRunNumber); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): StopWfRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseStopWfRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.threadRunNumber = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): StopWfRunRequest { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - threadRunNumber: isSet(object.threadRunNumber) ? globalThis.Number(object.threadRunNumber) : 0, - }; - }, - - toJSON(message: StopWfRunRequest): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.threadRunNumber !== 0) { - obj.threadRunNumber = Math.round(message.threadRunNumber); - } - return obj; - }, - - create, I>>(base?: I): StopWfRunRequest { - return StopWfRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): StopWfRunRequest { - const message = createBaseStopWfRunRequest(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.threadRunNumber = object.threadRunNumber ?? 0; - return message; - }, -}; - -function createBaseResumeWfRunRequest(): ResumeWfRunRequest { - return { wfRunId: undefined, threadRunNumber: 0 }; -} - -export const ResumeWfRunRequest = { - encode(message: ResumeWfRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.threadRunNumber !== 0) { - writer.uint32(16).int32(message.threadRunNumber); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ResumeWfRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseResumeWfRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.threadRunNumber = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ResumeWfRunRequest { - return { - wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined, - threadRunNumber: isSet(object.threadRunNumber) ? globalThis.Number(object.threadRunNumber) : 0, - }; - }, - - toJSON(message: ResumeWfRunRequest): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - if (message.threadRunNumber !== 0) { - obj.threadRunNumber = Math.round(message.threadRunNumber); - } - return obj; - }, - - create, I>>(base?: I): ResumeWfRunRequest { - return ResumeWfRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ResumeWfRunRequest { - const message = createBaseResumeWfRunRequest(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - message.threadRunNumber = object.threadRunNumber ?? 0; - return message; - }, -}; - -function createBaseTaskDefMetricsQueryRequest(): TaskDefMetricsQueryRequest { - return { windowStart: undefined, windowType: MetricsWindowLength.MINUTES_5, taskDefName: undefined }; -} - -export const TaskDefMetricsQueryRequest = { - encode(message: TaskDefMetricsQueryRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.windowStart !== undefined) { - Timestamp.encode(toTimestamp(message.windowStart), writer.uint32(10).fork()).ldelim(); - } - if (message.windowType !== MetricsWindowLength.MINUTES_5) { - writer.uint32(16).int32(metricsWindowLengthToNumber(message.windowType)); - } - if (message.taskDefName !== undefined) { - writer.uint32(26).string(message.taskDefName); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskDefMetricsQueryRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskDefMetricsQueryRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.windowStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.windowType = metricsWindowLengthFromJSON(reader.int32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.taskDefName = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskDefMetricsQueryRequest { - return { - windowStart: isSet(object.windowStart) ? globalThis.String(object.windowStart) : undefined, - windowType: isSet(object.windowType) - ? metricsWindowLengthFromJSON(object.windowType) - : MetricsWindowLength.MINUTES_5, - taskDefName: isSet(object.taskDefName) ? globalThis.String(object.taskDefName) : undefined, - }; - }, - - toJSON(message: TaskDefMetricsQueryRequest): unknown { - const obj: any = {}; - if (message.windowStart !== undefined) { - obj.windowStart = message.windowStart; - } - if (message.windowType !== MetricsWindowLength.MINUTES_5) { - obj.windowType = metricsWindowLengthToJSON(message.windowType); - } - if (message.taskDefName !== undefined) { - obj.taskDefName = message.taskDefName; - } - return obj; - }, - - create, I>>(base?: I): TaskDefMetricsQueryRequest { - return TaskDefMetricsQueryRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskDefMetricsQueryRequest { - const message = createBaseTaskDefMetricsQueryRequest(); - message.windowStart = object.windowStart ?? undefined; - message.windowType = object.windowType ?? MetricsWindowLength.MINUTES_5; - message.taskDefName = object.taskDefName ?? undefined; - return message; - }, -}; - -function createBaseListTaskMetricsRequest(): ListTaskMetricsRequest { - return { - taskDefId: undefined, - lastWindowStart: undefined, - windowLength: MetricsWindowLength.MINUTES_5, - numWindows: 0, - }; -} - -export const ListTaskMetricsRequest = { - encode(message: ListTaskMetricsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskDefId !== undefined) { - TaskDefId.encode(message.taskDefId, writer.uint32(10).fork()).ldelim(); - } - if (message.lastWindowStart !== undefined) { - Timestamp.encode(toTimestamp(message.lastWindowStart), writer.uint32(18).fork()).ldelim(); - } - if (message.windowLength !== MetricsWindowLength.MINUTES_5) { - writer.uint32(24).int32(metricsWindowLengthToNumber(message.windowLength)); - } - if (message.numWindows !== 0) { - writer.uint32(32).int32(message.numWindows); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ListTaskMetricsRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListTaskMetricsRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskDefId = TaskDefId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.lastWindowStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.windowLength = metricsWindowLengthFromJSON(reader.int32()); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.numWindows = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListTaskMetricsRequest { - return { - taskDefId: isSet(object.taskDefId) ? TaskDefId.fromJSON(object.taskDefId) : undefined, - lastWindowStart: isSet(object.lastWindowStart) ? globalThis.String(object.lastWindowStart) : undefined, - windowLength: isSet(object.windowLength) - ? metricsWindowLengthFromJSON(object.windowLength) - : MetricsWindowLength.MINUTES_5, - numWindows: isSet(object.numWindows) ? globalThis.Number(object.numWindows) : 0, - }; - }, - - toJSON(message: ListTaskMetricsRequest): unknown { - const obj: any = {}; - if (message.taskDefId !== undefined) { - obj.taskDefId = TaskDefId.toJSON(message.taskDefId); - } - if (message.lastWindowStart !== undefined) { - obj.lastWindowStart = message.lastWindowStart; - } - if (message.windowLength !== MetricsWindowLength.MINUTES_5) { - obj.windowLength = metricsWindowLengthToJSON(message.windowLength); - } - if (message.numWindows !== 0) { - obj.numWindows = Math.round(message.numWindows); - } - return obj; - }, - - create, I>>(base?: I): ListTaskMetricsRequest { - return ListTaskMetricsRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListTaskMetricsRequest { - const message = createBaseListTaskMetricsRequest(); - message.taskDefId = (object.taskDefId !== undefined && object.taskDefId !== null) - ? TaskDefId.fromPartial(object.taskDefId) - : undefined; - message.lastWindowStart = object.lastWindowStart ?? undefined; - message.windowLength = object.windowLength ?? MetricsWindowLength.MINUTES_5; - message.numWindows = object.numWindows ?? 0; - return message; - }, -}; - -function createBaseListTaskMetricsResponse(): ListTaskMetricsResponse { - return { results: [] }; -} - -export const ListTaskMetricsResponse = { - encode(message: ListTaskMetricsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - TaskDefMetrics.encode(v!, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ListTaskMetricsResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListTaskMetricsResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(TaskDefMetrics.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListTaskMetricsResponse { - return { - results: globalThis.Array.isArray(object?.results) - ? object.results.map((e: any) => TaskDefMetrics.fromJSON(e)) - : [], - }; - }, - - toJSON(message: ListTaskMetricsResponse): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => TaskDefMetrics.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): ListTaskMetricsResponse { - return ListTaskMetricsResponse.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListTaskMetricsResponse { - const message = createBaseListTaskMetricsResponse(); - message.results = object.results?.map((e) => TaskDefMetrics.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseWfSpecMetricsQueryRequest(): WfSpecMetricsQueryRequest { - return { wfSpecId: undefined, windowStart: undefined, windowLength: MetricsWindowLength.MINUTES_5 }; -} - -export const WfSpecMetricsQueryRequest = { - encode(message: WfSpecMetricsQueryRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfSpecId !== undefined) { - WfSpecId.encode(message.wfSpecId, writer.uint32(10).fork()).ldelim(); - } - if (message.windowStart !== undefined) { - Timestamp.encode(toTimestamp(message.windowStart), writer.uint32(18).fork()).ldelim(); - } - if (message.windowLength !== MetricsWindowLength.MINUTES_5) { - writer.uint32(24).int32(metricsWindowLengthToNumber(message.windowLength)); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfSpecMetricsQueryRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfSpecMetricsQueryRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfSpecId = WfSpecId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.windowStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.windowLength = metricsWindowLengthFromJSON(reader.int32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfSpecMetricsQueryRequest { - return { - wfSpecId: isSet(object.wfSpecId) ? WfSpecId.fromJSON(object.wfSpecId) : undefined, - windowStart: isSet(object.windowStart) ? globalThis.String(object.windowStart) : undefined, - windowLength: isSet(object.windowLength) - ? metricsWindowLengthFromJSON(object.windowLength) - : MetricsWindowLength.MINUTES_5, - }; - }, - - toJSON(message: WfSpecMetricsQueryRequest): unknown { - const obj: any = {}; - if (message.wfSpecId !== undefined) { - obj.wfSpecId = WfSpecId.toJSON(message.wfSpecId); - } - if (message.windowStart !== undefined) { - obj.windowStart = message.windowStart; - } - if (message.windowLength !== MetricsWindowLength.MINUTES_5) { - obj.windowLength = metricsWindowLengthToJSON(message.windowLength); - } - return obj; - }, - - create, I>>(base?: I): WfSpecMetricsQueryRequest { - return WfSpecMetricsQueryRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfSpecMetricsQueryRequest { - const message = createBaseWfSpecMetricsQueryRequest(); - message.wfSpecId = (object.wfSpecId !== undefined && object.wfSpecId !== null) - ? WfSpecId.fromPartial(object.wfSpecId) - : undefined; - message.windowStart = object.windowStart ?? undefined; - message.windowLength = object.windowLength ?? MetricsWindowLength.MINUTES_5; - return message; - }, -}; - -function createBaseListWfMetricsRequest(): ListWfMetricsRequest { - return { - wfSpecId: undefined, - lastWindowStart: undefined, - windowLength: MetricsWindowLength.MINUTES_5, - numWindows: 0, - }; -} - -export const ListWfMetricsRequest = { - encode(message: ListWfMetricsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfSpecId !== undefined) { - WfSpecId.encode(message.wfSpecId, writer.uint32(10).fork()).ldelim(); - } - if (message.lastWindowStart !== undefined) { - Timestamp.encode(toTimestamp(message.lastWindowStart), writer.uint32(18).fork()).ldelim(); - } - if (message.windowLength !== MetricsWindowLength.MINUTES_5) { - writer.uint32(24).int32(metricsWindowLengthToNumber(message.windowLength)); - } - if (message.numWindows !== 0) { - writer.uint32(32).int32(message.numWindows); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ListWfMetricsRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListWfMetricsRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfSpecId = WfSpecId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.lastWindowStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.windowLength = metricsWindowLengthFromJSON(reader.int32()); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.numWindows = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListWfMetricsRequest { - return { - wfSpecId: isSet(object.wfSpecId) ? WfSpecId.fromJSON(object.wfSpecId) : undefined, - lastWindowStart: isSet(object.lastWindowStart) ? globalThis.String(object.lastWindowStart) : undefined, - windowLength: isSet(object.windowLength) - ? metricsWindowLengthFromJSON(object.windowLength) - : MetricsWindowLength.MINUTES_5, - numWindows: isSet(object.numWindows) ? globalThis.Number(object.numWindows) : 0, - }; - }, - - toJSON(message: ListWfMetricsRequest): unknown { - const obj: any = {}; - if (message.wfSpecId !== undefined) { - obj.wfSpecId = WfSpecId.toJSON(message.wfSpecId); - } - if (message.lastWindowStart !== undefined) { - obj.lastWindowStart = message.lastWindowStart; - } - if (message.windowLength !== MetricsWindowLength.MINUTES_5) { - obj.windowLength = metricsWindowLengthToJSON(message.windowLength); - } - if (message.numWindows !== 0) { - obj.numWindows = Math.round(message.numWindows); - } - return obj; - }, - - create, I>>(base?: I): ListWfMetricsRequest { - return ListWfMetricsRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListWfMetricsRequest { - const message = createBaseListWfMetricsRequest(); - message.wfSpecId = (object.wfSpecId !== undefined && object.wfSpecId !== null) - ? WfSpecId.fromPartial(object.wfSpecId) - : undefined; - message.lastWindowStart = object.lastWindowStart ?? undefined; - message.windowLength = object.windowLength ?? MetricsWindowLength.MINUTES_5; - message.numWindows = object.numWindows ?? 0; - return message; - }, -}; - -function createBaseListWfMetricsResponse(): ListWfMetricsResponse { - return { results: [] }; -} - -export const ListWfMetricsResponse = { - encode(message: ListWfMetricsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - WfSpecMetrics.encode(v!, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ListWfMetricsResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListWfMetricsResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(WfSpecMetrics.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListWfMetricsResponse { - return { - results: globalThis.Array.isArray(object?.results) - ? object.results.map((e: any) => WfSpecMetrics.fromJSON(e)) - : [], - }; - }, - - toJSON(message: ListWfMetricsResponse): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => WfSpecMetrics.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): ListWfMetricsResponse { - return ListWfMetricsResponse.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListWfMetricsResponse { - const message = createBaseListWfMetricsResponse(); - message.results = object.results?.map((e) => WfSpecMetrics.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseTaskDefMetrics(): TaskDefMetrics { - return { - taskDefId: undefined, - windowStart: undefined, - type: MetricsWindowLength.MINUTES_5, - scheduleToStartMax: 0, - scheduleToStartAvg: 0, - startToCompleteMax: 0, - startToCompleteAvg: 0, - totalCompleted: 0, - totalErrored: 0, - totalStarted: 0, - totalScheduled: 0, - }; -} - -export const TaskDefMetrics = { - encode(message: TaskDefMetrics, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskDefId !== undefined) { - TaskDefId.encode(message.taskDefId, writer.uint32(10).fork()).ldelim(); - } - if (message.windowStart !== undefined) { - Timestamp.encode(toTimestamp(message.windowStart), writer.uint32(18).fork()).ldelim(); - } - if (message.type !== MetricsWindowLength.MINUTES_5) { - writer.uint32(24).int32(metricsWindowLengthToNumber(message.type)); - } - if (message.scheduleToStartMax !== 0) { - writer.uint32(32).int64(message.scheduleToStartMax); - } - if (message.scheduleToStartAvg !== 0) { - writer.uint32(40).int64(message.scheduleToStartAvg); - } - if (message.startToCompleteMax !== 0) { - writer.uint32(48).int64(message.startToCompleteMax); - } - if (message.startToCompleteAvg !== 0) { - writer.uint32(56).int64(message.startToCompleteAvg); - } - if (message.totalCompleted !== 0) { - writer.uint32(64).int64(message.totalCompleted); - } - if (message.totalErrored !== 0) { - writer.uint32(72).int64(message.totalErrored); - } - if (message.totalStarted !== 0) { - writer.uint32(80).int64(message.totalStarted); - } - if (message.totalScheduled !== 0) { - writer.uint32(88).int64(message.totalScheduled); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskDefMetrics { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskDefMetrics(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskDefId = TaskDefId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.windowStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.type = metricsWindowLengthFromJSON(reader.int32()); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.scheduleToStartMax = longToNumber(reader.int64() as Long); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.scheduleToStartAvg = longToNumber(reader.int64() as Long); - continue; - case 6: - if (tag !== 48) { - break; - } - - message.startToCompleteMax = longToNumber(reader.int64() as Long); - continue; - case 7: - if (tag !== 56) { - break; - } - - message.startToCompleteAvg = longToNumber(reader.int64() as Long); - continue; - case 8: - if (tag !== 64) { - break; - } - - message.totalCompleted = longToNumber(reader.int64() as Long); - continue; - case 9: - if (tag !== 72) { - break; - } - - message.totalErrored = longToNumber(reader.int64() as Long); - continue; - case 10: - if (tag !== 80) { - break; - } - - message.totalStarted = longToNumber(reader.int64() as Long); - continue; - case 11: - if (tag !== 88) { - break; - } - - message.totalScheduled = longToNumber(reader.int64() as Long); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskDefMetrics { - return { - taskDefId: isSet(object.taskDefId) ? TaskDefId.fromJSON(object.taskDefId) : undefined, - windowStart: isSet(object.windowStart) ? globalThis.String(object.windowStart) : undefined, - type: isSet(object.type) ? metricsWindowLengthFromJSON(object.type) : MetricsWindowLength.MINUTES_5, - scheduleToStartMax: isSet(object.scheduleToStartMax) ? globalThis.Number(object.scheduleToStartMax) : 0, - scheduleToStartAvg: isSet(object.scheduleToStartAvg) ? globalThis.Number(object.scheduleToStartAvg) : 0, - startToCompleteMax: isSet(object.startToCompleteMax) ? globalThis.Number(object.startToCompleteMax) : 0, - startToCompleteAvg: isSet(object.startToCompleteAvg) ? globalThis.Number(object.startToCompleteAvg) : 0, - totalCompleted: isSet(object.totalCompleted) ? globalThis.Number(object.totalCompleted) : 0, - totalErrored: isSet(object.totalErrored) ? globalThis.Number(object.totalErrored) : 0, - totalStarted: isSet(object.totalStarted) ? globalThis.Number(object.totalStarted) : 0, - totalScheduled: isSet(object.totalScheduled) ? globalThis.Number(object.totalScheduled) : 0, - }; - }, - - toJSON(message: TaskDefMetrics): unknown { - const obj: any = {}; - if (message.taskDefId !== undefined) { - obj.taskDefId = TaskDefId.toJSON(message.taskDefId); - } - if (message.windowStart !== undefined) { - obj.windowStart = message.windowStart; - } - if (message.type !== MetricsWindowLength.MINUTES_5) { - obj.type = metricsWindowLengthToJSON(message.type); - } - if (message.scheduleToStartMax !== 0) { - obj.scheduleToStartMax = Math.round(message.scheduleToStartMax); - } - if (message.scheduleToStartAvg !== 0) { - obj.scheduleToStartAvg = Math.round(message.scheduleToStartAvg); - } - if (message.startToCompleteMax !== 0) { - obj.startToCompleteMax = Math.round(message.startToCompleteMax); - } - if (message.startToCompleteAvg !== 0) { - obj.startToCompleteAvg = Math.round(message.startToCompleteAvg); - } - if (message.totalCompleted !== 0) { - obj.totalCompleted = Math.round(message.totalCompleted); - } - if (message.totalErrored !== 0) { - obj.totalErrored = Math.round(message.totalErrored); - } - if (message.totalStarted !== 0) { - obj.totalStarted = Math.round(message.totalStarted); - } - if (message.totalScheduled !== 0) { - obj.totalScheduled = Math.round(message.totalScheduled); - } - return obj; - }, - - create, I>>(base?: I): TaskDefMetrics { - return TaskDefMetrics.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskDefMetrics { - const message = createBaseTaskDefMetrics(); - message.taskDefId = (object.taskDefId !== undefined && object.taskDefId !== null) - ? TaskDefId.fromPartial(object.taskDefId) - : undefined; - message.windowStart = object.windowStart ?? undefined; - message.type = object.type ?? MetricsWindowLength.MINUTES_5; - message.scheduleToStartMax = object.scheduleToStartMax ?? 0; - message.scheduleToStartAvg = object.scheduleToStartAvg ?? 0; - message.startToCompleteMax = object.startToCompleteMax ?? 0; - message.startToCompleteAvg = object.startToCompleteAvg ?? 0; - message.totalCompleted = object.totalCompleted ?? 0; - message.totalErrored = object.totalErrored ?? 0; - message.totalStarted = object.totalStarted ?? 0; - message.totalScheduled = object.totalScheduled ?? 0; - return message; - }, -}; - -function createBaseWfSpecMetrics(): WfSpecMetrics { - return { - wfSpecId: undefined, - windowStart: undefined, - type: MetricsWindowLength.MINUTES_5, - totalStarted: 0, - totalCompleted: 0, - totalErrored: 0, - startToCompleteMax: 0, - startToCompleteAvg: 0, - }; -} - -export const WfSpecMetrics = { - encode(message: WfSpecMetrics, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfSpecId !== undefined) { - WfSpecId.encode(message.wfSpecId, writer.uint32(10).fork()).ldelim(); - } - if (message.windowStart !== undefined) { - Timestamp.encode(toTimestamp(message.windowStart), writer.uint32(18).fork()).ldelim(); - } - if (message.type !== MetricsWindowLength.MINUTES_5) { - writer.uint32(24).int32(metricsWindowLengthToNumber(message.type)); - } - if (message.totalStarted !== 0) { - writer.uint32(32).int64(message.totalStarted); - } - if (message.totalCompleted !== 0) { - writer.uint32(40).int64(message.totalCompleted); - } - if (message.totalErrored !== 0) { - writer.uint32(48).int64(message.totalErrored); - } - if (message.startToCompleteMax !== 0) { - writer.uint32(56).int64(message.startToCompleteMax); - } - if (message.startToCompleteAvg !== 0) { - writer.uint32(64).int64(message.startToCompleteAvg); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfSpecMetrics { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfSpecMetrics(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfSpecId = WfSpecId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.windowStart = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.type = metricsWindowLengthFromJSON(reader.int32()); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.totalStarted = longToNumber(reader.int64() as Long); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.totalCompleted = longToNumber(reader.int64() as Long); - continue; - case 6: - if (tag !== 48) { - break; - } - - message.totalErrored = longToNumber(reader.int64() as Long); - continue; - case 7: - if (tag !== 56) { - break; - } - - message.startToCompleteMax = longToNumber(reader.int64() as Long); - continue; - case 8: - if (tag !== 64) { - break; - } - - message.startToCompleteAvg = longToNumber(reader.int64() as Long); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfSpecMetrics { - return { - wfSpecId: isSet(object.wfSpecId) ? WfSpecId.fromJSON(object.wfSpecId) : undefined, - windowStart: isSet(object.windowStart) ? globalThis.String(object.windowStart) : undefined, - type: isSet(object.type) ? metricsWindowLengthFromJSON(object.type) : MetricsWindowLength.MINUTES_5, - totalStarted: isSet(object.totalStarted) ? globalThis.Number(object.totalStarted) : 0, - totalCompleted: isSet(object.totalCompleted) ? globalThis.Number(object.totalCompleted) : 0, - totalErrored: isSet(object.totalErrored) ? globalThis.Number(object.totalErrored) : 0, - startToCompleteMax: isSet(object.startToCompleteMax) ? globalThis.Number(object.startToCompleteMax) : 0, - startToCompleteAvg: isSet(object.startToCompleteAvg) ? globalThis.Number(object.startToCompleteAvg) : 0, - }; - }, - - toJSON(message: WfSpecMetrics): unknown { - const obj: any = {}; - if (message.wfSpecId !== undefined) { - obj.wfSpecId = WfSpecId.toJSON(message.wfSpecId); - } - if (message.windowStart !== undefined) { - obj.windowStart = message.windowStart; - } - if (message.type !== MetricsWindowLength.MINUTES_5) { - obj.type = metricsWindowLengthToJSON(message.type); - } - if (message.totalStarted !== 0) { - obj.totalStarted = Math.round(message.totalStarted); - } - if (message.totalCompleted !== 0) { - obj.totalCompleted = Math.round(message.totalCompleted); - } - if (message.totalErrored !== 0) { - obj.totalErrored = Math.round(message.totalErrored); - } - if (message.startToCompleteMax !== 0) { - obj.startToCompleteMax = Math.round(message.startToCompleteMax); - } - if (message.startToCompleteAvg !== 0) { - obj.startToCompleteAvg = Math.round(message.startToCompleteAvg); - } - return obj; - }, - - create, I>>(base?: I): WfSpecMetrics { - return WfSpecMetrics.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfSpecMetrics { - const message = createBaseWfSpecMetrics(); - message.wfSpecId = (object.wfSpecId !== undefined && object.wfSpecId !== null) - ? WfSpecId.fromPartial(object.wfSpecId) - : undefined; - message.windowStart = object.windowStart ?? undefined; - message.type = object.type ?? MetricsWindowLength.MINUTES_5; - message.totalStarted = object.totalStarted ?? 0; - message.totalCompleted = object.totalCompleted ?? 0; - message.totalErrored = object.totalErrored ?? 0; - message.startToCompleteMax = object.startToCompleteMax ?? 0; - message.startToCompleteAvg = object.startToCompleteAvg ?? 0; - return message; - }, -}; - -function createBaseListUserTaskRunRequest(): ListUserTaskRunRequest { - return { wfRunId: undefined }; -} - -export const ListUserTaskRunRequest = { - encode(message: ListUserTaskRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ListUserTaskRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListUserTaskRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListUserTaskRunRequest { - return { wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined }; - }, - - toJSON(message: ListUserTaskRunRequest): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - return obj; - }, - - create, I>>(base?: I): ListUserTaskRunRequest { - return ListUserTaskRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListUserTaskRunRequest { - const message = createBaseListUserTaskRunRequest(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - return message; - }, -}; - -function createBaseUserTaskRunList(): UserTaskRunList { - return { results: [] }; -} - -export const UserTaskRunList = { - encode(message: UserTaskRunList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - UserTaskRun.encode(v!, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskRunList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskRunList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(UserTaskRun.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskRunList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => UserTaskRun.fromJSON(e)) : [], - }; - }, - - toJSON(message: UserTaskRunList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => UserTaskRun.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): UserTaskRunList { - return UserTaskRunList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskRunList { - const message = createBaseUserTaskRunList(); - message.results = object.results?.map((e) => UserTaskRun.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseListTaskRunsRequest(): ListTaskRunsRequest { - return { wfRunId: undefined }; -} - -export const ListTaskRunsRequest = { - encode(message: ListTaskRunsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfRunId !== undefined) { - WfRunId.encode(message.wfRunId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ListTaskRunsRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListTaskRunsRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfRunId = WfRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListTaskRunsRequest { - return { wfRunId: isSet(object.wfRunId) ? WfRunId.fromJSON(object.wfRunId) : undefined }; - }, - - toJSON(message: ListTaskRunsRequest): unknown { - const obj: any = {}; - if (message.wfRunId !== undefined) { - obj.wfRunId = WfRunId.toJSON(message.wfRunId); - } - return obj; - }, - - create, I>>(base?: I): ListTaskRunsRequest { - return ListTaskRunsRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListTaskRunsRequest { - const message = createBaseListTaskRunsRequest(); - message.wfRunId = (object.wfRunId !== undefined && object.wfRunId !== null) - ? WfRunId.fromPartial(object.wfRunId) - : undefined; - return message; - }, -}; - -function createBaseTaskRunList(): TaskRunList { - return { results: [] }; -} - -export const TaskRunList = { - encode(message: TaskRunList, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.results) { - TaskRun.encode(v!, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskRunList { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskRunList(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.results.push(TaskRun.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskRunList { - return { - results: globalThis.Array.isArray(object?.results) ? object.results.map((e: any) => TaskRun.fromJSON(e)) : [], - }; - }, - - toJSON(message: TaskRunList): unknown { - const obj: any = {}; - if (message.results?.length) { - obj.results = message.results.map((e) => TaskRun.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): TaskRunList { - return TaskRunList.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskRunList { - const message = createBaseTaskRunList(); - message.results = object.results?.map((e) => TaskRun.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseMigrateWfSpecRequest(): MigrateWfSpecRequest { - return { oldWfSpec: undefined, migration: undefined }; -} - -export const MigrateWfSpecRequest = { - encode(message: MigrateWfSpecRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.oldWfSpec !== undefined) { - WfSpecId.encode(message.oldWfSpec, writer.uint32(10).fork()).ldelim(); - } - if (message.migration !== undefined) { - WfSpecVersionMigration.encode(message.migration, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): MigrateWfSpecRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseMigrateWfSpecRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.oldWfSpec = WfSpecId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.migration = WfSpecVersionMigration.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): MigrateWfSpecRequest { - return { - oldWfSpec: isSet(object.oldWfSpec) ? WfSpecId.fromJSON(object.oldWfSpec) : undefined, - migration: isSet(object.migration) ? WfSpecVersionMigration.fromJSON(object.migration) : undefined, - }; - }, - - toJSON(message: MigrateWfSpecRequest): unknown { - const obj: any = {}; - if (message.oldWfSpec !== undefined) { - obj.oldWfSpec = WfSpecId.toJSON(message.oldWfSpec); - } - if (message.migration !== undefined) { - obj.migration = WfSpecVersionMigration.toJSON(message.migration); - } - return obj; - }, - - create, I>>(base?: I): MigrateWfSpecRequest { - return MigrateWfSpecRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): MigrateWfSpecRequest { - const message = createBaseMigrateWfSpecRequest(); - message.oldWfSpec = (object.oldWfSpec !== undefined && object.oldWfSpec !== null) - ? WfSpecId.fromPartial(object.oldWfSpec) - : undefined; - message.migration = (object.migration !== undefined && object.migration !== null) - ? WfSpecVersionMigration.fromPartial(object.migration) - : undefined; - return message; - }, -}; - -function createBaseGetLatestWfSpecRequest(): GetLatestWfSpecRequest { - return { name: "", majorVersion: undefined }; -} - -export const GetLatestWfSpecRequest = { - encode(message: GetLatestWfSpecRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - if (message.majorVersion !== undefined) { - writer.uint32(16).int32(message.majorVersion); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): GetLatestWfSpecRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGetLatestWfSpecRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.majorVersion = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): GetLatestWfSpecRequest { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - majorVersion: isSet(object.majorVersion) ? globalThis.Number(object.majorVersion) : undefined, - }; - }, - - toJSON(message: GetLatestWfSpecRequest): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.majorVersion !== undefined) { - obj.majorVersion = Math.round(message.majorVersion); - } - return obj; - }, - - create, I>>(base?: I): GetLatestWfSpecRequest { - return GetLatestWfSpecRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): GetLatestWfSpecRequest { - const message = createBaseGetLatestWfSpecRequest(); - message.name = object.name ?? ""; - message.majorVersion = object.majorVersion ?? undefined; - return message; - }, -}; - -function createBaseServerVersionResponse(): ServerVersionResponse { - return { majorVersion: 0, minorVersion: 0, patchVersion: 0, preReleaseIdentifier: undefined }; -} - -export const ServerVersionResponse = { - encode(message: ServerVersionResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.majorVersion !== 0) { - writer.uint32(8).int32(message.majorVersion); - } - if (message.minorVersion !== 0) { - writer.uint32(16).int32(message.minorVersion); - } - if (message.patchVersion !== 0) { - writer.uint32(24).int32(message.patchVersion); - } - if (message.preReleaseIdentifier !== undefined) { - writer.uint32(34).string(message.preReleaseIdentifier); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ServerVersionResponse { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseServerVersionResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.majorVersion = reader.int32(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.minorVersion = reader.int32(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.patchVersion = reader.int32(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.preReleaseIdentifier = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ServerVersionResponse { - return { - majorVersion: isSet(object.majorVersion) ? globalThis.Number(object.majorVersion) : 0, - minorVersion: isSet(object.minorVersion) ? globalThis.Number(object.minorVersion) : 0, - patchVersion: isSet(object.patchVersion) ? globalThis.Number(object.patchVersion) : 0, - preReleaseIdentifier: isSet(object.preReleaseIdentifier) - ? globalThis.String(object.preReleaseIdentifier) - : undefined, - }; - }, - - toJSON(message: ServerVersionResponse): unknown { - const obj: any = {}; - if (message.majorVersion !== 0) { - obj.majorVersion = Math.round(message.majorVersion); - } - if (message.minorVersion !== 0) { - obj.minorVersion = Math.round(message.minorVersion); - } - if (message.patchVersion !== 0) { - obj.patchVersion = Math.round(message.patchVersion); - } - if (message.preReleaseIdentifier !== undefined) { - obj.preReleaseIdentifier = message.preReleaseIdentifier; - } - return obj; - }, - - create, I>>(base?: I): ServerVersionResponse { - return ServerVersionResponse.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ServerVersionResponse { - const message = createBaseServerVersionResponse(); - message.majorVersion = object.majorVersion ?? 0; - message.minorVersion = object.minorVersion ?? 0; - message.patchVersion = object.patchVersion ?? 0; - message.preReleaseIdentifier = object.preReleaseIdentifier ?? undefined; - return message; - }, -}; - -export type LittleHorseDefinition = typeof LittleHorseDefinition; -export const LittleHorseDefinition = { - name: "LittleHorse", - fullName: "littlehorse.LittleHorse", - methods: { - /** Creates a TaskDef. */ - putTaskDef: { - name: "PutTaskDef", - requestType: PutTaskDefRequest, - requestStream: false, - responseType: TaskDef, - responseStream: false, - options: {}, - }, - /** Gets a TaskDef. */ - getTaskDef: { - name: "GetTaskDef", - requestType: TaskDefId, - requestStream: false, - responseType: TaskDef, - responseStream: false, - options: {}, - }, - /** Creates an ExternalEventDef. */ - putExternalEventDef: { - name: "PutExternalEventDef", - requestType: PutExternalEventDefRequest, - requestStream: false, - responseType: ExternalEventDef, - responseStream: false, - options: {}, - }, - /** Gets an ExternalEventDef. */ - getExternalEventDef: { - name: "GetExternalEventDef", - requestType: ExternalEventDefId, - requestStream: false, - responseType: ExternalEventDef, - responseStream: false, - options: {}, - }, - /** EXPERIMENTAL: Creates a WorkflowEventDef. */ - putWorkflowEventDef: { - name: "PutWorkflowEventDef", - requestType: PutWorkflowEventDefRequest, - requestStream: false, - responseType: WorkflowEventDef, - responseStream: false, - options: {}, - }, - /** Creates a WfSpec. */ - putWfSpec: { - name: "PutWfSpec", - requestType: PutWfSpecRequest, - requestStream: false, - responseType: WfSpec, - responseStream: false, - options: {}, - }, - /** Gets a WfSpec. */ - getWfSpec: { - name: "GetWfSpec", - requestType: WfSpecId, - requestStream: false, - responseType: WfSpec, - responseStream: false, - options: {}, - }, - /** Returns the latest WfSpec with a specified name (and optionally a specified Major Version). */ - getLatestWfSpec: { - name: "GetLatestWfSpec", - requestType: GetLatestWfSpecRequest, - requestStream: false, - responseType: WfSpec, - responseStream: false, - options: {}, - }, - /** - * EXPERIMENTAL: Migrates all WfRun's from one version of a WfSpec onto a newer version of the - * same WfSpec. This is useful for long-running WfRun's (eg. a 60-day marketing campaign) where - * you must update WfRun's that are in the RUNNING state rather than allowing them to run to - * completion. - * - * As of 0.7.2, this feature is only partially implemented. - */ - migrateWfSpec: { - name: "MigrateWfSpec", - requestType: MigrateWfSpecRequest, - requestStream: false, - responseType: WfSpec, - responseStream: false, - options: {}, - }, - /** Creates a UserTaskDef. */ - putUserTaskDef: { - name: "PutUserTaskDef", - requestType: PutUserTaskDefRequest, - requestStream: false, - responseType: UserTaskDef, - responseStream: false, - options: {}, - }, - /** - * Gets a specific UserTaskDef. - * - * This RPC is highly useful for applications built around - * User Tasks. For example, a UI that dynamically displays form fields based on the User Task - * might first receive a UserTaskRun, then use that UserTaskRun to look up the UserTaskDef. - * The frontend would inspect the UserTaskDef and display a form field on the browser page - * for each field in the UserTaskDef. - */ - getUserTaskDef: { - name: "GetUserTaskDef", - requestType: UserTaskDefId, - requestStream: false, - responseType: UserTaskDef, - responseStream: false, - options: {}, - }, - /** Returns the most recent UserTaskDef with a specific name. */ - getLatestUserTaskDef: { - name: "GetLatestUserTaskDef", - requestType: GetLatestUserTaskDefRequest, - requestStream: false, - responseType: UserTaskDef, - responseStream: false, - options: {}, - }, - /** Runs a WfSpec to create a WfRun. */ - runWf: { - name: "RunWf", - requestType: RunWfRequest, - requestStream: false, - responseType: WfRun, - responseStream: false, - options: {}, - }, - /** - * Gets a WfRun. Although useful for development and debugging, this RPC is not often - * used by applications. - */ - getWfRun: { - name: "GetWfRun", - requestType: WfRunId, - requestStream: false, - responseType: WfRun, - responseStream: false, - options: {}, - }, - /** - * Loads a specific UserTaskRun. It includes information about to whom the UserTask is - * currently assigned, history of assignments and reassignments, and any context for that - * UserTaskRun which is specific to the WfRun. - */ - getUserTaskRun: { - name: "GetUserTaskRun", - requestType: UserTaskRunId, - requestStream: false, - responseType: UserTaskRun, - responseStream: false, - options: {}, - }, - /** - * Change the ownership of a UserTaskRun to a new userId, userGroup, or both. The - * action will be reflected in your next call to SearchUserTaskRun. This RPC is useful for - * applications that are using User Tasks to build an internal task-list and wish to - * administer the tasks. - */ - assignUserTaskRun: { - name: "AssignUserTaskRun", - requestType: AssignUserTaskRunRequest, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** - * Completes a UserTaskRun. Includes the results of the UserTaskRun, the UserTaskRun Id, and - * the userId of the user who completes the UserTaskRun. Results in the UserTask NodeRun being - * completed, and unblocks the associated ThreadRun in the WfRun. - * - * This RPC is highly useful for applications built around a WfSpec that uses USER_TASK nodes. - */ - completeUserTaskRun: { - name: "CompleteUserTaskRun", - requestType: CompleteUserTaskRunRequest, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** Cancels a UserTaskRun. This will result in an EXCEPTION being propagated to the WfRun. */ - cancelUserTaskRun: { - name: "CancelUserTaskRun", - requestType: CancelUserTaskRunRequest, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** - * Lists all UserTaskRun's for a specific WfRun. Can be useful when using a WfRun - * to model an entity. - */ - listUserTaskRuns: { - name: "ListUserTaskRuns", - requestType: ListUserTaskRunRequest, - requestStream: false, - responseType: UserTaskRunList, - responseStream: false, - options: {}, - }, - /** Gets a specific NodeRun. */ - getNodeRun: { - name: "GetNodeRun", - requestType: NodeRunId, - requestStream: false, - responseType: NodeRun, - responseStream: false, - options: {}, - }, - /** Lists all NodeRun's for a specific WfRun. */ - listNodeRuns: { - name: "ListNodeRuns", - requestType: ListNodeRunsRequest, - requestStream: false, - responseType: NodeRunList, - responseStream: false, - options: {}, - }, - /** Gets a specific TaskRun. */ - getTaskRun: { - name: "GetTaskRun", - requestType: TaskRunId, - requestStream: false, - responseType: TaskRun, - responseStream: false, - options: {}, - }, - /** Lists all TaskRun's for a specific WfRun. */ - listTaskRuns: { - name: "ListTaskRuns", - requestType: ListTaskRunsRequest, - requestStream: false, - responseType: TaskRunList, - responseStream: false, - options: {}, - }, - /** - * Get the value of a specific Variable. When using a WfRun to model an entity, this - * RPC is useful for retrieving information. It is equivalent to looking up the value of a - * column for a specific row in a SQL table. - */ - getVariable: { - name: "GetVariable", - requestType: VariableId, - requestStream: false, - responseType: Variable, - responseStream: false, - options: {}, - }, - /** List all Variables from a WfRun. */ - listVariables: { - name: "ListVariables", - requestType: ListVariablesRequest, - requestStream: false, - responseType: VariableList, - responseStream: false, - options: {}, - }, - /** Post an ExternalEvent. This RPC is highly useful for */ - putExternalEvent: { - name: "PutExternalEvent", - requestType: PutExternalEventRequest, - requestStream: false, - responseType: ExternalEvent, - responseStream: false, - options: {}, - }, - /** Get a specific ExternalEvent. */ - getExternalEvent: { - name: "GetExternalEvent", - requestType: ExternalEventId, - requestStream: false, - responseType: ExternalEvent, - responseStream: false, - options: {}, - }, - /** - * Waits for a WorkflowEvent to be thrown by a given WfRun. Returns immediately if a matching - * WorkflowEvent has already been thrown; throws a DEADLINE_EXCEEDED error if the WorkflowEvent - * is not thrown before the deadline specified by the client. - * - * To specify the deadline, the client should use GRPC deadlines. - */ - awaitWorkflowEvent: { - name: "AwaitWorkflowEvent", - requestType: AwaitWorkflowEventRequest, - requestStream: false, - responseType: WorkflowEvent, - responseStream: false, - options: {}, - }, - /** List ExternalEvent's for a specific WfRun. */ - listExternalEvents: { - name: "ListExternalEvents", - requestType: ListExternalEventsRequest, - requestStream: false, - responseType: ExternalEventList, - responseStream: false, - options: {}, - }, - /** - * Search for WfRun's. This RPC is highly useful for applications that store data - * in LittleHorse and need to find a specific WfRun based on certain indexed fields. - */ - searchWfRun: { - name: "SearchWfRun", - requestType: SearchWfRunRequest, - requestStream: false, - responseType: WfRunIdList, - responseStream: false, - options: {}, - }, - /** - * Search for NodeRun's. This RPC is useful for monitoring and finding bugs in - * your workflows or Task Workers. - */ - searchNodeRun: { - name: "SearchNodeRun", - requestType: SearchNodeRunRequest, - requestStream: false, - responseType: NodeRunIdList, - responseStream: false, - options: {}, - }, - /** Search for TaskRun's. This RPC is useful for finding bugs in your Task Workers. */ - searchTaskRun: { - name: "SearchTaskRun", - requestType: SearchTaskRunRequest, - requestStream: false, - responseType: TaskRunIdList, - responseStream: false, - options: {}, - }, - /** - * Search for UserTaskRun's. This RPC is highly useful for applications that connect - * human end-users to LittleHorse: it enables you to find all tasks assigned to a specific - * person or group of people. - */ - searchUserTaskRun: { - name: "SearchUserTaskRun", - requestType: SearchUserTaskRunRequest, - requestStream: false, - responseType: UserTaskRunIdList, - responseStream: false, - options: {}, - }, - /** - * Search for Variable's. This RPC is highly useful for applications that store data - * in LittleHorse and need to find a specific WfRun based on certain indexed fields. - */ - searchVariable: { - name: "SearchVariable", - requestType: SearchVariableRequest, - requestStream: false, - responseType: VariableIdList, - responseStream: false, - options: {}, - }, - /** Search for ExternalEvent's. */ - searchExternalEvent: { - name: "SearchExternalEvent", - requestType: SearchExternalEventRequest, - requestStream: false, - responseType: ExternalEventIdList, - responseStream: false, - options: {}, - }, - /** Search for TaskDef's. */ - searchTaskDef: { - name: "SearchTaskDef", - requestType: SearchTaskDefRequest, - requestStream: false, - responseType: TaskDefIdList, - responseStream: false, - options: {}, - }, - /** Search for UserTaskDef's. */ - searchUserTaskDef: { - name: "SearchUserTaskDef", - requestType: SearchUserTaskDefRequest, - requestStream: false, - responseType: UserTaskDefIdList, - responseStream: false, - options: {}, - }, - /** Search for WfSpec's. */ - searchWfSpec: { - name: "SearchWfSpec", - requestType: SearchWfSpecRequest, - requestStream: false, - responseType: WfSpecIdList, - responseStream: false, - options: {}, - }, - /** Search for ExternalEventDef's. */ - searchExternalEventDef: { - name: "SearchExternalEventDef", - requestType: SearchExternalEventDefRequest, - requestStream: false, - responseType: ExternalEventDefIdList, - responseStream: false, - options: {}, - }, - /** Search for all available TenantIds for current Principal */ - searchTenant: { - name: "SearchTenant", - requestType: SearchTenantRequest, - requestStream: false, - responseType: TenantIdList, - responseStream: false, - options: {}, - }, - /** - * Used by the Task Worker to: - * 1. Tell the LH Server that the Task Worker has joined the Task Worker Group. - * 2. Receive the assignemnt of LH Server's to poll from. - * Generally, you won't use this request manually. - */ - registerTaskWorker: { - name: "RegisterTaskWorker", - requestType: RegisterTaskWorkerRequest, - requestStream: false, - responseType: RegisterTaskWorkerResponse, - responseStream: false, - options: {}, - }, - /** - * Used by Task Workers to listen for TaskRuns on the Task Queue. Generally, you won't - * use this RPC manually. - */ - pollTask: { - name: "PollTask", - requestType: PollTaskRequest, - requestStream: true, - responseType: PollTaskResponse, - responseStream: true, - options: {}, - }, - /** - * Used by Task Workers to report the result of a TaskRun. Generally, you won't use - * this rpc manually. - */ - reportTask: { - name: "ReportTask", - requestType: ReportTaskRun, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** Move a WfRun or a specific ThreadRun in that WfRun to the HALTED state. */ - stopWfRun: { - name: "StopWfRun", - requestType: StopWfRunRequest, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** Resumes a WfRun or a specific ThreadRun of a WfRun. */ - resumeWfRun: { - name: "ResumeWfRun", - requestType: ResumeWfRunRequest, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** Deletes a WfRun. The WfRun cannot be in the RUNNING state. */ - deleteWfRun: { - name: "DeleteWfRun", - requestType: DeleteWfRunRequest, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** Deletes a TaskDef. */ - deleteTaskDef: { - name: "DeleteTaskDef", - requestType: DeleteTaskDefRequest, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** Deletes a WfSpec. */ - deleteWfSpec: { - name: "DeleteWfSpec", - requestType: DeleteWfSpecRequest, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** Deletes a UserTaskDef. */ - deleteUserTaskDef: { - name: "DeleteUserTaskDef", - requestType: DeleteUserTaskDefRequest, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** Deletes an ExternalEventDef. */ - deleteExternalEventDef: { - name: "DeleteExternalEventDef", - requestType: DeleteExternalEventDefRequest, - requestStream: false, - responseType: Empty, - responseStream: false, - options: {}, - }, - /** Returns TaskDef Metrics for a specific TaskDef and a specific time window. */ - getTaskDefMetricsWindow: { - name: "GetTaskDefMetricsWindow", - requestType: TaskDefMetricsQueryRequest, - requestStream: false, - responseType: TaskDefMetrics, - responseStream: false, - options: {}, - }, - /** Returns WfSpec Metrics for a specific WfSpec and a specific time window. */ - getWfSpecMetricsWindow: { - name: "GetWfSpecMetricsWindow", - requestType: WfSpecMetricsQueryRequest, - requestStream: false, - responseType: WfSpecMetrics, - responseStream: false, - options: {}, - }, - /** Returns a list of TaskDef Metrics Windows. */ - listTaskDefMetrics: { - name: "ListTaskDefMetrics", - requestType: ListTaskMetricsRequest, - requestStream: false, - responseType: ListTaskMetricsResponse, - responseStream: false, - options: {}, - }, - /** Returns a list of WfSpec Metrics Windows. */ - listWfSpecMetrics: { - name: "ListWfSpecMetrics", - requestType: ListWfMetricsRequest, - requestStream: false, - responseType: ListWfMetricsResponse, - responseStream: false, - options: {}, - }, - /** EXPERIMENTAL: Creates another Tenant in the LH Server. */ - putTenant: { - name: "PutTenant", - requestType: PutTenantRequest, - requestStream: false, - responseType: Tenant, - responseStream: false, - options: {}, - }, - /** EXPERIMENTAL: Creates an Principal. */ - putPrincipal: { - name: "PutPrincipal", - requestType: PutPrincipalRequest, - requestStream: false, - responseType: Principal, - responseStream: false, - options: {}, - }, - /** Returns the Principal of the caller. */ - whoami: { - name: "Whoami", - requestType: Empty, - requestStream: false, - responseType: Principal, - responseStream: false, - options: {}, - }, - /** Gets the version of the LH Server. */ - getServerVersion: { - name: "GetServerVersion", - requestType: Empty, - requestStream: false, - responseType: ServerVersionResponse, - responseStream: false, - options: {}, - }, - }, -} as const; - -export interface LittleHorseServiceImplementation { - /** Creates a TaskDef. */ - putTaskDef(request: PutTaskDefRequest, context: CallContext & CallContextExt): Promise>; - /** Gets a TaskDef. */ - getTaskDef(request: TaskDefId, context: CallContext & CallContextExt): Promise>; - /** Creates an ExternalEventDef. */ - putExternalEventDef( - request: PutExternalEventDefRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Gets an ExternalEventDef. */ - getExternalEventDef( - request: ExternalEventDefId, - context: CallContext & CallContextExt, - ): Promise>; - /** EXPERIMENTAL: Creates a WorkflowEventDef. */ - putWorkflowEventDef( - request: PutWorkflowEventDefRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Creates a WfSpec. */ - putWfSpec(request: PutWfSpecRequest, context: CallContext & CallContextExt): Promise>; - /** Gets a WfSpec. */ - getWfSpec(request: WfSpecId, context: CallContext & CallContextExt): Promise>; - /** Returns the latest WfSpec with a specified name (and optionally a specified Major Version). */ - getLatestWfSpec(request: GetLatestWfSpecRequest, context: CallContext & CallContextExt): Promise>; - /** - * EXPERIMENTAL: Migrates all WfRun's from one version of a WfSpec onto a newer version of the - * same WfSpec. This is useful for long-running WfRun's (eg. a 60-day marketing campaign) where - * you must update WfRun's that are in the RUNNING state rather than allowing them to run to - * completion. - * - * As of 0.7.2, this feature is only partially implemented. - */ - migrateWfSpec(request: MigrateWfSpecRequest, context: CallContext & CallContextExt): Promise>; - /** Creates a UserTaskDef. */ - putUserTaskDef( - request: PutUserTaskDefRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** - * Gets a specific UserTaskDef. - * - * This RPC is highly useful for applications built around - * User Tasks. For example, a UI that dynamically displays form fields based on the User Task - * might first receive a UserTaskRun, then use that UserTaskRun to look up the UserTaskDef. - * The frontend would inspect the UserTaskDef and display a form field on the browser page - * for each field in the UserTaskDef. - */ - getUserTaskDef(request: UserTaskDefId, context: CallContext & CallContextExt): Promise>; - /** Returns the most recent UserTaskDef with a specific name. */ - getLatestUserTaskDef( - request: GetLatestUserTaskDefRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Runs a WfSpec to create a WfRun. */ - runWf(request: RunWfRequest, context: CallContext & CallContextExt): Promise>; - /** - * Gets a WfRun. Although useful for development and debugging, this RPC is not often - * used by applications. - */ - getWfRun(request: WfRunId, context: CallContext & CallContextExt): Promise>; - /** - * Loads a specific UserTaskRun. It includes information about to whom the UserTask is - * currently assigned, history of assignments and reassignments, and any context for that - * UserTaskRun which is specific to the WfRun. - */ - getUserTaskRun(request: UserTaskRunId, context: CallContext & CallContextExt): Promise>; - /** - * Change the ownership of a UserTaskRun to a new userId, userGroup, or both. The - * action will be reflected in your next call to SearchUserTaskRun. This RPC is useful for - * applications that are using User Tasks to build an internal task-list and wish to - * administer the tasks. - */ - assignUserTaskRun( - request: AssignUserTaskRunRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** - * Completes a UserTaskRun. Includes the results of the UserTaskRun, the UserTaskRun Id, and - * the userId of the user who completes the UserTaskRun. Results in the UserTask NodeRun being - * completed, and unblocks the associated ThreadRun in the WfRun. - * - * This RPC is highly useful for applications built around a WfSpec that uses USER_TASK nodes. - */ - completeUserTaskRun( - request: CompleteUserTaskRunRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Cancels a UserTaskRun. This will result in an EXCEPTION being propagated to the WfRun. */ - cancelUserTaskRun( - request: CancelUserTaskRunRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** - * Lists all UserTaskRun's for a specific WfRun. Can be useful when using a WfRun - * to model an entity. - */ - listUserTaskRuns( - request: ListUserTaskRunRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Gets a specific NodeRun. */ - getNodeRun(request: NodeRunId, context: CallContext & CallContextExt): Promise>; - /** Lists all NodeRun's for a specific WfRun. */ - listNodeRuns(request: ListNodeRunsRequest, context: CallContext & CallContextExt): Promise>; - /** Gets a specific TaskRun. */ - getTaskRun(request: TaskRunId, context: CallContext & CallContextExt): Promise>; - /** Lists all TaskRun's for a specific WfRun. */ - listTaskRuns(request: ListTaskRunsRequest, context: CallContext & CallContextExt): Promise>; - /** - * Get the value of a specific Variable. When using a WfRun to model an entity, this - * RPC is useful for retrieving information. It is equivalent to looking up the value of a - * column for a specific row in a SQL table. - */ - getVariable(request: VariableId, context: CallContext & CallContextExt): Promise>; - /** List all Variables from a WfRun. */ - listVariables( - request: ListVariablesRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Post an ExternalEvent. This RPC is highly useful for */ - putExternalEvent( - request: PutExternalEventRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Get a specific ExternalEvent. */ - getExternalEvent( - request: ExternalEventId, - context: CallContext & CallContextExt, - ): Promise>; - /** - * Waits for a WorkflowEvent to be thrown by a given WfRun. Returns immediately if a matching - * WorkflowEvent has already been thrown; throws a DEADLINE_EXCEEDED error if the WorkflowEvent - * is not thrown before the deadline specified by the client. - * - * To specify the deadline, the client should use GRPC deadlines. - */ - awaitWorkflowEvent( - request: AwaitWorkflowEventRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** List ExternalEvent's for a specific WfRun. */ - listExternalEvents( - request: ListExternalEventsRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** - * Search for WfRun's. This RPC is highly useful for applications that store data - * in LittleHorse and need to find a specific WfRun based on certain indexed fields. - */ - searchWfRun(request: SearchWfRunRequest, context: CallContext & CallContextExt): Promise>; - /** - * Search for NodeRun's. This RPC is useful for monitoring and finding bugs in - * your workflows or Task Workers. - */ - searchNodeRun( - request: SearchNodeRunRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Search for TaskRun's. This RPC is useful for finding bugs in your Task Workers. */ - searchTaskRun( - request: SearchTaskRunRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** - * Search for UserTaskRun's. This RPC is highly useful for applications that connect - * human end-users to LittleHorse: it enables you to find all tasks assigned to a specific - * person or group of people. - */ - searchUserTaskRun( - request: SearchUserTaskRunRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** - * Search for Variable's. This RPC is highly useful for applications that store data - * in LittleHorse and need to find a specific WfRun based on certain indexed fields. - */ - searchVariable( - request: SearchVariableRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Search for ExternalEvent's. */ - searchExternalEvent( - request: SearchExternalEventRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Search for TaskDef's. */ - searchTaskDef( - request: SearchTaskDefRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Search for UserTaskDef's. */ - searchUserTaskDef( - request: SearchUserTaskDefRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Search for WfSpec's. */ - searchWfSpec(request: SearchWfSpecRequest, context: CallContext & CallContextExt): Promise>; - /** Search for ExternalEventDef's. */ - searchExternalEventDef( - request: SearchExternalEventDefRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Search for all available TenantIds for current Principal */ - searchTenant(request: SearchTenantRequest, context: CallContext & CallContextExt): Promise>; - /** - * Used by the Task Worker to: - * 1. Tell the LH Server that the Task Worker has joined the Task Worker Group. - * 2. Receive the assignemnt of LH Server's to poll from. - * Generally, you won't use this request manually. - */ - registerTaskWorker( - request: RegisterTaskWorkerRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** - * Used by Task Workers to listen for TaskRuns on the Task Queue. Generally, you won't - * use this RPC manually. - */ - pollTask( - request: AsyncIterable, - context: CallContext & CallContextExt, - ): ServerStreamingMethodResult>; - /** - * Used by Task Workers to report the result of a TaskRun. Generally, you won't use - * this rpc manually. - */ - reportTask(request: ReportTaskRun, context: CallContext & CallContextExt): Promise>; - /** Move a WfRun or a specific ThreadRun in that WfRun to the HALTED state. */ - stopWfRun(request: StopWfRunRequest, context: CallContext & CallContextExt): Promise>; - /** Resumes a WfRun or a specific ThreadRun of a WfRun. */ - resumeWfRun(request: ResumeWfRunRequest, context: CallContext & CallContextExt): Promise>; - /** Deletes a WfRun. The WfRun cannot be in the RUNNING state. */ - deleteWfRun(request: DeleteWfRunRequest, context: CallContext & CallContextExt): Promise>; - /** Deletes a TaskDef. */ - deleteTaskDef(request: DeleteTaskDefRequest, context: CallContext & CallContextExt): Promise>; - /** Deletes a WfSpec. */ - deleteWfSpec(request: DeleteWfSpecRequest, context: CallContext & CallContextExt): Promise>; - /** Deletes a UserTaskDef. */ - deleteUserTaskDef( - request: DeleteUserTaskDefRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Deletes an ExternalEventDef. */ - deleteExternalEventDef( - request: DeleteExternalEventDefRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Returns TaskDef Metrics for a specific TaskDef and a specific time window. */ - getTaskDefMetricsWindow( - request: TaskDefMetricsQueryRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Returns WfSpec Metrics for a specific WfSpec and a specific time window. */ - getWfSpecMetricsWindow( - request: WfSpecMetricsQueryRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Returns a list of TaskDef Metrics Windows. */ - listTaskDefMetrics( - request: ListTaskMetricsRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** Returns a list of WfSpec Metrics Windows. */ - listWfSpecMetrics( - request: ListWfMetricsRequest, - context: CallContext & CallContextExt, - ): Promise>; - /** EXPERIMENTAL: Creates another Tenant in the LH Server. */ - putTenant(request: PutTenantRequest, context: CallContext & CallContextExt): Promise>; - /** EXPERIMENTAL: Creates an Principal. */ - putPrincipal(request: PutPrincipalRequest, context: CallContext & CallContextExt): Promise>; - /** Returns the Principal of the caller. */ - whoami(request: Empty, context: CallContext & CallContextExt): Promise>; - /** Gets the version of the LH Server. */ - getServerVersion(request: Empty, context: CallContext & CallContextExt): Promise>; -} - -export interface LittleHorseClient { - /** Creates a TaskDef. */ - putTaskDef(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Gets a TaskDef. */ - getTaskDef(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Creates an ExternalEventDef. */ - putExternalEventDef( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Gets an ExternalEventDef. */ - getExternalEventDef( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** EXPERIMENTAL: Creates a WorkflowEventDef. */ - putWorkflowEventDef( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Creates a WfSpec. */ - putWfSpec(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Gets a WfSpec. */ - getWfSpec(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Returns the latest WfSpec with a specified name (and optionally a specified Major Version). */ - getLatestWfSpec( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** - * EXPERIMENTAL: Migrates all WfRun's from one version of a WfSpec onto a newer version of the - * same WfSpec. This is useful for long-running WfRun's (eg. a 60-day marketing campaign) where - * you must update WfRun's that are in the RUNNING state rather than allowing them to run to - * completion. - * - * As of 0.7.2, this feature is only partially implemented. - */ - migrateWfSpec(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Creates a UserTaskDef. */ - putUserTaskDef( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** - * Gets a specific UserTaskDef. - * - * This RPC is highly useful for applications built around - * User Tasks. For example, a UI that dynamically displays form fields based on the User Task - * might first receive a UserTaskRun, then use that UserTaskRun to look up the UserTaskDef. - * The frontend would inspect the UserTaskDef and display a form field on the browser page - * for each field in the UserTaskDef. - */ - getUserTaskDef(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Returns the most recent UserTaskDef with a specific name. */ - getLatestUserTaskDef( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Runs a WfSpec to create a WfRun. */ - runWf(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** - * Gets a WfRun. Although useful for development and debugging, this RPC is not often - * used by applications. - */ - getWfRun(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** - * Loads a specific UserTaskRun. It includes information about to whom the UserTask is - * currently assigned, history of assignments and reassignments, and any context for that - * UserTaskRun which is specific to the WfRun. - */ - getUserTaskRun(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** - * Change the ownership of a UserTaskRun to a new userId, userGroup, or both. The - * action will be reflected in your next call to SearchUserTaskRun. This RPC is useful for - * applications that are using User Tasks to build an internal task-list and wish to - * administer the tasks. - */ - assignUserTaskRun( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** - * Completes a UserTaskRun. Includes the results of the UserTaskRun, the UserTaskRun Id, and - * the userId of the user who completes the UserTaskRun. Results in the UserTask NodeRun being - * completed, and unblocks the associated ThreadRun in the WfRun. - * - * This RPC is highly useful for applications built around a WfSpec that uses USER_TASK nodes. - */ - completeUserTaskRun( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Cancels a UserTaskRun. This will result in an EXCEPTION being propagated to the WfRun. */ - cancelUserTaskRun( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** - * Lists all UserTaskRun's for a specific WfRun. Can be useful when using a WfRun - * to model an entity. - */ - listUserTaskRuns( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Gets a specific NodeRun. */ - getNodeRun(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Lists all NodeRun's for a specific WfRun. */ - listNodeRuns(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Gets a specific TaskRun. */ - getTaskRun(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Lists all TaskRun's for a specific WfRun. */ - listTaskRuns(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** - * Get the value of a specific Variable. When using a WfRun to model an entity, this - * RPC is useful for retrieving information. It is equivalent to looking up the value of a - * column for a specific row in a SQL table. - */ - getVariable(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** List all Variables from a WfRun. */ - listVariables( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Post an ExternalEvent. This RPC is highly useful for */ - putExternalEvent( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Get a specific ExternalEvent. */ - getExternalEvent( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** - * Waits for a WorkflowEvent to be thrown by a given WfRun. Returns immediately if a matching - * WorkflowEvent has already been thrown; throws a DEADLINE_EXCEEDED error if the WorkflowEvent - * is not thrown before the deadline specified by the client. - * - * To specify the deadline, the client should use GRPC deadlines. - */ - awaitWorkflowEvent( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** List ExternalEvent's for a specific WfRun. */ - listExternalEvents( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** - * Search for WfRun's. This RPC is highly useful for applications that store data - * in LittleHorse and need to find a specific WfRun based on certain indexed fields. - */ - searchWfRun(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** - * Search for NodeRun's. This RPC is useful for monitoring and finding bugs in - * your workflows or Task Workers. - */ - searchNodeRun( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Search for TaskRun's. This RPC is useful for finding bugs in your Task Workers. */ - searchTaskRun( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** - * Search for UserTaskRun's. This RPC is highly useful for applications that connect - * human end-users to LittleHorse: it enables you to find all tasks assigned to a specific - * person or group of people. - */ - searchUserTaskRun( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** - * Search for Variable's. This RPC is highly useful for applications that store data - * in LittleHorse and need to find a specific WfRun based on certain indexed fields. - */ - searchVariable( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Search for ExternalEvent's. */ - searchExternalEvent( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Search for TaskDef's. */ - searchTaskDef( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Search for UserTaskDef's. */ - searchUserTaskDef( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Search for WfSpec's. */ - searchWfSpec( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Search for ExternalEventDef's. */ - searchExternalEventDef( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Search for all available TenantIds for current Principal */ - searchTenant( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** - * Used by the Task Worker to: - * 1. Tell the LH Server that the Task Worker has joined the Task Worker Group. - * 2. Receive the assignemnt of LH Server's to poll from. - * Generally, you won't use this request manually. - */ - registerTaskWorker( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** - * Used by Task Workers to listen for TaskRuns on the Task Queue. Generally, you won't - * use this RPC manually. - */ - pollTask( - request: AsyncIterable>, - options?: CallOptions & CallOptionsExt, - ): AsyncIterable; - /** - * Used by Task Workers to report the result of a TaskRun. Generally, you won't use - * this rpc manually. - */ - reportTask(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Move a WfRun or a specific ThreadRun in that WfRun to the HALTED state. */ - stopWfRun(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Resumes a WfRun or a specific ThreadRun of a WfRun. */ - resumeWfRun(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Deletes a WfRun. The WfRun cannot be in the RUNNING state. */ - deleteWfRun(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Deletes a TaskDef. */ - deleteTaskDef(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Deletes a WfSpec. */ - deleteWfSpec(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Deletes a UserTaskDef. */ - deleteUserTaskDef( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Deletes an ExternalEventDef. */ - deleteExternalEventDef( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Returns TaskDef Metrics for a specific TaskDef and a specific time window. */ - getTaskDefMetricsWindow( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Returns WfSpec Metrics for a specific WfSpec and a specific time window. */ - getWfSpecMetricsWindow( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Returns a list of TaskDef Metrics Windows. */ - listTaskDefMetrics( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** Returns a list of WfSpec Metrics Windows. */ - listWfSpecMetrics( - request: DeepPartial, - options?: CallOptions & CallOptionsExt, - ): Promise; - /** EXPERIMENTAL: Creates another Tenant in the LH Server. */ - putTenant(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** EXPERIMENTAL: Creates an Principal. */ - putPrincipal(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Returns the Principal of the caller. */ - whoami(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; - /** Gets the version of the LH Server. */ - getServerVersion(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise; -} - -function bytesFromBase64(b64: string): Uint8Array { - if ((globalThis as any).Buffer) { - return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); - } else { - const bin = globalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } -} - -function base64FromBytes(arr: Uint8Array): string { - if ((globalThis as any).Buffer) { - return globalThis.Buffer.from(arr).toString("base64"); - } else { - const bin: string[] = []; - arr.forEach((byte) => { - bin.push(globalThis.String.fromCharCode(byte)); - }); - return globalThis.btoa(bin.join("")); - } -} - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function longToNumber(long: Long): number { - if (long.gt(globalThis.Number.MAX_SAFE_INTEGER)) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - return long.toNumber(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - -function isObject(value: any): boolean { - return typeof value === "object" && value !== null; -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} - -export type ServerStreamingMethodResult = { [Symbol.asyncIterator](): AsyncIterator }; diff --git a/dashboard/apps/web/littlehorse-public-api/task_def.ts b/dashboard/apps/web/littlehorse-public-api/task_def.ts deleted file mode 100644 index c78f9318f..000000000 --- a/dashboard/apps/web/littlehorse-public-api/task_def.ts +++ /dev/null @@ -1,139 +0,0 @@ -/* eslint-disable */ -import * as _m0 from "protobufjs/minimal"; -import { VariableDef } from "./common_wfspec"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { TaskDefId } from "./object_id"; - -export const protobufPackage = "littlehorse"; - -/** A TaskDef defines a blueprint for a TaskRun that can be dispatched to Task Workers. */ -export interface TaskDef { - /** The ID of this TaskDef. */ - id: - | TaskDefId - | undefined; - /** The input variables required to execute this TaskDef. */ - inputVars: VariableDef[]; - /** The time at which this TaskDef was created. */ - createdAt: string | undefined; -} - -function createBaseTaskDef(): TaskDef { - return { id: undefined, inputVars: [], createdAt: undefined }; -} - -export const TaskDef = { - encode(message: TaskDef, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - TaskDefId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - for (const v of message.inputVars) { - VariableDef.encode(v!, writer.uint32(18).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskDef { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskDef(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = TaskDefId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.inputVars.push(VariableDef.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskDef { - return { - id: isSet(object.id) ? TaskDefId.fromJSON(object.id) : undefined, - inputVars: globalThis.Array.isArray(object?.inputVars) - ? object.inputVars.map((e: any) => VariableDef.fromJSON(e)) - : [], - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - }; - }, - - toJSON(message: TaskDef): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = TaskDefId.toJSON(message.id); - } - if (message.inputVars?.length) { - obj.inputVars = message.inputVars.map((e) => VariableDef.toJSON(e)); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - return obj; - }, - - create, I>>(base?: I): TaskDef { - return TaskDef.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskDef { - const message = createBaseTaskDef(); - message.id = (object.id !== undefined && object.id !== null) ? TaskDefId.fromPartial(object.id) : undefined; - message.inputVars = object.inputVars?.map((e) => VariableDef.fromPartial(e)) || []; - message.createdAt = object.createdAt ?? undefined; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/task_run.ts b/dashboard/apps/web/littlehorse-public-api/task_run.ts deleted file mode 100644 index 0490e22bf..000000000 --- a/dashboard/apps/web/littlehorse-public-api/task_run.ts +++ /dev/null @@ -1,1021 +0,0 @@ -/* eslint-disable */ -import * as _m0 from "protobufjs/minimal"; -import { - LHErrorType, - lHErrorTypeFromJSON, - lHErrorTypeToJSON, - lHErrorTypeToNumber, - TaskStatus, - taskStatusFromJSON, - taskStatusToJSON, - taskStatusToNumber, -} from "./common_enums"; -import { ExponentialBackoffRetryPolicy } from "./common_wfspec"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { NodeRunId, TaskDefId, TaskRunId, WfSpecId } from "./object_id"; -import { UserTaskTriggerReference } from "./user_tasks"; -import { VariableValue } from "./variable"; - -export const protobufPackage = "littlehorse"; - -/** A TaskRun resents a single instance of a TaskDef being executed. */ -export interface TaskRun { - /** The ID of the TaskRun. Note that the TaskRunId contains the WfRunId. */ - id: - | TaskRunId - | undefined; - /** The ID of the TaskDef being executed. */ - taskDefId: - | TaskDefId - | undefined; - /** - * All attempts scheduled for this TaskRun. A TaskAttempt represents an occurrence of - * the TaskRun being put on a Task Queue to be executed by the Task Workers. - */ - attempts: TaskAttempt[]; - /** - * The input variables to pass into this TaskRun. Note that this is a list and not - * a map, because ordering matters. Depending on the language implementation, not - * every LittleHorse Task Worker SDK has the ability to determine the names of the - * variables from the method signature, so we provide both names and ordering. - */ - inputVariables: VarNameAndVal[]; - /** - * The source (in the WfRun) that caused this TaskRun to be created. Currently, this - * can be either a TASK node, or a User Task Action Task Trigger in a USER_TASK node (such - * as a task used to send reminders). - */ - source: - | TaskRunSource - | undefined; - /** When the TaskRun was scheduled. */ - scheduledAt: - | string - | undefined; - /** The status of the TaskRun. */ - status: TaskStatus; - /** The timeout before LH considers a TaskAttempt to be timed out. */ - timeoutSeconds: number; - /** - * The maximum number of attempts that may be scheduled for this TaskRun. NOTE: setting - * total_attempts to 1 means that there are no retries. - */ - totalAttempts: number; - /** Optional backoff policy . */ - exponentialBackoff?: ExponentialBackoffRetryPolicy | undefined; -} - -/** A key-value pair of variable name and value. */ -export interface VarNameAndVal { - /** The variable name. */ - varName: string; - /** The value of the variable for this TaskRun. */ - value: VariableValue | undefined; -} - -/** A single time that a TaskRun was scheduled for execution on a Task Queue. */ -export interface TaskAttempt { - /** - * Optional information provided by the Task Worker SDK for debugging. Usually, if set - * it contains a stacktrace or it contains information logged via `WorkerContext#log()`. - */ - logOutput?: - | VariableValue - | undefined; - /** - * The time the TaskAttempt was scheduled on the Task Queue. Not set for a TaskAttempt that is - * in the TASK_PENDING status; for example, when waiting between retries with exponential - * backoff. - */ - scheduleTime?: - | string - | undefined; - /** The time the TaskAttempt was pulled off the queue and sent to a TaskWorker. */ - startTime?: - | string - | undefined; - /** - * The time the TaskAttempt was finished (either completed, reported as failed, or - * timed out) - */ - endTime?: - | string - | undefined; - /** EXPERIMENTAL: the ID of the Task Worker who executed this TaskRun. */ - taskWorkerId: string; - /** The version of the Task Worker that executed the TaskAttempt. */ - taskWorkerVersion?: - | string - | undefined; - /** The status of this TaskAttempt. */ - status: TaskStatus; - /** Denotes the Task Function executed properly and returned an output. */ - output?: - | VariableValue - | undefined; - /** An unexpected technical error was encountered. May or may not be retriable. */ - error?: - | LHTaskError - | undefined; - /** The Task Function encountered a business problem and threw a technical exception. */ - exception?: LHTaskException | undefined; -} - -/** The source of a TaskRun; i.e. why it was scheduled. */ -export interface TaskRunSource { - /** Reference to a NodeRun of type TASK which scheduled this TaskRun. */ - taskNode?: - | TaskNodeReference - | undefined; - /** Reference to the specific UserTaskRun trigger action which scheduled this TaskRun */ - userTaskTrigger?: - | UserTaskTriggerReference - | undefined; - /** - * The ID of the WfSpec that is being executed. Always set in ScheduledTask.source so - * that the WorkerContext can know this information. - */ - wfSpecId?: WfSpecId | undefined; -} - -/** Reference to a NodeRun of type TASK which caused a TaskRun to be scheduled. */ -export interface TaskNodeReference { - /** The ID of the NodeRun which caused this TASK to be scheduled. */ - nodeRunId: NodeRunId | undefined; -} - -/** Message denoting a TaskRun failed for technical reasons. */ -export interface LHTaskError { - /** The technical error code. */ - type: LHErrorType; - /** Human readable message for debugging. */ - message: string; -} - -/** - * Message denoting a TaskRun's execution signaled that something went wrong in the - * business process, throwing a littlehorse 'EXCEPTION'. - */ -export interface LHTaskException { - /** The user-defined Failure name, for example, "credit-card-declined" */ - name: string; - /** Human readadble description of the failure. */ - message: string; - content: VariableValue | undefined; -} - -function createBaseTaskRun(): TaskRun { - return { - id: undefined, - taskDefId: undefined, - attempts: [], - inputVariables: [], - source: undefined, - scheduledAt: undefined, - status: TaskStatus.TASK_SCHEDULED, - timeoutSeconds: 0, - totalAttempts: 0, - exponentialBackoff: undefined, - }; -} - -export const TaskRun = { - encode(message: TaskRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - TaskRunId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.taskDefId !== undefined) { - TaskDefId.encode(message.taskDefId, writer.uint32(18).fork()).ldelim(); - } - for (const v of message.attempts) { - TaskAttempt.encode(v!, writer.uint32(26).fork()).ldelim(); - } - for (const v of message.inputVariables) { - VarNameAndVal.encode(v!, writer.uint32(42).fork()).ldelim(); - } - if (message.source !== undefined) { - TaskRunSource.encode(message.source, writer.uint32(50).fork()).ldelim(); - } - if (message.scheduledAt !== undefined) { - Timestamp.encode(toTimestamp(message.scheduledAt), writer.uint32(58).fork()).ldelim(); - } - if (message.status !== TaskStatus.TASK_SCHEDULED) { - writer.uint32(64).int32(taskStatusToNumber(message.status)); - } - if (message.timeoutSeconds !== 0) { - writer.uint32(72).int32(message.timeoutSeconds); - } - if (message.totalAttempts !== 0) { - writer.uint32(32).int32(message.totalAttempts); - } - if (message.exponentialBackoff !== undefined) { - ExponentialBackoffRetryPolicy.encode(message.exponentialBackoff, writer.uint32(82).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = TaskRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.taskDefId = TaskDefId.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.attempts.push(TaskAttempt.decode(reader, reader.uint32())); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.inputVariables.push(VarNameAndVal.decode(reader, reader.uint32())); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.source = TaskRunSource.decode(reader, reader.uint32()); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.scheduledAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 8: - if (tag !== 64) { - break; - } - - message.status = taskStatusFromJSON(reader.int32()); - continue; - case 9: - if (tag !== 72) { - break; - } - - message.timeoutSeconds = reader.int32(); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.totalAttempts = reader.int32(); - continue; - case 10: - if (tag !== 82) { - break; - } - - message.exponentialBackoff = ExponentialBackoffRetryPolicy.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskRun { - return { - id: isSet(object.id) ? TaskRunId.fromJSON(object.id) : undefined, - taskDefId: isSet(object.taskDefId) ? TaskDefId.fromJSON(object.taskDefId) : undefined, - attempts: globalThis.Array.isArray(object?.attempts) - ? object.attempts.map((e: any) => TaskAttempt.fromJSON(e)) - : [], - inputVariables: globalThis.Array.isArray(object?.inputVariables) - ? object.inputVariables.map((e: any) => VarNameAndVal.fromJSON(e)) - : [], - source: isSet(object.source) ? TaskRunSource.fromJSON(object.source) : undefined, - scheduledAt: isSet(object.scheduledAt) ? globalThis.String(object.scheduledAt) : undefined, - status: isSet(object.status) ? taskStatusFromJSON(object.status) : TaskStatus.TASK_SCHEDULED, - timeoutSeconds: isSet(object.timeoutSeconds) ? globalThis.Number(object.timeoutSeconds) : 0, - totalAttempts: isSet(object.totalAttempts) ? globalThis.Number(object.totalAttempts) : 0, - exponentialBackoff: isSet(object.exponentialBackoff) - ? ExponentialBackoffRetryPolicy.fromJSON(object.exponentialBackoff) - : undefined, - }; - }, - - toJSON(message: TaskRun): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = TaskRunId.toJSON(message.id); - } - if (message.taskDefId !== undefined) { - obj.taskDefId = TaskDefId.toJSON(message.taskDefId); - } - if (message.attempts?.length) { - obj.attempts = message.attempts.map((e) => TaskAttempt.toJSON(e)); - } - if (message.inputVariables?.length) { - obj.inputVariables = message.inputVariables.map((e) => VarNameAndVal.toJSON(e)); - } - if (message.source !== undefined) { - obj.source = TaskRunSource.toJSON(message.source); - } - if (message.scheduledAt !== undefined) { - obj.scheduledAt = message.scheduledAt; - } - if (message.status !== TaskStatus.TASK_SCHEDULED) { - obj.status = taskStatusToJSON(message.status); - } - if (message.timeoutSeconds !== 0) { - obj.timeoutSeconds = Math.round(message.timeoutSeconds); - } - if (message.totalAttempts !== 0) { - obj.totalAttempts = Math.round(message.totalAttempts); - } - if (message.exponentialBackoff !== undefined) { - obj.exponentialBackoff = ExponentialBackoffRetryPolicy.toJSON(message.exponentialBackoff); - } - return obj; - }, - - create, I>>(base?: I): TaskRun { - return TaskRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskRun { - const message = createBaseTaskRun(); - message.id = (object.id !== undefined && object.id !== null) ? TaskRunId.fromPartial(object.id) : undefined; - message.taskDefId = (object.taskDefId !== undefined && object.taskDefId !== null) - ? TaskDefId.fromPartial(object.taskDefId) - : undefined; - message.attempts = object.attempts?.map((e) => TaskAttempt.fromPartial(e)) || []; - message.inputVariables = object.inputVariables?.map((e) => VarNameAndVal.fromPartial(e)) || []; - message.source = (object.source !== undefined && object.source !== null) - ? TaskRunSource.fromPartial(object.source) - : undefined; - message.scheduledAt = object.scheduledAt ?? undefined; - message.status = object.status ?? TaskStatus.TASK_SCHEDULED; - message.timeoutSeconds = object.timeoutSeconds ?? 0; - message.totalAttempts = object.totalAttempts ?? 0; - message.exponentialBackoff = (object.exponentialBackoff !== undefined && object.exponentialBackoff !== null) - ? ExponentialBackoffRetryPolicy.fromPartial(object.exponentialBackoff) - : undefined; - return message; - }, -}; - -function createBaseVarNameAndVal(): VarNameAndVal { - return { varName: "", value: undefined }; -} - -export const VarNameAndVal = { - encode(message: VarNameAndVal, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.varName !== "") { - writer.uint32(10).string(message.varName); - } - if (message.value !== undefined) { - VariableValue.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VarNameAndVal { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVarNameAndVal(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.varName = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = VariableValue.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VarNameAndVal { - return { - varName: isSet(object.varName) ? globalThis.String(object.varName) : "", - value: isSet(object.value) ? VariableValue.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: VarNameAndVal): unknown { - const obj: any = {}; - if (message.varName !== "") { - obj.varName = message.varName; - } - if (message.value !== undefined) { - obj.value = VariableValue.toJSON(message.value); - } - return obj; - }, - - create, I>>(base?: I): VarNameAndVal { - return VarNameAndVal.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): VarNameAndVal { - const message = createBaseVarNameAndVal(); - message.varName = object.varName ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? VariableValue.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseTaskAttempt(): TaskAttempt { - return { - logOutput: undefined, - scheduleTime: undefined, - startTime: undefined, - endTime: undefined, - taskWorkerId: "", - taskWorkerVersion: undefined, - status: TaskStatus.TASK_SCHEDULED, - output: undefined, - error: undefined, - exception: undefined, - }; -} - -export const TaskAttempt = { - encode(message: TaskAttempt, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.logOutput !== undefined) { - VariableValue.encode(message.logOutput, writer.uint32(18).fork()).ldelim(); - } - if (message.scheduleTime !== undefined) { - Timestamp.encode(toTimestamp(message.scheduleTime), writer.uint32(26).fork()).ldelim(); - } - if (message.startTime !== undefined) { - Timestamp.encode(toTimestamp(message.startTime), writer.uint32(34).fork()).ldelim(); - } - if (message.endTime !== undefined) { - Timestamp.encode(toTimestamp(message.endTime), writer.uint32(42).fork()).ldelim(); - } - if (message.taskWorkerId !== "") { - writer.uint32(58).string(message.taskWorkerId); - } - if (message.taskWorkerVersion !== undefined) { - writer.uint32(66).string(message.taskWorkerVersion); - } - if (message.status !== TaskStatus.TASK_SCHEDULED) { - writer.uint32(72).int32(taskStatusToNumber(message.status)); - } - if (message.output !== undefined) { - VariableValue.encode(message.output, writer.uint32(10).fork()).ldelim(); - } - if (message.error !== undefined) { - LHTaskError.encode(message.error, writer.uint32(82).fork()).ldelim(); - } - if (message.exception !== undefined) { - LHTaskException.encode(message.exception, writer.uint32(90).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskAttempt { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskAttempt(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 2: - if (tag !== 18) { - break; - } - - message.logOutput = VariableValue.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.scheduleTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.startTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.endTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.taskWorkerId = reader.string(); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.taskWorkerVersion = reader.string(); - continue; - case 9: - if (tag !== 72) { - break; - } - - message.status = taskStatusFromJSON(reader.int32()); - continue; - case 1: - if (tag !== 10) { - break; - } - - message.output = VariableValue.decode(reader, reader.uint32()); - continue; - case 10: - if (tag !== 82) { - break; - } - - message.error = LHTaskError.decode(reader, reader.uint32()); - continue; - case 11: - if (tag !== 90) { - break; - } - - message.exception = LHTaskException.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskAttempt { - return { - logOutput: isSet(object.logOutput) ? VariableValue.fromJSON(object.logOutput) : undefined, - scheduleTime: isSet(object.scheduleTime) ? globalThis.String(object.scheduleTime) : undefined, - startTime: isSet(object.startTime) ? globalThis.String(object.startTime) : undefined, - endTime: isSet(object.endTime) ? globalThis.String(object.endTime) : undefined, - taskWorkerId: isSet(object.taskWorkerId) ? globalThis.String(object.taskWorkerId) : "", - taskWorkerVersion: isSet(object.taskWorkerVersion) ? globalThis.String(object.taskWorkerVersion) : undefined, - status: isSet(object.status) ? taskStatusFromJSON(object.status) : TaskStatus.TASK_SCHEDULED, - output: isSet(object.output) ? VariableValue.fromJSON(object.output) : undefined, - error: isSet(object.error) ? LHTaskError.fromJSON(object.error) : undefined, - exception: isSet(object.exception) ? LHTaskException.fromJSON(object.exception) : undefined, - }; - }, - - toJSON(message: TaskAttempt): unknown { - const obj: any = {}; - if (message.logOutput !== undefined) { - obj.logOutput = VariableValue.toJSON(message.logOutput); - } - if (message.scheduleTime !== undefined) { - obj.scheduleTime = message.scheduleTime; - } - if (message.startTime !== undefined) { - obj.startTime = message.startTime; - } - if (message.endTime !== undefined) { - obj.endTime = message.endTime; - } - if (message.taskWorkerId !== "") { - obj.taskWorkerId = message.taskWorkerId; - } - if (message.taskWorkerVersion !== undefined) { - obj.taskWorkerVersion = message.taskWorkerVersion; - } - if (message.status !== TaskStatus.TASK_SCHEDULED) { - obj.status = taskStatusToJSON(message.status); - } - if (message.output !== undefined) { - obj.output = VariableValue.toJSON(message.output); - } - if (message.error !== undefined) { - obj.error = LHTaskError.toJSON(message.error); - } - if (message.exception !== undefined) { - obj.exception = LHTaskException.toJSON(message.exception); - } - return obj; - }, - - create, I>>(base?: I): TaskAttempt { - return TaskAttempt.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskAttempt { - const message = createBaseTaskAttempt(); - message.logOutput = (object.logOutput !== undefined && object.logOutput !== null) - ? VariableValue.fromPartial(object.logOutput) - : undefined; - message.scheduleTime = object.scheduleTime ?? undefined; - message.startTime = object.startTime ?? undefined; - message.endTime = object.endTime ?? undefined; - message.taskWorkerId = object.taskWorkerId ?? ""; - message.taskWorkerVersion = object.taskWorkerVersion ?? undefined; - message.status = object.status ?? TaskStatus.TASK_SCHEDULED; - message.output = (object.output !== undefined && object.output !== null) - ? VariableValue.fromPartial(object.output) - : undefined; - message.error = (object.error !== undefined && object.error !== null) - ? LHTaskError.fromPartial(object.error) - : undefined; - message.exception = (object.exception !== undefined && object.exception !== null) - ? LHTaskException.fromPartial(object.exception) - : undefined; - return message; - }, -}; - -function createBaseTaskRunSource(): TaskRunSource { - return { taskNode: undefined, userTaskTrigger: undefined, wfSpecId: undefined }; -} - -export const TaskRunSource = { - encode(message: TaskRunSource, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskNode !== undefined) { - TaskNodeReference.encode(message.taskNode, writer.uint32(10).fork()).ldelim(); - } - if (message.userTaskTrigger !== undefined) { - UserTaskTriggerReference.encode(message.userTaskTrigger, writer.uint32(18).fork()).ldelim(); - } - if (message.wfSpecId !== undefined) { - WfSpecId.encode(message.wfSpecId, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskRunSource { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskRunSource(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskNode = TaskNodeReference.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.userTaskTrigger = UserTaskTriggerReference.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.wfSpecId = WfSpecId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskRunSource { - return { - taskNode: isSet(object.taskNode) ? TaskNodeReference.fromJSON(object.taskNode) : undefined, - userTaskTrigger: isSet(object.userTaskTrigger) - ? UserTaskTriggerReference.fromJSON(object.userTaskTrigger) - : undefined, - wfSpecId: isSet(object.wfSpecId) ? WfSpecId.fromJSON(object.wfSpecId) : undefined, - }; - }, - - toJSON(message: TaskRunSource): unknown { - const obj: any = {}; - if (message.taskNode !== undefined) { - obj.taskNode = TaskNodeReference.toJSON(message.taskNode); - } - if (message.userTaskTrigger !== undefined) { - obj.userTaskTrigger = UserTaskTriggerReference.toJSON(message.userTaskTrigger); - } - if (message.wfSpecId !== undefined) { - obj.wfSpecId = WfSpecId.toJSON(message.wfSpecId); - } - return obj; - }, - - create, I>>(base?: I): TaskRunSource { - return TaskRunSource.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskRunSource { - const message = createBaseTaskRunSource(); - message.taskNode = (object.taskNode !== undefined && object.taskNode !== null) - ? TaskNodeReference.fromPartial(object.taskNode) - : undefined; - message.userTaskTrigger = (object.userTaskTrigger !== undefined && object.userTaskTrigger !== null) - ? UserTaskTriggerReference.fromPartial(object.userTaskTrigger) - : undefined; - message.wfSpecId = (object.wfSpecId !== undefined && object.wfSpecId !== null) - ? WfSpecId.fromPartial(object.wfSpecId) - : undefined; - return message; - }, -}; - -function createBaseTaskNodeReference(): TaskNodeReference { - return { nodeRunId: undefined }; -} - -export const TaskNodeReference = { - encode(message: TaskNodeReference, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.nodeRunId !== undefined) { - NodeRunId.encode(message.nodeRunId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): TaskNodeReference { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTaskNodeReference(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.nodeRunId = NodeRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): TaskNodeReference { - return { nodeRunId: isSet(object.nodeRunId) ? NodeRunId.fromJSON(object.nodeRunId) : undefined }; - }, - - toJSON(message: TaskNodeReference): unknown { - const obj: any = {}; - if (message.nodeRunId !== undefined) { - obj.nodeRunId = NodeRunId.toJSON(message.nodeRunId); - } - return obj; - }, - - create, I>>(base?: I): TaskNodeReference { - return TaskNodeReference.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): TaskNodeReference { - const message = createBaseTaskNodeReference(); - message.nodeRunId = (object.nodeRunId !== undefined && object.nodeRunId !== null) - ? NodeRunId.fromPartial(object.nodeRunId) - : undefined; - return message; - }, -}; - -function createBaseLHTaskError(): LHTaskError { - return { type: LHErrorType.CHILD_FAILURE, message: "" }; -} - -export const LHTaskError = { - encode(message: LHTaskError, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.type !== LHErrorType.CHILD_FAILURE) { - writer.uint32(8).int32(lHErrorTypeToNumber(message.type)); - } - if (message.message !== "") { - writer.uint32(18).string(message.message); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): LHTaskError { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseLHTaskError(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.type = lHErrorTypeFromJSON(reader.int32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.message = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): LHTaskError { - return { - type: isSet(object.type) ? lHErrorTypeFromJSON(object.type) : LHErrorType.CHILD_FAILURE, - message: isSet(object.message) ? globalThis.String(object.message) : "", - }; - }, - - toJSON(message: LHTaskError): unknown { - const obj: any = {}; - if (message.type !== LHErrorType.CHILD_FAILURE) { - obj.type = lHErrorTypeToJSON(message.type); - } - if (message.message !== "") { - obj.message = message.message; - } - return obj; - }, - - create, I>>(base?: I): LHTaskError { - return LHTaskError.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): LHTaskError { - const message = createBaseLHTaskError(); - message.type = object.type ?? LHErrorType.CHILD_FAILURE; - message.message = object.message ?? ""; - return message; - }, -}; - -function createBaseLHTaskException(): LHTaskException { - return { name: "", message: "", content: undefined }; -} - -export const LHTaskException = { - encode(message: LHTaskException, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - if (message.message !== "") { - writer.uint32(18).string(message.message); - } - if (message.content !== undefined) { - VariableValue.encode(message.content, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): LHTaskException { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseLHTaskException(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.message = reader.string(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.content = VariableValue.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): LHTaskException { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - message: isSet(object.message) ? globalThis.String(object.message) : "", - content: isSet(object.content) ? VariableValue.fromJSON(object.content) : undefined, - }; - }, - - toJSON(message: LHTaskException): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.message !== "") { - obj.message = message.message; - } - if (message.content !== undefined) { - obj.content = VariableValue.toJSON(message.content); - } - return obj; - }, - - create, I>>(base?: I): LHTaskException { - return LHTaskException.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): LHTaskException { - const message = createBaseLHTaskException(); - message.name = object.name ?? ""; - message.message = object.message ?? ""; - message.content = (object.content !== undefined && object.content !== null) - ? VariableValue.fromPartial(object.content) - : undefined; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/user_tasks.ts b/dashboard/apps/web/littlehorse-public-api/user_tasks.ts deleted file mode 100644 index a23872161..000000000 --- a/dashboard/apps/web/littlehorse-public-api/user_tasks.ts +++ /dev/null @@ -1,1725 +0,0 @@ -/* eslint-disable */ -import * as _m0 from "protobufjs/minimal"; -import { VariableType, variableTypeFromJSON, variableTypeToJSON, variableTypeToNumber } from "./common_enums"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { NodeRunId, TaskRunId, UserTaskDefId, UserTaskRunId } from "./object_id"; -import { VariableValue } from "./variable"; - -export const protobufPackage = "littlehorse"; - -/** The status that a UserTaskRun can be in. */ -export enum UserTaskRunStatus { - /** UNASSIGNED - Not assigned to a specific user yet. */ - UNASSIGNED = "UNASSIGNED", - /** ASSIGNED - Assigned to a specific user, but not completed or cancelled yet. */ - ASSIGNED = "ASSIGNED", - /** DONE - Done. */ - DONE = "DONE", - /** CANCELLED - Cancelled. */ - CANCELLED = "CANCELLED", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function userTaskRunStatusFromJSON(object: any): UserTaskRunStatus { - switch (object) { - case 0: - case "UNASSIGNED": - return UserTaskRunStatus.UNASSIGNED; - case 1: - case "ASSIGNED": - return UserTaskRunStatus.ASSIGNED; - case 3: - case "DONE": - return UserTaskRunStatus.DONE; - case 4: - case "CANCELLED": - return UserTaskRunStatus.CANCELLED; - case -1: - case "UNRECOGNIZED": - default: - return UserTaskRunStatus.UNRECOGNIZED; - } -} - -export function userTaskRunStatusToJSON(object: UserTaskRunStatus): string { - switch (object) { - case UserTaskRunStatus.UNASSIGNED: - return "UNASSIGNED"; - case UserTaskRunStatus.ASSIGNED: - return "ASSIGNED"; - case UserTaskRunStatus.DONE: - return "DONE"; - case UserTaskRunStatus.CANCELLED: - return "CANCELLED"; - case UserTaskRunStatus.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function userTaskRunStatusToNumber(object: UserTaskRunStatus): number { - switch (object) { - case UserTaskRunStatus.UNASSIGNED: - return 0; - case UserTaskRunStatus.ASSIGNED: - return 1; - case UserTaskRunStatus.DONE: - return 3; - case UserTaskRunStatus.CANCELLED: - return 4; - case UserTaskRunStatus.UNRECOGNIZED: - default: - return -1; - } -} - -/** UserTaskDef is the metadata blueprint for UserTaskRuns. */ -export interface UserTaskDef { - /** The name of the `UserTaskDef` */ - name: string; - /** The version of the `UserTaskDef`. Only simple versioning is supported. */ - version: number; - /** - * Metadata field that does not impact WfRun execution. Useful for providing - * context on the UserTaskRun, for example when displaying it on a general-purpose - * task manager application. - */ - description?: - | string - | undefined; - /** - * These are the fields comprise the User Task. A User Task Manager application, or - * any application used to complete a UserTaskRun, should inspect these fields and - * display form entries for each one. - */ - fields: UserTaskField[]; - /** The time the UserTaskRun was created. */ - createdAt: string | undefined; -} - -/** A UserTaskField is a specific field of data to be entered into a UserTaskRun. */ -export interface UserTaskField { - /** - * The name of the field. When a UserTaskRun is completed, the NodeOutput is a - * single-level JSON_OBJ. Each key is the name of the field. Must be unique. - */ - name: string; - /** The type of the output. Must be a primitive type (STR, BOOL, INT, DOUBLE). */ - type: VariableType; - /** - * Optional description which can be displayed by the User Task UI application. - * Does not affect WfRun execution. - */ - description?: - | string - | undefined; - /** - * The name to be displayed by the User Task UI application. Does not affect - * WfRun execution. - */ - displayName: string; - /** Whether this field is required for UserTaskRun completion. */ - required: boolean; -} - -/** - * A UserTaskRun is a running instance of a UserTaskDef. It is created when a - * ThreadRun arrives at a Node of type `USER_TASK`. - */ -export interface UserTaskRun { - /** The ID of the UserTaskRun. */ - id: - | UserTaskRunId - | undefined; - /** The ID of the UserTaskDef that this UserTaskRun comes from. */ - userTaskDefId: - | UserTaskDefId - | undefined; - /** - * The user_group to which this UserTaskRun is assigned. Not Set if not assigned - * to a group. At least one of user_group or user_id will be set for any given - * UserTaskRun. - */ - userGroup?: - | string - | undefined; - /** - * The user_id to which this UserTaskRun is assigned. Not Set if not assigned - * to a user. At least one of user_group or user_id will be set for any given - * UserTaskRun. If user_id is set, then the UserTaskRun cannot be in the - * UNASSIGNED status. - */ - userId?: - | string - | undefined; - /** - * The results of the UserTaskRun. Empty if the UserTaskRun has not yet been completed. - * Each key in this map is the `name` of a corresponding `UserTaskField` on the - * UserTaskDef. - */ - results: { [key: string]: VariableValue }; - /** Status of the UserTaskRun. Can be UNASSIGNED, ASSIGNED, DONE, or CANCELLED. */ - status: UserTaskRunStatus; - /** A list of events that have happened. Used for auditing information. */ - events: UserTaskEvent[]; - /** - * Notes about this UserTaskRun that are **specific to the WfRun**. These notes - * are set by the WfSpec based on variables inside the specific `WfRun` and are - * intended to be displayed on the User Task Manager application. They do not - * affect WfRun execution. - */ - notes?: - | string - | undefined; - /** The time that the UserTaskRun was created/scheduled. */ - scheduledTime: - | string - | undefined; - /** The NodeRun with which the UserTaskRun is associated. */ - nodeRunId: - | NodeRunId - | undefined; - /** - * Current observed epoch of the UserTaskRun, related to the number of times it has been - * updated or re-assigned. Used internally to implement automated reassignment and reminder - * tasks. - */ - epoch: number; -} - -export interface UserTaskRun_ResultsEntry { - key: string; - value: VariableValue | undefined; -} - -/** Re-Assigns a UserTaskRun to a specific userId or userGroup. */ -export interface AssignUserTaskRunRequest { - /** The UserTaskRun to assign to a new user_id or user_group. */ - userTaskRunId: - | UserTaskRunId - | undefined; - /** - * If override_claim is set to false and the UserTaskRun is already assigned to - * a user_id, then the request throws a FAILED_PRECONDITION error. If set to - * true, then the old claim is overriden and the UserTaskRun is assigned to - * the new user. - */ - overrideClaim: boolean; - /** - * The new user_group to which the UserTaskRun is assigned. If not set, then - * the user_group of the UserTaskRun is actively unset by this request. At least - * one of the user_group and user_id must be set. - */ - userGroup?: - | string - | undefined; - /** - * The new user_id to which the UserTaskRun is assigned. If not set, then - * the user_id of the UserTaskRun is actively unset by this request. At least - * one of the user_group and user_id must be set. - */ - userId?: string | undefined; -} - -/** Completes a UserTaskRun with provided values. */ -export interface CompleteUserTaskRunRequest { - /** The id of UserTaskRun to complete. */ - userTaskRunId: - | UserTaskRunId - | undefined; - /** - * A map from UserTaskField.name to a VariableValue containing the results of the - * user filling out the form. - */ - results: { [key: string]: VariableValue }; - /** The ID of the user who executed the task. */ - userId: string; -} - -export interface CompleteUserTaskRunRequest_ResultsEntry { - key: string; - value: VariableValue | undefined; -} - -/** Cancels a UserTaskRun. */ -export interface CancelUserTaskRunRequest { - /** The id of the UserTaskRun to cancel. */ - userTaskRunId: UserTaskRunId | undefined; -} - -/** - * All TaskRun's have a "trigger reference" which refers to the WfRun Element that - * caused the TaskRun to be scheduled. For example, a TaskRun on a regular TASK_NODE - * has a TaskNodeReference. - * - * The UserTaskTriggerReference serves as the "Trigger Reference" for a TaskRun that - * was scheduled by a lifecycle hook on a UserTaskRun (eg. a reminder task). - * - * The UserTaskTriggerReference is most useful in the WorkerContext of the Task Worker - * SDK, which allows the Task Method to determine where the TaskRun comes from. - */ -export interface UserTaskTriggerReference { - /** Is the NodeRun that the UserTaskRun belongs to. */ - nodeRunId: - | NodeRunId - | undefined; - /** - * Is the index in the `events` field of the UserTaskRun that the TaskRun corresponds - * to. - */ - userTaskEventNumber: number; - /** - * Is the user_id that the UserTaskRun is assigned to. Unset if UserTaskRun is not - * asigned to a specific user_id. - */ - userId?: - | string - | undefined; - /** - * Is the user_id that the UserTaskRun is assigned to. Unset if UserTaskRun is not - * asigned to a specific user_id. - */ - userGroup?: string | undefined; -} - -/** - * This is an event stored in the audit log of a `UserTaskRun` purely for observability - * purposes. - */ -export interface UserTaskEvent { - /** the time the event occurred. */ - time: - | string - | undefined; - /** Denotes that a TaskRun was scheduled via a trigger. */ - taskExecuted?: - | UserTaskEvent_UTETaskExecuted - | undefined; - /** Denotes that the UserTaskRun was assigned. */ - assigned?: - | UserTaskEvent_UTEAssigned - | undefined; - /** Denotes that the UserTaskRun was cancelled. */ - cancelled?: UserTaskEvent_UTECancelled | undefined; -} - -/** Empty message used to denote that the `UserTaskRun` was cancelled. */ -export interface UserTaskEvent_UTECancelled { - message: string; -} - -/** Message to denote that a `TaskRun` was scheduled by a trigger for this UserTaskRun. */ -export interface UserTaskEvent_UTETaskExecuted { - /** The `TaskRunId` of the scheduled `TaskRun` */ - taskRun: TaskRunId | undefined; -} - -/** Message denoting that the UserTaskRun was assigned. */ -export interface UserTaskEvent_UTEAssigned { - /** The user_id before the ownership change, if set. */ - oldUserId?: - | string - | undefined; - /** The user_group before the ownership change, if set. */ - oldUserGroup?: - | string - | undefined; - /** The user_id after the ownership change, if set. */ - newUserId?: - | string - | undefined; - /** The user_group after the ownership change, if set. */ - newUserGroup?: string | undefined; -} - -function createBaseUserTaskDef(): UserTaskDef { - return { name: "", version: 0, description: undefined, fields: [], createdAt: undefined }; -} - -export const UserTaskDef = { - encode(message: UserTaskDef, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - if (message.version !== 0) { - writer.uint32(16).int32(message.version); - } - if (message.description !== undefined) { - writer.uint32(26).string(message.description); - } - for (const v of message.fields) { - UserTaskField.encode(v!, writer.uint32(34).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(42).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskDef { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskDef(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.version = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.description = reader.string(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.fields.push(UserTaskField.decode(reader, reader.uint32())); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskDef { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - version: isSet(object.version) ? globalThis.Number(object.version) : 0, - description: isSet(object.description) ? globalThis.String(object.description) : undefined, - fields: globalThis.Array.isArray(object?.fields) ? object.fields.map((e: any) => UserTaskField.fromJSON(e)) : [], - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - }; - }, - - toJSON(message: UserTaskDef): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.version !== 0) { - obj.version = Math.round(message.version); - } - if (message.description !== undefined) { - obj.description = message.description; - } - if (message.fields?.length) { - obj.fields = message.fields.map((e) => UserTaskField.toJSON(e)); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - return obj; - }, - - create, I>>(base?: I): UserTaskDef { - return UserTaskDef.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskDef { - const message = createBaseUserTaskDef(); - message.name = object.name ?? ""; - message.version = object.version ?? 0; - message.description = object.description ?? undefined; - message.fields = object.fields?.map((e) => UserTaskField.fromPartial(e)) || []; - message.createdAt = object.createdAt ?? undefined; - return message; - }, -}; - -function createBaseUserTaskField(): UserTaskField { - return { name: "", type: VariableType.JSON_OBJ, description: undefined, displayName: "", required: false }; -} - -export const UserTaskField = { - encode(message: UserTaskField, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.name !== "") { - writer.uint32(10).string(message.name); - } - if (message.type !== VariableType.JSON_OBJ) { - writer.uint32(16).int32(variableTypeToNumber(message.type)); - } - if (message.description !== undefined) { - writer.uint32(26).string(message.description); - } - if (message.displayName !== "") { - writer.uint32(34).string(message.displayName); - } - if (message.required !== false) { - writer.uint32(40).bool(message.required); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskField { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskField(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.name = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.type = variableTypeFromJSON(reader.int32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.description = reader.string(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.displayName = reader.string(); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.required = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskField { - return { - name: isSet(object.name) ? globalThis.String(object.name) : "", - type: isSet(object.type) ? variableTypeFromJSON(object.type) : VariableType.JSON_OBJ, - description: isSet(object.description) ? globalThis.String(object.description) : undefined, - displayName: isSet(object.displayName) ? globalThis.String(object.displayName) : "", - required: isSet(object.required) ? globalThis.Boolean(object.required) : false, - }; - }, - - toJSON(message: UserTaskField): unknown { - const obj: any = {}; - if (message.name !== "") { - obj.name = message.name; - } - if (message.type !== VariableType.JSON_OBJ) { - obj.type = variableTypeToJSON(message.type); - } - if (message.description !== undefined) { - obj.description = message.description; - } - if (message.displayName !== "") { - obj.displayName = message.displayName; - } - if (message.required !== false) { - obj.required = message.required; - } - return obj; - }, - - create, I>>(base?: I): UserTaskField { - return UserTaskField.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskField { - const message = createBaseUserTaskField(); - message.name = object.name ?? ""; - message.type = object.type ?? VariableType.JSON_OBJ; - message.description = object.description ?? undefined; - message.displayName = object.displayName ?? ""; - message.required = object.required ?? false; - return message; - }, -}; - -function createBaseUserTaskRun(): UserTaskRun { - return { - id: undefined, - userTaskDefId: undefined, - userGroup: undefined, - userId: undefined, - results: {}, - status: UserTaskRunStatus.UNASSIGNED, - events: [], - notes: undefined, - scheduledTime: undefined, - nodeRunId: undefined, - epoch: 0, - }; -} - -export const UserTaskRun = { - encode(message: UserTaskRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - UserTaskRunId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.userTaskDefId !== undefined) { - UserTaskDefId.encode(message.userTaskDefId, writer.uint32(18).fork()).ldelim(); - } - if (message.userGroup !== undefined) { - writer.uint32(26).string(message.userGroup); - } - if (message.userId !== undefined) { - writer.uint32(34).string(message.userId); - } - Object.entries(message.results).forEach(([key, value]) => { - UserTaskRun_ResultsEntry.encode({ key: key as any, value }, writer.uint32(50).fork()).ldelim(); - }); - if (message.status !== UserTaskRunStatus.UNASSIGNED) { - writer.uint32(56).int32(userTaskRunStatusToNumber(message.status)); - } - for (const v of message.events) { - UserTaskEvent.encode(v!, writer.uint32(66).fork()).ldelim(); - } - if (message.notes !== undefined) { - writer.uint32(74).string(message.notes); - } - if (message.scheduledTime !== undefined) { - Timestamp.encode(toTimestamp(message.scheduledTime), writer.uint32(82).fork()).ldelim(); - } - if (message.nodeRunId !== undefined) { - NodeRunId.encode(message.nodeRunId, writer.uint32(90).fork()).ldelim(); - } - if (message.epoch !== 0) { - writer.uint32(96).int32(message.epoch); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = UserTaskRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.userTaskDefId = UserTaskDefId.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.userGroup = reader.string(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.userId = reader.string(); - continue; - case 6: - if (tag !== 50) { - break; - } - - const entry6 = UserTaskRun_ResultsEntry.decode(reader, reader.uint32()); - if (entry6.value !== undefined) { - message.results[entry6.key] = entry6.value; - } - continue; - case 7: - if (tag !== 56) { - break; - } - - message.status = userTaskRunStatusFromJSON(reader.int32()); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.events.push(UserTaskEvent.decode(reader, reader.uint32())); - continue; - case 9: - if (tag !== 74) { - break; - } - - message.notes = reader.string(); - continue; - case 10: - if (tag !== 82) { - break; - } - - message.scheduledTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 11: - if (tag !== 90) { - break; - } - - message.nodeRunId = NodeRunId.decode(reader, reader.uint32()); - continue; - case 12: - if (tag !== 96) { - break; - } - - message.epoch = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskRun { - return { - id: isSet(object.id) ? UserTaskRunId.fromJSON(object.id) : undefined, - userTaskDefId: isSet(object.userTaskDefId) ? UserTaskDefId.fromJSON(object.userTaskDefId) : undefined, - userGroup: isSet(object.userGroup) ? globalThis.String(object.userGroup) : undefined, - userId: isSet(object.userId) ? globalThis.String(object.userId) : undefined, - results: isObject(object.results) - ? Object.entries(object.results).reduce<{ [key: string]: VariableValue }>((acc, [key, value]) => { - acc[key] = VariableValue.fromJSON(value); - return acc; - }, {}) - : {}, - status: isSet(object.status) ? userTaskRunStatusFromJSON(object.status) : UserTaskRunStatus.UNASSIGNED, - events: globalThis.Array.isArray(object?.events) ? object.events.map((e: any) => UserTaskEvent.fromJSON(e)) : [], - notes: isSet(object.notes) ? globalThis.String(object.notes) : undefined, - scheduledTime: isSet(object.scheduledTime) ? globalThis.String(object.scheduledTime) : undefined, - nodeRunId: isSet(object.nodeRunId) ? NodeRunId.fromJSON(object.nodeRunId) : undefined, - epoch: isSet(object.epoch) ? globalThis.Number(object.epoch) : 0, - }; - }, - - toJSON(message: UserTaskRun): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = UserTaskRunId.toJSON(message.id); - } - if (message.userTaskDefId !== undefined) { - obj.userTaskDefId = UserTaskDefId.toJSON(message.userTaskDefId); - } - if (message.userGroup !== undefined) { - obj.userGroup = message.userGroup; - } - if (message.userId !== undefined) { - obj.userId = message.userId; - } - if (message.results) { - const entries = Object.entries(message.results); - if (entries.length > 0) { - obj.results = {}; - entries.forEach(([k, v]) => { - obj.results[k] = VariableValue.toJSON(v); - }); - } - } - if (message.status !== UserTaskRunStatus.UNASSIGNED) { - obj.status = userTaskRunStatusToJSON(message.status); - } - if (message.events?.length) { - obj.events = message.events.map((e) => UserTaskEvent.toJSON(e)); - } - if (message.notes !== undefined) { - obj.notes = message.notes; - } - if (message.scheduledTime !== undefined) { - obj.scheduledTime = message.scheduledTime; - } - if (message.nodeRunId !== undefined) { - obj.nodeRunId = NodeRunId.toJSON(message.nodeRunId); - } - if (message.epoch !== 0) { - obj.epoch = Math.round(message.epoch); - } - return obj; - }, - - create, I>>(base?: I): UserTaskRun { - return UserTaskRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskRun { - const message = createBaseUserTaskRun(); - message.id = (object.id !== undefined && object.id !== null) ? UserTaskRunId.fromPartial(object.id) : undefined; - message.userTaskDefId = (object.userTaskDefId !== undefined && object.userTaskDefId !== null) - ? UserTaskDefId.fromPartial(object.userTaskDefId) - : undefined; - message.userGroup = object.userGroup ?? undefined; - message.userId = object.userId ?? undefined; - message.results = Object.entries(object.results ?? {}).reduce<{ [key: string]: VariableValue }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = VariableValue.fromPartial(value); - } - return acc; - }, - {}, - ); - message.status = object.status ?? UserTaskRunStatus.UNASSIGNED; - message.events = object.events?.map((e) => UserTaskEvent.fromPartial(e)) || []; - message.notes = object.notes ?? undefined; - message.scheduledTime = object.scheduledTime ?? undefined; - message.nodeRunId = (object.nodeRunId !== undefined && object.nodeRunId !== null) - ? NodeRunId.fromPartial(object.nodeRunId) - : undefined; - message.epoch = object.epoch ?? 0; - return message; - }, -}; - -function createBaseUserTaskRun_ResultsEntry(): UserTaskRun_ResultsEntry { - return { key: "", value: undefined }; -} - -export const UserTaskRun_ResultsEntry = { - encode(message: UserTaskRun_ResultsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - VariableValue.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskRun_ResultsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskRun_ResultsEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = VariableValue.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskRun_ResultsEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? VariableValue.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: UserTaskRun_ResultsEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = VariableValue.toJSON(message.value); - } - return obj; - }, - - create, I>>(base?: I): UserTaskRun_ResultsEntry { - return UserTaskRun_ResultsEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskRun_ResultsEntry { - const message = createBaseUserTaskRun_ResultsEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? VariableValue.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseAssignUserTaskRunRequest(): AssignUserTaskRunRequest { - return { userTaskRunId: undefined, overrideClaim: false, userGroup: undefined, userId: undefined }; -} - -export const AssignUserTaskRunRequest = { - encode(message: AssignUserTaskRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.userTaskRunId !== undefined) { - UserTaskRunId.encode(message.userTaskRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.overrideClaim !== false) { - writer.uint32(16).bool(message.overrideClaim); - } - if (message.userGroup !== undefined) { - writer.uint32(26).string(message.userGroup); - } - if (message.userId !== undefined) { - writer.uint32(34).string(message.userId); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): AssignUserTaskRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseAssignUserTaskRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.userTaskRunId = UserTaskRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.overrideClaim = reader.bool(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.userGroup = reader.string(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.userId = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): AssignUserTaskRunRequest { - return { - userTaskRunId: isSet(object.userTaskRunId) ? UserTaskRunId.fromJSON(object.userTaskRunId) : undefined, - overrideClaim: isSet(object.overrideClaim) ? globalThis.Boolean(object.overrideClaim) : false, - userGroup: isSet(object.userGroup) ? globalThis.String(object.userGroup) : undefined, - userId: isSet(object.userId) ? globalThis.String(object.userId) : undefined, - }; - }, - - toJSON(message: AssignUserTaskRunRequest): unknown { - const obj: any = {}; - if (message.userTaskRunId !== undefined) { - obj.userTaskRunId = UserTaskRunId.toJSON(message.userTaskRunId); - } - if (message.overrideClaim !== false) { - obj.overrideClaim = message.overrideClaim; - } - if (message.userGroup !== undefined) { - obj.userGroup = message.userGroup; - } - if (message.userId !== undefined) { - obj.userId = message.userId; - } - return obj; - }, - - create, I>>(base?: I): AssignUserTaskRunRequest { - return AssignUserTaskRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): AssignUserTaskRunRequest { - const message = createBaseAssignUserTaskRunRequest(); - message.userTaskRunId = (object.userTaskRunId !== undefined && object.userTaskRunId !== null) - ? UserTaskRunId.fromPartial(object.userTaskRunId) - : undefined; - message.overrideClaim = object.overrideClaim ?? false; - message.userGroup = object.userGroup ?? undefined; - message.userId = object.userId ?? undefined; - return message; - }, -}; - -function createBaseCompleteUserTaskRunRequest(): CompleteUserTaskRunRequest { - return { userTaskRunId: undefined, results: {}, userId: "" }; -} - -export const CompleteUserTaskRunRequest = { - encode(message: CompleteUserTaskRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.userTaskRunId !== undefined) { - UserTaskRunId.encode(message.userTaskRunId, writer.uint32(10).fork()).ldelim(); - } - Object.entries(message.results).forEach(([key, value]) => { - CompleteUserTaskRunRequest_ResultsEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).ldelim(); - }); - if (message.userId !== "") { - writer.uint32(26).string(message.userId); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): CompleteUserTaskRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseCompleteUserTaskRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.userTaskRunId = UserTaskRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - const entry2 = CompleteUserTaskRunRequest_ResultsEntry.decode(reader, reader.uint32()); - if (entry2.value !== undefined) { - message.results[entry2.key] = entry2.value; - } - continue; - case 3: - if (tag !== 26) { - break; - } - - message.userId = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): CompleteUserTaskRunRequest { - return { - userTaskRunId: isSet(object.userTaskRunId) ? UserTaskRunId.fromJSON(object.userTaskRunId) : undefined, - results: isObject(object.results) - ? Object.entries(object.results).reduce<{ [key: string]: VariableValue }>((acc, [key, value]) => { - acc[key] = VariableValue.fromJSON(value); - return acc; - }, {}) - : {}, - userId: isSet(object.userId) ? globalThis.String(object.userId) : "", - }; - }, - - toJSON(message: CompleteUserTaskRunRequest): unknown { - const obj: any = {}; - if (message.userTaskRunId !== undefined) { - obj.userTaskRunId = UserTaskRunId.toJSON(message.userTaskRunId); - } - if (message.results) { - const entries = Object.entries(message.results); - if (entries.length > 0) { - obj.results = {}; - entries.forEach(([k, v]) => { - obj.results[k] = VariableValue.toJSON(v); - }); - } - } - if (message.userId !== "") { - obj.userId = message.userId; - } - return obj; - }, - - create, I>>(base?: I): CompleteUserTaskRunRequest { - return CompleteUserTaskRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): CompleteUserTaskRunRequest { - const message = createBaseCompleteUserTaskRunRequest(); - message.userTaskRunId = (object.userTaskRunId !== undefined && object.userTaskRunId !== null) - ? UserTaskRunId.fromPartial(object.userTaskRunId) - : undefined; - message.results = Object.entries(object.results ?? {}).reduce<{ [key: string]: VariableValue }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = VariableValue.fromPartial(value); - } - return acc; - }, - {}, - ); - message.userId = object.userId ?? ""; - return message; - }, -}; - -function createBaseCompleteUserTaskRunRequest_ResultsEntry(): CompleteUserTaskRunRequest_ResultsEntry { - return { key: "", value: undefined }; -} - -export const CompleteUserTaskRunRequest_ResultsEntry = { - encode(message: CompleteUserTaskRunRequest_ResultsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - VariableValue.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): CompleteUserTaskRunRequest_ResultsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseCompleteUserTaskRunRequest_ResultsEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = VariableValue.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): CompleteUserTaskRunRequest_ResultsEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? VariableValue.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: CompleteUserTaskRunRequest_ResultsEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = VariableValue.toJSON(message.value); - } - return obj; - }, - - create, I>>( - base?: I, - ): CompleteUserTaskRunRequest_ResultsEntry { - return CompleteUserTaskRunRequest_ResultsEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): CompleteUserTaskRunRequest_ResultsEntry { - const message = createBaseCompleteUserTaskRunRequest_ResultsEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? VariableValue.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseCancelUserTaskRunRequest(): CancelUserTaskRunRequest { - return { userTaskRunId: undefined }; -} - -export const CancelUserTaskRunRequest = { - encode(message: CancelUserTaskRunRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.userTaskRunId !== undefined) { - UserTaskRunId.encode(message.userTaskRunId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): CancelUserTaskRunRequest { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseCancelUserTaskRunRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.userTaskRunId = UserTaskRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): CancelUserTaskRunRequest { - return { userTaskRunId: isSet(object.userTaskRunId) ? UserTaskRunId.fromJSON(object.userTaskRunId) : undefined }; - }, - - toJSON(message: CancelUserTaskRunRequest): unknown { - const obj: any = {}; - if (message.userTaskRunId !== undefined) { - obj.userTaskRunId = UserTaskRunId.toJSON(message.userTaskRunId); - } - return obj; - }, - - create, I>>(base?: I): CancelUserTaskRunRequest { - return CancelUserTaskRunRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): CancelUserTaskRunRequest { - const message = createBaseCancelUserTaskRunRequest(); - message.userTaskRunId = (object.userTaskRunId !== undefined && object.userTaskRunId !== null) - ? UserTaskRunId.fromPartial(object.userTaskRunId) - : undefined; - return message; - }, -}; - -function createBaseUserTaskTriggerReference(): UserTaskTriggerReference { - return { nodeRunId: undefined, userTaskEventNumber: 0, userId: undefined, userGroup: undefined }; -} - -export const UserTaskTriggerReference = { - encode(message: UserTaskTriggerReference, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.nodeRunId !== undefined) { - NodeRunId.encode(message.nodeRunId, writer.uint32(10).fork()).ldelim(); - } - if (message.userTaskEventNumber !== 0) { - writer.uint32(16).int32(message.userTaskEventNumber); - } - if (message.userId !== undefined) { - writer.uint32(26).string(message.userId); - } - if (message.userGroup !== undefined) { - writer.uint32(34).string(message.userGroup); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskTriggerReference { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskTriggerReference(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.nodeRunId = NodeRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.userTaskEventNumber = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.userId = reader.string(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.userGroup = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskTriggerReference { - return { - nodeRunId: isSet(object.nodeRunId) ? NodeRunId.fromJSON(object.nodeRunId) : undefined, - userTaskEventNumber: isSet(object.userTaskEventNumber) ? globalThis.Number(object.userTaskEventNumber) : 0, - userId: isSet(object.userId) ? globalThis.String(object.userId) : undefined, - userGroup: isSet(object.userGroup) ? globalThis.String(object.userGroup) : undefined, - }; - }, - - toJSON(message: UserTaskTriggerReference): unknown { - const obj: any = {}; - if (message.nodeRunId !== undefined) { - obj.nodeRunId = NodeRunId.toJSON(message.nodeRunId); - } - if (message.userTaskEventNumber !== 0) { - obj.userTaskEventNumber = Math.round(message.userTaskEventNumber); - } - if (message.userId !== undefined) { - obj.userId = message.userId; - } - if (message.userGroup !== undefined) { - obj.userGroup = message.userGroup; - } - return obj; - }, - - create, I>>(base?: I): UserTaskTriggerReference { - return UserTaskTriggerReference.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskTriggerReference { - const message = createBaseUserTaskTriggerReference(); - message.nodeRunId = (object.nodeRunId !== undefined && object.nodeRunId !== null) - ? NodeRunId.fromPartial(object.nodeRunId) - : undefined; - message.userTaskEventNumber = object.userTaskEventNumber ?? 0; - message.userId = object.userId ?? undefined; - message.userGroup = object.userGroup ?? undefined; - return message; - }, -}; - -function createBaseUserTaskEvent(): UserTaskEvent { - return { time: undefined, taskExecuted: undefined, assigned: undefined, cancelled: undefined }; -} - -export const UserTaskEvent = { - encode(message: UserTaskEvent, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.time !== undefined) { - Timestamp.encode(toTimestamp(message.time), writer.uint32(10).fork()).ldelim(); - } - if (message.taskExecuted !== undefined) { - UserTaskEvent_UTETaskExecuted.encode(message.taskExecuted, writer.uint32(18).fork()).ldelim(); - } - if (message.assigned !== undefined) { - UserTaskEvent_UTEAssigned.encode(message.assigned, writer.uint32(26).fork()).ldelim(); - } - if (message.cancelled !== undefined) { - UserTaskEvent_UTECancelled.encode(message.cancelled, writer.uint32(34).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskEvent { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskEvent(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.time = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.taskExecuted = UserTaskEvent_UTETaskExecuted.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.assigned = UserTaskEvent_UTEAssigned.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.cancelled = UserTaskEvent_UTECancelled.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskEvent { - return { - time: isSet(object.time) ? globalThis.String(object.time) : undefined, - taskExecuted: isSet(object.taskExecuted) - ? UserTaskEvent_UTETaskExecuted.fromJSON(object.taskExecuted) - : undefined, - assigned: isSet(object.assigned) ? UserTaskEvent_UTEAssigned.fromJSON(object.assigned) : undefined, - cancelled: isSet(object.cancelled) ? UserTaskEvent_UTECancelled.fromJSON(object.cancelled) : undefined, - }; - }, - - toJSON(message: UserTaskEvent): unknown { - const obj: any = {}; - if (message.time !== undefined) { - obj.time = message.time; - } - if (message.taskExecuted !== undefined) { - obj.taskExecuted = UserTaskEvent_UTETaskExecuted.toJSON(message.taskExecuted); - } - if (message.assigned !== undefined) { - obj.assigned = UserTaskEvent_UTEAssigned.toJSON(message.assigned); - } - if (message.cancelled !== undefined) { - obj.cancelled = UserTaskEvent_UTECancelled.toJSON(message.cancelled); - } - return obj; - }, - - create, I>>(base?: I): UserTaskEvent { - return UserTaskEvent.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskEvent { - const message = createBaseUserTaskEvent(); - message.time = object.time ?? undefined; - message.taskExecuted = (object.taskExecuted !== undefined && object.taskExecuted !== null) - ? UserTaskEvent_UTETaskExecuted.fromPartial(object.taskExecuted) - : undefined; - message.assigned = (object.assigned !== undefined && object.assigned !== null) - ? UserTaskEvent_UTEAssigned.fromPartial(object.assigned) - : undefined; - message.cancelled = (object.cancelled !== undefined && object.cancelled !== null) - ? UserTaskEvent_UTECancelled.fromPartial(object.cancelled) - : undefined; - return message; - }, -}; - -function createBaseUserTaskEvent_UTECancelled(): UserTaskEvent_UTECancelled { - return { message: "" }; -} - -export const UserTaskEvent_UTECancelled = { - encode(message: UserTaskEvent_UTECancelled, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.message !== "") { - writer.uint32(10).string(message.message); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskEvent_UTECancelled { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskEvent_UTECancelled(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.message = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskEvent_UTECancelled { - return { message: isSet(object.message) ? globalThis.String(object.message) : "" }; - }, - - toJSON(message: UserTaskEvent_UTECancelled): unknown { - const obj: any = {}; - if (message.message !== "") { - obj.message = message.message; - } - return obj; - }, - - create, I>>(base?: I): UserTaskEvent_UTECancelled { - return UserTaskEvent_UTECancelled.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskEvent_UTECancelled { - const message = createBaseUserTaskEvent_UTECancelled(); - message.message = object.message ?? ""; - return message; - }, -}; - -function createBaseUserTaskEvent_UTETaskExecuted(): UserTaskEvent_UTETaskExecuted { - return { taskRun: undefined }; -} - -export const UserTaskEvent_UTETaskExecuted = { - encode(message: UserTaskEvent_UTETaskExecuted, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.taskRun !== undefined) { - TaskRunId.encode(message.taskRun, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskEvent_UTETaskExecuted { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskEvent_UTETaskExecuted(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.taskRun = TaskRunId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskEvent_UTETaskExecuted { - return { taskRun: isSet(object.taskRun) ? TaskRunId.fromJSON(object.taskRun) : undefined }; - }, - - toJSON(message: UserTaskEvent_UTETaskExecuted): unknown { - const obj: any = {}; - if (message.taskRun !== undefined) { - obj.taskRun = TaskRunId.toJSON(message.taskRun); - } - return obj; - }, - - create, I>>(base?: I): UserTaskEvent_UTETaskExecuted { - return UserTaskEvent_UTETaskExecuted.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): UserTaskEvent_UTETaskExecuted { - const message = createBaseUserTaskEvent_UTETaskExecuted(); - message.taskRun = (object.taskRun !== undefined && object.taskRun !== null) - ? TaskRunId.fromPartial(object.taskRun) - : undefined; - return message; - }, -}; - -function createBaseUserTaskEvent_UTEAssigned(): UserTaskEvent_UTEAssigned { - return { oldUserId: undefined, oldUserGroup: undefined, newUserId: undefined, newUserGroup: undefined }; -} - -export const UserTaskEvent_UTEAssigned = { - encode(message: UserTaskEvent_UTEAssigned, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.oldUserId !== undefined) { - writer.uint32(10).string(message.oldUserId); - } - if (message.oldUserGroup !== undefined) { - writer.uint32(18).string(message.oldUserGroup); - } - if (message.newUserId !== undefined) { - writer.uint32(26).string(message.newUserId); - } - if (message.newUserGroup !== undefined) { - writer.uint32(34).string(message.newUserGroup); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskEvent_UTEAssigned { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskEvent_UTEAssigned(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.oldUserId = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.oldUserGroup = reader.string(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.newUserId = reader.string(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.newUserGroup = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskEvent_UTEAssigned { - return { - oldUserId: isSet(object.oldUserId) ? globalThis.String(object.oldUserId) : undefined, - oldUserGroup: isSet(object.oldUserGroup) ? globalThis.String(object.oldUserGroup) : undefined, - newUserId: isSet(object.newUserId) ? globalThis.String(object.newUserId) : undefined, - newUserGroup: isSet(object.newUserGroup) ? globalThis.String(object.newUserGroup) : undefined, - }; - }, - - toJSON(message: UserTaskEvent_UTEAssigned): unknown { - const obj: any = {}; - if (message.oldUserId !== undefined) { - obj.oldUserId = message.oldUserId; - } - if (message.oldUserGroup !== undefined) { - obj.oldUserGroup = message.oldUserGroup; - } - if (message.newUserId !== undefined) { - obj.newUserId = message.newUserId; - } - if (message.newUserGroup !== undefined) { - obj.newUserGroup = message.newUserGroup; - } - return obj; - }, - - create, I>>(base?: I): UserTaskEvent_UTEAssigned { - return UserTaskEvent_UTEAssigned.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskEvent_UTEAssigned { - const message = createBaseUserTaskEvent_UTEAssigned(); - message.oldUserId = object.oldUserId ?? undefined; - message.oldUserGroup = object.oldUserGroup ?? undefined; - message.newUserId = object.newUserId ?? undefined; - message.newUserGroup = object.newUserGroup ?? undefined; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function isObject(value: any): boolean { - return typeof value === "object" && value !== null; -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/variable.ts b/dashboard/apps/web/littlehorse-public-api/variable.ts deleted file mode 100644 index fc45a8a33..000000000 --- a/dashboard/apps/web/littlehorse-public-api/variable.ts +++ /dev/null @@ -1,393 +0,0 @@ -/* eslint-disable */ -import Long from "long"; -import * as _m0 from "protobufjs/minimal"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { VariableId, WfSpecId } from "./object_id"; - -export const protobufPackage = "littlehorse"; - -/** - * VariableValue is a structure containing a value in LittleHorse. It can be - * used to pass input variables into a WfRun/ThreadRun/TaskRun/etc, as output - * from a TaskRun, as the value of a WfRun's Variable, etc. - */ -export interface VariableValue { - /** A String representing a serialized json object. */ - jsonObj?: - | string - | undefined; - /** A String representing a serialized json list. */ - jsonArr?: - | string - | undefined; - /** A 64-bit floating point number. */ - double?: - | number - | undefined; - /** A boolean. */ - bool?: - | boolean - | undefined; - /** A string. */ - str?: - | string - | undefined; - /** A 64-bit integer. */ - int?: - | number - | undefined; - /** An arbitrary String of bytes. */ - bytes?: Uint8Array | undefined; -} - -/** A Variable is an instance of a variable assigned to a WfRun. */ -export interface Variable { - /** - * ID of this Variable. Note that the VariableId contains the relevant - * WfRunId inside it, the threadRunNumber, and the name of the Variabe. - */ - id: - | VariableId - | undefined; - /** The value of this Variable. */ - value: - | VariableValue - | undefined; - /** When the Variable was created. */ - createdAt: - | string - | undefined; - /** The ID of the WfSpec that this Variable belongs to. */ - wfSpecId: WfSpecId | undefined; -} - -function createBaseVariableValue(): VariableValue { - return { - jsonObj: undefined, - jsonArr: undefined, - double: undefined, - bool: undefined, - str: undefined, - int: undefined, - bytes: undefined, - }; -} - -export const VariableValue = { - encode(message: VariableValue, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.jsonObj !== undefined) { - writer.uint32(18).string(message.jsonObj); - } - if (message.jsonArr !== undefined) { - writer.uint32(26).string(message.jsonArr); - } - if (message.double !== undefined) { - writer.uint32(33).double(message.double); - } - if (message.bool !== undefined) { - writer.uint32(40).bool(message.bool); - } - if (message.str !== undefined) { - writer.uint32(50).string(message.str); - } - if (message.int !== undefined) { - writer.uint32(56).int64(message.int); - } - if (message.bytes !== undefined) { - writer.uint32(66).bytes(message.bytes); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): VariableValue { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariableValue(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 2: - if (tag !== 18) { - break; - } - - message.jsonObj = reader.string(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.jsonArr = reader.string(); - continue; - case 4: - if (tag !== 33) { - break; - } - - message.double = reader.double(); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.bool = reader.bool(); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.str = reader.string(); - continue; - case 7: - if (tag !== 56) { - break; - } - - message.int = longToNumber(reader.int64() as Long); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.bytes = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): VariableValue { - return { - jsonObj: isSet(object.jsonObj) ? globalThis.String(object.jsonObj) : undefined, - jsonArr: isSet(object.jsonArr) ? globalThis.String(object.jsonArr) : undefined, - double: isSet(object.double) ? globalThis.Number(object.double) : undefined, - bool: isSet(object.bool) ? globalThis.Boolean(object.bool) : undefined, - str: isSet(object.str) ? globalThis.String(object.str) : undefined, - int: isSet(object.int) ? globalThis.Number(object.int) : undefined, - bytes: isSet(object.bytes) ? bytesFromBase64(object.bytes) : undefined, - }; - }, - - toJSON(message: VariableValue): unknown { - const obj: any = {}; - if (message.jsonObj !== undefined) { - obj.jsonObj = message.jsonObj; - } - if (message.jsonArr !== undefined) { - obj.jsonArr = message.jsonArr; - } - if (message.double !== undefined) { - obj.double = message.double; - } - if (message.bool !== undefined) { - obj.bool = message.bool; - } - if (message.str !== undefined) { - obj.str = message.str; - } - if (message.int !== undefined) { - obj.int = Math.round(message.int); - } - if (message.bytes !== undefined) { - obj.bytes = base64FromBytes(message.bytes); - } - return obj; - }, - - create, I>>(base?: I): VariableValue { - return VariableValue.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): VariableValue { - const message = createBaseVariableValue(); - message.jsonObj = object.jsonObj ?? undefined; - message.jsonArr = object.jsonArr ?? undefined; - message.double = object.double ?? undefined; - message.bool = object.bool ?? undefined; - message.str = object.str ?? undefined; - message.int = object.int ?? undefined; - message.bytes = object.bytes ?? undefined; - return message; - }, -}; - -function createBaseVariable(): Variable { - return { id: undefined, value: undefined, createdAt: undefined, wfSpecId: undefined }; -} - -export const Variable = { - encode(message: Variable, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - VariableId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.value !== undefined) { - VariableValue.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(26).fork()).ldelim(); - } - if (message.wfSpecId !== undefined) { - WfSpecId.encode(message.wfSpecId, writer.uint32(34).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Variable { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVariable(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = VariableId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = VariableValue.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.wfSpecId = WfSpecId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): Variable { - return { - id: isSet(object.id) ? VariableId.fromJSON(object.id) : undefined, - value: isSet(object.value) ? VariableValue.fromJSON(object.value) : undefined, - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - wfSpecId: isSet(object.wfSpecId) ? WfSpecId.fromJSON(object.wfSpecId) : undefined, - }; - }, - - toJSON(message: Variable): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = VariableId.toJSON(message.id); - } - if (message.value !== undefined) { - obj.value = VariableValue.toJSON(message.value); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - if (message.wfSpecId !== undefined) { - obj.wfSpecId = WfSpecId.toJSON(message.wfSpecId); - } - return obj; - }, - - create, I>>(base?: I): Variable { - return Variable.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Variable { - const message = createBaseVariable(); - message.id = (object.id !== undefined && object.id !== null) ? VariableId.fromPartial(object.id) : undefined; - message.value = (object.value !== undefined && object.value !== null) - ? VariableValue.fromPartial(object.value) - : undefined; - message.createdAt = object.createdAt ?? undefined; - message.wfSpecId = (object.wfSpecId !== undefined && object.wfSpecId !== null) - ? WfSpecId.fromPartial(object.wfSpecId) - : undefined; - return message; - }, -}; - -function bytesFromBase64(b64: string): Uint8Array { - if ((globalThis as any).Buffer) { - return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); - } else { - const bin = globalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } -} - -function base64FromBytes(arr: Uint8Array): string { - if ((globalThis as any).Buffer) { - return globalThis.Buffer.from(arr).toString("base64"); - } else { - const bin: string[] = []; - arr.forEach((byte) => { - bin.push(globalThis.String.fromCharCode(byte)); - }); - return globalThis.btoa(bin.join("")); - } -} - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function longToNumber(long: Long): number { - if (long.gt(globalThis.Number.MAX_SAFE_INTEGER)) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - return long.toNumber(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/wf_run.ts b/dashboard/apps/web/littlehorse-public-api/wf_run.ts deleted file mode 100644 index 2c123899d..000000000 --- a/dashboard/apps/web/littlehorse-public-api/wf_run.ts +++ /dev/null @@ -1,1645 +0,0 @@ -/* eslint-disable */ -import * as _m0 from "protobufjs/minimal"; -import { LHStatus, lHStatusFromJSON, lHStatusToJSON, lHStatusToNumber } from "./common_enums"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { ExternalEventId, WfRunId, WfSpecId } from "./object_id"; - -export const protobufPackage = "littlehorse"; - -/** The type of a ThreadRUn. */ -export enum ThreadType { - /** ENTRYPOINT - The ENTRYPOINT ThreadRun. Exactly one per WfRun. Always has number == 0. */ - ENTRYPOINT = "ENTRYPOINT", - /** - * CHILD - A ThreadRun explicitly created by another ThreadRun via a START_THREAD or START_MULTIPLE_THREADS - * NodeRun. - */ - CHILD = "CHILD", - /** INTERRUPT - A ThreadRun that was created to handle an Interrupt. */ - INTERRUPT = "INTERRUPT", - /** FAILURE_HANDLER - A ThreadRun that was created to handle a Failure. */ - FAILURE_HANDLER = "FAILURE_HANDLER", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function threadTypeFromJSON(object: any): ThreadType { - switch (object) { - case 0: - case "ENTRYPOINT": - return ThreadType.ENTRYPOINT; - case 1: - case "CHILD": - return ThreadType.CHILD; - case 2: - case "INTERRUPT": - return ThreadType.INTERRUPT; - case 3: - case "FAILURE_HANDLER": - return ThreadType.FAILURE_HANDLER; - case -1: - case "UNRECOGNIZED": - default: - return ThreadType.UNRECOGNIZED; - } -} - -export function threadTypeToJSON(object: ThreadType): string { - switch (object) { - case ThreadType.ENTRYPOINT: - return "ENTRYPOINT"; - case ThreadType.CHILD: - return "CHILD"; - case ThreadType.INTERRUPT: - return "INTERRUPT"; - case ThreadType.FAILURE_HANDLER: - return "FAILURE_HANDLER"; - case ThreadType.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function threadTypeToNumber(object: ThreadType): number { - switch (object) { - case ThreadType.ENTRYPOINT: - return 0; - case ThreadType.CHILD: - return 1; - case ThreadType.INTERRUPT: - return 2; - case ThreadType.FAILURE_HANDLER: - return 3; - case ThreadType.UNRECOGNIZED: - default: - return -1; - } -} - -/** A WfRun is a running instance of a WfSpec. */ -export interface WfRun { - /** The ID of the WfRun. */ - id: - | WfRunId - | undefined; - /** The ID of the WfSpec that this WfRun belongs to. */ - wfSpecId: - | WfSpecId - | undefined; - /** - * When a WfRun is migrated from an old verison of a WfSpec to a newer one, we add the - * old WfSpecId to this list for historical auditing and debugging purposes. - */ - oldWfSpecVersions: WfSpecId[]; - /** The status of this WfRun. */ - status: LHStatus; - /** - * The ID number of the greatest ThreadRUn in this WfRun. The total number of ThreadRuns - * is given by greatest_thread_run_number + 1. - * - * Introduced now since with ThreadRun-level retention, we can't rely upon - * thread_runs.size() to determine the number of ThreadRuns, as a ThreadRun is removed - * from the thread_runs list once its retention period expires. - */ - greatestThreadrunNumber: number; - /** The time the WfRun was started. */ - startTime: - | string - | undefined; - /** The time the WfRun failed or completed. */ - endTime?: - | string - | undefined; - /** - * A list of all active ThreadRun's and terminated ThreadRun's whose retention periods - * have not yet expired. - */ - threadRuns: ThreadRun[]; - /** - * A list of Interrupt events that will fire once their appropriate ThreadRun's finish - * halting. - */ - pendingInterrupts: PendingInterrupt[]; - /** - * A list of pending failure handlers which will fire once their appropriate ThreadRun's - * finish halting. - */ - pendingFailures: PendingFailureHandler[]; -} - -/** A ThreadRun is a running thread of execution within a WfRun. */ -export interface ThreadRun { - /** - * The current WfSpecId of this ThreadRun. This must be set explicitly because - * during a WfSpec Version Migration, it is possible for different ThreadSpec's to - * have different WfSpec versions. - */ - wfSpecId: - | WfSpecId - | undefined; - /** - * The number of the ThreadRun. This is an auto-incremented integer corresponding to - * the chronological ordering of when the ThreadRun's were created. If you have not - * configured any retention policy for the ThreadRun's (i.e. never clean them up), then - * this also corresponds to the position of the ThreadRun in the WfRun's `thread_runs` - * list. - */ - number: number; - /** The status of the ThreadRun. */ - status: LHStatus; - /** The name of the ThreadSpec being run. */ - threadSpecName: string; - /** The time the ThreadRun was started. */ - startTime: - | string - | undefined; - /** The time the ThreadRun was completed or failed. Unset if still active. */ - endTime?: - | string - | undefined; - /** Human-readable error message detailing what went wrong in the case of a failure. */ - errorMessage?: - | string - | undefined; - /** List of thread_run_number's for all child thread_runs. */ - childThreadIds: number[]; - /** Set for every ThreadRun except the ENTRYPOINT. This is the id of the parent thread. */ - parentThreadId?: - | number - | undefined; - /** - * If the ThreadRun is HALTED, this contains a list of every reason for which the - * ThreadRun is HALTED. Once every reason is "resolved" (and thus removed from the list), - * then the ThreadRun will return to the RUNNING state. - */ - haltReasons: ThreadHaltReason[]; - /** - * If this ThreadRun is of type INTERRUPT_HANDLER, this field is set to the ID of the - * ExternalEvent that caused the Interrupt. - */ - interruptTriggerId?: - | ExternalEventId - | undefined; - /** - * If this ThreadRun is of type FAILURE_HANDLER, this field is set to the exact Failure - * that is being handled by this ThreadRun. - */ - failureBeingHandled?: - | FailureBeingHandled - | undefined; - /** - * This is the current `position` of the current NodeRun being run. This is an - * auto-incremented field that gets incremented every time we run a new NodeRun. - */ - currentNodePosition: number; - /** - * List of every child ThreadRun which both a) failed, and b) was properly handled by a - * Failure Handler. - * - * This is important because at the EXIT node, if a Child ThreadRun was discovered to have - * failed, then this ThreadRun (the parent) also fails with the same failure as the child. - * If, however, a Failure Handler had previously "handled" the Child Failure, that ThreadRun's - * number is appended to this list, and then the EXIT node ignores that ThreadRun. - */ - handledFailedChildren: number[]; - /** The Type of this ThreadRun. */ - type: ThreadType; -} - -/** Points to the Failure that is currently being handled in the ThreadRun. */ -export interface FailureBeingHandled { - /** The thread run number. */ - threadRunNumber: number; - /** The position of the NodeRun causing the failure. */ - nodeRunPosition: number; - /** The number of the failure. */ - failureNumber: number; -} - -/** - * Represents an ExternalEvent that has a registered Interrupt Handler for it - * and which is pending to be sent to the relevant ThreadRun's. - */ -export interface PendingInterrupt { - /** The ID of the ExternalEvent triggering the Interrupt. */ - externalEventId: - | ExternalEventId - | undefined; - /** The name of the ThreadSpec to run to handle the Interrupt. */ - handlerSpecName: string; - /** - * The ID of the ThreadRun to interrupt. Must wait for this ThreadRun to be - * HALTED before running the Interrupt Handler. - */ - interruptedThreadId: number; -} - -/** Represents a Failure Handler that is pending to be run. */ -export interface PendingFailureHandler { - /** The ThreadRun that failed. */ - failedThreadRun: number; - /** The name of the ThreadSpec to run to handle the failure. */ - handlerSpecName: string; -} - -/** - * A Halt Reason denoting that a ThreadRun is halted while waiting for an Interrupt handler - * to be run. - */ -export interface PendingInterruptHaltReason { - /** The ExternalEventId that caused the Interrupt. */ - externalEventId: ExternalEventId | undefined; -} - -/** - * A Halt Reason denoting that a ThreadRun is halted while a Failure Handler is *enqueued* to be - * run. - */ -export interface PendingFailureHandlerHaltReason { - /** The position of the NodeRun which threw the failure. */ - nodeRunPosition: number; -} - -/** A Halt Reason denoting that a ThreadRun is halted while a Failure Handler is being run. */ -export interface HandlingFailureHaltReason { - /** The ID of the Failure Handler ThreadRun. */ - handlerThreadId: number; -} - -/** A Halt Reason denoting that a ThreadRun is halted because its parent is also HALTED. */ -export interface ParentHalted { - /** The ID of the halted parent. */ - parentThreadId: number; -} - -/** - * A Halt Reason denoting that a ThreadRun is halted because it is waiting for the - * interrupt handler threadRun to run. - */ -export interface Interrupted { - /** The ID of the Interrupt Handler ThreadRun. */ - interruptThreadId: number; -} - -/** A Halt Reason denoting that a ThreadRun was halted manually, via the `rpc StopWfRun` request. */ -export interface ManualHalt { - /** Nothing to store. */ - meaningOfLife: boolean; -} - -/** Denotes a reason why a ThreadRun is halted. See `ThreadRun.halt_reasons` for context. */ -export interface ThreadHaltReason { - /** Parent threadRun halted. */ - parentHalted?: - | ParentHalted - | undefined; - /** Handling an Interrupt. */ - interrupted?: - | Interrupted - | undefined; - /** Waiting to handle Interrupt. */ - pendingInterrupt?: - | PendingInterruptHaltReason - | undefined; - /** Waiting to handle a failure. */ - pendingFailure?: - | PendingFailureHandlerHaltReason - | undefined; - /** Handling a failure. */ - handlingFailure?: - | HandlingFailureHaltReason - | undefined; - /** Manually stopped the WfRun. */ - manualHalt?: ManualHalt | undefined; -} - -function createBaseWfRun(): WfRun { - return { - id: undefined, - wfSpecId: undefined, - oldWfSpecVersions: [], - status: LHStatus.STARTING, - greatestThreadrunNumber: 0, - startTime: undefined, - endTime: undefined, - threadRuns: [], - pendingInterrupts: [], - pendingFailures: [], - }; -} - -export const WfRun = { - encode(message: WfRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - WfRunId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.wfSpecId !== undefined) { - WfSpecId.encode(message.wfSpecId, writer.uint32(18).fork()).ldelim(); - } - for (const v of message.oldWfSpecVersions) { - WfSpecId.encode(v!, writer.uint32(26).fork()).ldelim(); - } - if (message.status !== LHStatus.STARTING) { - writer.uint32(32).int32(lHStatusToNumber(message.status)); - } - if (message.greatestThreadrunNumber !== 0) { - writer.uint32(40).int32(message.greatestThreadrunNumber); - } - if (message.startTime !== undefined) { - Timestamp.encode(toTimestamp(message.startTime), writer.uint32(50).fork()).ldelim(); - } - if (message.endTime !== undefined) { - Timestamp.encode(toTimestamp(message.endTime), writer.uint32(58).fork()).ldelim(); - } - for (const v of message.threadRuns) { - ThreadRun.encode(v!, writer.uint32(66).fork()).ldelim(); - } - for (const v of message.pendingInterrupts) { - PendingInterrupt.encode(v!, writer.uint32(74).fork()).ldelim(); - } - for (const v of message.pendingFailures) { - PendingFailureHandler.encode(v!, writer.uint32(82).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = WfRunId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.wfSpecId = WfSpecId.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.oldWfSpecVersions.push(WfSpecId.decode(reader, reader.uint32())); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.status = lHStatusFromJSON(reader.int32()); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.greatestThreadrunNumber = reader.int32(); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.startTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.endTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.threadRuns.push(ThreadRun.decode(reader, reader.uint32())); - continue; - case 9: - if (tag !== 74) { - break; - } - - message.pendingInterrupts.push(PendingInterrupt.decode(reader, reader.uint32())); - continue; - case 10: - if (tag !== 82) { - break; - } - - message.pendingFailures.push(PendingFailureHandler.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfRun { - return { - id: isSet(object.id) ? WfRunId.fromJSON(object.id) : undefined, - wfSpecId: isSet(object.wfSpecId) ? WfSpecId.fromJSON(object.wfSpecId) : undefined, - oldWfSpecVersions: globalThis.Array.isArray(object?.oldWfSpecVersions) - ? object.oldWfSpecVersions.map((e: any) => WfSpecId.fromJSON(e)) - : [], - status: isSet(object.status) ? lHStatusFromJSON(object.status) : LHStatus.STARTING, - greatestThreadrunNumber: isSet(object.greatestThreadrunNumber) - ? globalThis.Number(object.greatestThreadrunNumber) - : 0, - startTime: isSet(object.startTime) ? globalThis.String(object.startTime) : undefined, - endTime: isSet(object.endTime) ? globalThis.String(object.endTime) : undefined, - threadRuns: globalThis.Array.isArray(object?.threadRuns) - ? object.threadRuns.map((e: any) => ThreadRun.fromJSON(e)) - : [], - pendingInterrupts: globalThis.Array.isArray(object?.pendingInterrupts) - ? object.pendingInterrupts.map((e: any) => PendingInterrupt.fromJSON(e)) - : [], - pendingFailures: globalThis.Array.isArray(object?.pendingFailures) - ? object.pendingFailures.map((e: any) => PendingFailureHandler.fromJSON(e)) - : [], - }; - }, - - toJSON(message: WfRun): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = WfRunId.toJSON(message.id); - } - if (message.wfSpecId !== undefined) { - obj.wfSpecId = WfSpecId.toJSON(message.wfSpecId); - } - if (message.oldWfSpecVersions?.length) { - obj.oldWfSpecVersions = message.oldWfSpecVersions.map((e) => WfSpecId.toJSON(e)); - } - if (message.status !== LHStatus.STARTING) { - obj.status = lHStatusToJSON(message.status); - } - if (message.greatestThreadrunNumber !== 0) { - obj.greatestThreadrunNumber = Math.round(message.greatestThreadrunNumber); - } - if (message.startTime !== undefined) { - obj.startTime = message.startTime; - } - if (message.endTime !== undefined) { - obj.endTime = message.endTime; - } - if (message.threadRuns?.length) { - obj.threadRuns = message.threadRuns.map((e) => ThreadRun.toJSON(e)); - } - if (message.pendingInterrupts?.length) { - obj.pendingInterrupts = message.pendingInterrupts.map((e) => PendingInterrupt.toJSON(e)); - } - if (message.pendingFailures?.length) { - obj.pendingFailures = message.pendingFailures.map((e) => PendingFailureHandler.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): WfRun { - return WfRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfRun { - const message = createBaseWfRun(); - message.id = (object.id !== undefined && object.id !== null) ? WfRunId.fromPartial(object.id) : undefined; - message.wfSpecId = (object.wfSpecId !== undefined && object.wfSpecId !== null) - ? WfSpecId.fromPartial(object.wfSpecId) - : undefined; - message.oldWfSpecVersions = object.oldWfSpecVersions?.map((e) => WfSpecId.fromPartial(e)) || []; - message.status = object.status ?? LHStatus.STARTING; - message.greatestThreadrunNumber = object.greatestThreadrunNumber ?? 0; - message.startTime = object.startTime ?? undefined; - message.endTime = object.endTime ?? undefined; - message.threadRuns = object.threadRuns?.map((e) => ThreadRun.fromPartial(e)) || []; - message.pendingInterrupts = object.pendingInterrupts?.map((e) => PendingInterrupt.fromPartial(e)) || []; - message.pendingFailures = object.pendingFailures?.map((e) => PendingFailureHandler.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseThreadRun(): ThreadRun { - return { - wfSpecId: undefined, - number: 0, - status: LHStatus.STARTING, - threadSpecName: "", - startTime: undefined, - endTime: undefined, - errorMessage: undefined, - childThreadIds: [], - parentThreadId: undefined, - haltReasons: [], - interruptTriggerId: undefined, - failureBeingHandled: undefined, - currentNodePosition: 0, - handledFailedChildren: [], - type: ThreadType.ENTRYPOINT, - }; -} - -export const ThreadRun = { - encode(message: ThreadRun, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfSpecId !== undefined) { - WfSpecId.encode(message.wfSpecId, writer.uint32(10).fork()).ldelim(); - } - if (message.number !== 0) { - writer.uint32(16).int32(message.number); - } - if (message.status !== LHStatus.STARTING) { - writer.uint32(24).int32(lHStatusToNumber(message.status)); - } - if (message.threadSpecName !== "") { - writer.uint32(34).string(message.threadSpecName); - } - if (message.startTime !== undefined) { - Timestamp.encode(toTimestamp(message.startTime), writer.uint32(42).fork()).ldelim(); - } - if (message.endTime !== undefined) { - Timestamp.encode(toTimestamp(message.endTime), writer.uint32(50).fork()).ldelim(); - } - if (message.errorMessage !== undefined) { - writer.uint32(58).string(message.errorMessage); - } - writer.uint32(66).fork(); - for (const v of message.childThreadIds) { - writer.int32(v); - } - writer.ldelim(); - if (message.parentThreadId !== undefined) { - writer.uint32(72).int32(message.parentThreadId); - } - for (const v of message.haltReasons) { - ThreadHaltReason.encode(v!, writer.uint32(82).fork()).ldelim(); - } - if (message.interruptTriggerId !== undefined) { - ExternalEventId.encode(message.interruptTriggerId, writer.uint32(90).fork()).ldelim(); - } - if (message.failureBeingHandled !== undefined) { - FailureBeingHandled.encode(message.failureBeingHandled, writer.uint32(98).fork()).ldelim(); - } - if (message.currentNodePosition !== 0) { - writer.uint32(104).int32(message.currentNodePosition); - } - writer.uint32(114).fork(); - for (const v of message.handledFailedChildren) { - writer.int32(v); - } - writer.ldelim(); - if (message.type !== ThreadType.ENTRYPOINT) { - writer.uint32(120).int32(threadTypeToNumber(message.type)); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ThreadRun { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseThreadRun(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfSpecId = WfSpecId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.number = reader.int32(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.status = lHStatusFromJSON(reader.int32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.threadSpecName = reader.string(); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.startTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.endTime = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.errorMessage = reader.string(); - continue; - case 8: - if (tag === 64) { - message.childThreadIds.push(reader.int32()); - - continue; - } - - if (tag === 66) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.childThreadIds.push(reader.int32()); - } - - continue; - } - - break; - case 9: - if (tag !== 72) { - break; - } - - message.parentThreadId = reader.int32(); - continue; - case 10: - if (tag !== 82) { - break; - } - - message.haltReasons.push(ThreadHaltReason.decode(reader, reader.uint32())); - continue; - case 11: - if (tag !== 90) { - break; - } - - message.interruptTriggerId = ExternalEventId.decode(reader, reader.uint32()); - continue; - case 12: - if (tag !== 98) { - break; - } - - message.failureBeingHandled = FailureBeingHandled.decode(reader, reader.uint32()); - continue; - case 13: - if (tag !== 104) { - break; - } - - message.currentNodePosition = reader.int32(); - continue; - case 14: - if (tag === 112) { - message.handledFailedChildren.push(reader.int32()); - - continue; - } - - if (tag === 114) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.handledFailedChildren.push(reader.int32()); - } - - continue; - } - - break; - case 15: - if (tag !== 120) { - break; - } - - message.type = threadTypeFromJSON(reader.int32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ThreadRun { - return { - wfSpecId: isSet(object.wfSpecId) ? WfSpecId.fromJSON(object.wfSpecId) : undefined, - number: isSet(object.number) ? globalThis.Number(object.number) : 0, - status: isSet(object.status) ? lHStatusFromJSON(object.status) : LHStatus.STARTING, - threadSpecName: isSet(object.threadSpecName) ? globalThis.String(object.threadSpecName) : "", - startTime: isSet(object.startTime) ? globalThis.String(object.startTime) : undefined, - endTime: isSet(object.endTime) ? globalThis.String(object.endTime) : undefined, - errorMessage: isSet(object.errorMessage) ? globalThis.String(object.errorMessage) : undefined, - childThreadIds: globalThis.Array.isArray(object?.childThreadIds) - ? object.childThreadIds.map((e: any) => globalThis.Number(e)) - : [], - parentThreadId: isSet(object.parentThreadId) ? globalThis.Number(object.parentThreadId) : undefined, - haltReasons: globalThis.Array.isArray(object?.haltReasons) - ? object.haltReasons.map((e: any) => ThreadHaltReason.fromJSON(e)) - : [], - interruptTriggerId: isSet(object.interruptTriggerId) - ? ExternalEventId.fromJSON(object.interruptTriggerId) - : undefined, - failureBeingHandled: isSet(object.failureBeingHandled) - ? FailureBeingHandled.fromJSON(object.failureBeingHandled) - : undefined, - currentNodePosition: isSet(object.currentNodePosition) ? globalThis.Number(object.currentNodePosition) : 0, - handledFailedChildren: globalThis.Array.isArray(object?.handledFailedChildren) - ? object.handledFailedChildren.map((e: any) => globalThis.Number(e)) - : [], - type: isSet(object.type) ? threadTypeFromJSON(object.type) : ThreadType.ENTRYPOINT, - }; - }, - - toJSON(message: ThreadRun): unknown { - const obj: any = {}; - if (message.wfSpecId !== undefined) { - obj.wfSpecId = WfSpecId.toJSON(message.wfSpecId); - } - if (message.number !== 0) { - obj.number = Math.round(message.number); - } - if (message.status !== LHStatus.STARTING) { - obj.status = lHStatusToJSON(message.status); - } - if (message.threadSpecName !== "") { - obj.threadSpecName = message.threadSpecName; - } - if (message.startTime !== undefined) { - obj.startTime = message.startTime; - } - if (message.endTime !== undefined) { - obj.endTime = message.endTime; - } - if (message.errorMessage !== undefined) { - obj.errorMessage = message.errorMessage; - } - if (message.childThreadIds?.length) { - obj.childThreadIds = message.childThreadIds.map((e) => Math.round(e)); - } - if (message.parentThreadId !== undefined) { - obj.parentThreadId = Math.round(message.parentThreadId); - } - if (message.haltReasons?.length) { - obj.haltReasons = message.haltReasons.map((e) => ThreadHaltReason.toJSON(e)); - } - if (message.interruptTriggerId !== undefined) { - obj.interruptTriggerId = ExternalEventId.toJSON(message.interruptTriggerId); - } - if (message.failureBeingHandled !== undefined) { - obj.failureBeingHandled = FailureBeingHandled.toJSON(message.failureBeingHandled); - } - if (message.currentNodePosition !== 0) { - obj.currentNodePosition = Math.round(message.currentNodePosition); - } - if (message.handledFailedChildren?.length) { - obj.handledFailedChildren = message.handledFailedChildren.map((e) => Math.round(e)); - } - if (message.type !== ThreadType.ENTRYPOINT) { - obj.type = threadTypeToJSON(message.type); - } - return obj; - }, - - create, I>>(base?: I): ThreadRun { - return ThreadRun.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ThreadRun { - const message = createBaseThreadRun(); - message.wfSpecId = (object.wfSpecId !== undefined && object.wfSpecId !== null) - ? WfSpecId.fromPartial(object.wfSpecId) - : undefined; - message.number = object.number ?? 0; - message.status = object.status ?? LHStatus.STARTING; - message.threadSpecName = object.threadSpecName ?? ""; - message.startTime = object.startTime ?? undefined; - message.endTime = object.endTime ?? undefined; - message.errorMessage = object.errorMessage ?? undefined; - message.childThreadIds = object.childThreadIds?.map((e) => e) || []; - message.parentThreadId = object.parentThreadId ?? undefined; - message.haltReasons = object.haltReasons?.map((e) => ThreadHaltReason.fromPartial(e)) || []; - message.interruptTriggerId = (object.interruptTriggerId !== undefined && object.interruptTriggerId !== null) - ? ExternalEventId.fromPartial(object.interruptTriggerId) - : undefined; - message.failureBeingHandled = (object.failureBeingHandled !== undefined && object.failureBeingHandled !== null) - ? FailureBeingHandled.fromPartial(object.failureBeingHandled) - : undefined; - message.currentNodePosition = object.currentNodePosition ?? 0; - message.handledFailedChildren = object.handledFailedChildren?.map((e) => e) || []; - message.type = object.type ?? ThreadType.ENTRYPOINT; - return message; - }, -}; - -function createBaseFailureBeingHandled(): FailureBeingHandled { - return { threadRunNumber: 0, nodeRunPosition: 0, failureNumber: 0 }; -} - -export const FailureBeingHandled = { - encode(message: FailureBeingHandled, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.threadRunNumber !== 0) { - writer.uint32(8).int32(message.threadRunNumber); - } - if (message.nodeRunPosition !== 0) { - writer.uint32(16).int32(message.nodeRunPosition); - } - if (message.failureNumber !== 0) { - writer.uint32(24).int32(message.failureNumber); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): FailureBeingHandled { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseFailureBeingHandled(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.threadRunNumber = reader.int32(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.nodeRunPosition = reader.int32(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.failureNumber = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): FailureBeingHandled { - return { - threadRunNumber: isSet(object.threadRunNumber) ? globalThis.Number(object.threadRunNumber) : 0, - nodeRunPosition: isSet(object.nodeRunPosition) ? globalThis.Number(object.nodeRunPosition) : 0, - failureNumber: isSet(object.failureNumber) ? globalThis.Number(object.failureNumber) : 0, - }; - }, - - toJSON(message: FailureBeingHandled): unknown { - const obj: any = {}; - if (message.threadRunNumber !== 0) { - obj.threadRunNumber = Math.round(message.threadRunNumber); - } - if (message.nodeRunPosition !== 0) { - obj.nodeRunPosition = Math.round(message.nodeRunPosition); - } - if (message.failureNumber !== 0) { - obj.failureNumber = Math.round(message.failureNumber); - } - return obj; - }, - - create, I>>(base?: I): FailureBeingHandled { - return FailureBeingHandled.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): FailureBeingHandled { - const message = createBaseFailureBeingHandled(); - message.threadRunNumber = object.threadRunNumber ?? 0; - message.nodeRunPosition = object.nodeRunPosition ?? 0; - message.failureNumber = object.failureNumber ?? 0; - return message; - }, -}; - -function createBasePendingInterrupt(): PendingInterrupt { - return { externalEventId: undefined, handlerSpecName: "", interruptedThreadId: 0 }; -} - -export const PendingInterrupt = { - encode(message: PendingInterrupt, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.externalEventId !== undefined) { - ExternalEventId.encode(message.externalEventId, writer.uint32(10).fork()).ldelim(); - } - if (message.handlerSpecName !== "") { - writer.uint32(18).string(message.handlerSpecName); - } - if (message.interruptedThreadId !== 0) { - writer.uint32(24).int32(message.interruptedThreadId); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PendingInterrupt { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePendingInterrupt(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.externalEventId = ExternalEventId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.handlerSpecName = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.interruptedThreadId = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PendingInterrupt { - return { - externalEventId: isSet(object.externalEventId) ? ExternalEventId.fromJSON(object.externalEventId) : undefined, - handlerSpecName: isSet(object.handlerSpecName) ? globalThis.String(object.handlerSpecName) : "", - interruptedThreadId: isSet(object.interruptedThreadId) ? globalThis.Number(object.interruptedThreadId) : 0, - }; - }, - - toJSON(message: PendingInterrupt): unknown { - const obj: any = {}; - if (message.externalEventId !== undefined) { - obj.externalEventId = ExternalEventId.toJSON(message.externalEventId); - } - if (message.handlerSpecName !== "") { - obj.handlerSpecName = message.handlerSpecName; - } - if (message.interruptedThreadId !== 0) { - obj.interruptedThreadId = Math.round(message.interruptedThreadId); - } - return obj; - }, - - create, I>>(base?: I): PendingInterrupt { - return PendingInterrupt.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PendingInterrupt { - const message = createBasePendingInterrupt(); - message.externalEventId = (object.externalEventId !== undefined && object.externalEventId !== null) - ? ExternalEventId.fromPartial(object.externalEventId) - : undefined; - message.handlerSpecName = object.handlerSpecName ?? ""; - message.interruptedThreadId = object.interruptedThreadId ?? 0; - return message; - }, -}; - -function createBasePendingFailureHandler(): PendingFailureHandler { - return { failedThreadRun: 0, handlerSpecName: "" }; -} - -export const PendingFailureHandler = { - encode(message: PendingFailureHandler, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.failedThreadRun !== 0) { - writer.uint32(8).int32(message.failedThreadRun); - } - if (message.handlerSpecName !== "") { - writer.uint32(18).string(message.handlerSpecName); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PendingFailureHandler { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePendingFailureHandler(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.failedThreadRun = reader.int32(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.handlerSpecName = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PendingFailureHandler { - return { - failedThreadRun: isSet(object.failedThreadRun) ? globalThis.Number(object.failedThreadRun) : 0, - handlerSpecName: isSet(object.handlerSpecName) ? globalThis.String(object.handlerSpecName) : "", - }; - }, - - toJSON(message: PendingFailureHandler): unknown { - const obj: any = {}; - if (message.failedThreadRun !== 0) { - obj.failedThreadRun = Math.round(message.failedThreadRun); - } - if (message.handlerSpecName !== "") { - obj.handlerSpecName = message.handlerSpecName; - } - return obj; - }, - - create, I>>(base?: I): PendingFailureHandler { - return PendingFailureHandler.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PendingFailureHandler { - const message = createBasePendingFailureHandler(); - message.failedThreadRun = object.failedThreadRun ?? 0; - message.handlerSpecName = object.handlerSpecName ?? ""; - return message; - }, -}; - -function createBasePendingInterruptHaltReason(): PendingInterruptHaltReason { - return { externalEventId: undefined }; -} - -export const PendingInterruptHaltReason = { - encode(message: PendingInterruptHaltReason, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.externalEventId !== undefined) { - ExternalEventId.encode(message.externalEventId, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PendingInterruptHaltReason { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePendingInterruptHaltReason(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.externalEventId = ExternalEventId.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PendingInterruptHaltReason { - return { - externalEventId: isSet(object.externalEventId) ? ExternalEventId.fromJSON(object.externalEventId) : undefined, - }; - }, - - toJSON(message: PendingInterruptHaltReason): unknown { - const obj: any = {}; - if (message.externalEventId !== undefined) { - obj.externalEventId = ExternalEventId.toJSON(message.externalEventId); - } - return obj; - }, - - create, I>>(base?: I): PendingInterruptHaltReason { - return PendingInterruptHaltReason.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): PendingInterruptHaltReason { - const message = createBasePendingInterruptHaltReason(); - message.externalEventId = (object.externalEventId !== undefined && object.externalEventId !== null) - ? ExternalEventId.fromPartial(object.externalEventId) - : undefined; - return message; - }, -}; - -function createBasePendingFailureHandlerHaltReason(): PendingFailureHandlerHaltReason { - return { nodeRunPosition: 0 }; -} - -export const PendingFailureHandlerHaltReason = { - encode(message: PendingFailureHandlerHaltReason, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.nodeRunPosition !== 0) { - writer.uint32(8).int32(message.nodeRunPosition); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): PendingFailureHandlerHaltReason { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePendingFailureHandlerHaltReason(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.nodeRunPosition = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): PendingFailureHandlerHaltReason { - return { nodeRunPosition: isSet(object.nodeRunPosition) ? globalThis.Number(object.nodeRunPosition) : 0 }; - }, - - toJSON(message: PendingFailureHandlerHaltReason): unknown { - const obj: any = {}; - if (message.nodeRunPosition !== 0) { - obj.nodeRunPosition = Math.round(message.nodeRunPosition); - } - return obj; - }, - - create, I>>(base?: I): PendingFailureHandlerHaltReason { - return PendingFailureHandlerHaltReason.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): PendingFailureHandlerHaltReason { - const message = createBasePendingFailureHandlerHaltReason(); - message.nodeRunPosition = object.nodeRunPosition ?? 0; - return message; - }, -}; - -function createBaseHandlingFailureHaltReason(): HandlingFailureHaltReason { - return { handlerThreadId: 0 }; -} - -export const HandlingFailureHaltReason = { - encode(message: HandlingFailureHaltReason, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.handlerThreadId !== 0) { - writer.uint32(8).int32(message.handlerThreadId); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): HandlingFailureHaltReason { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseHandlingFailureHaltReason(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.handlerThreadId = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): HandlingFailureHaltReason { - return { handlerThreadId: isSet(object.handlerThreadId) ? globalThis.Number(object.handlerThreadId) : 0 }; - }, - - toJSON(message: HandlingFailureHaltReason): unknown { - const obj: any = {}; - if (message.handlerThreadId !== 0) { - obj.handlerThreadId = Math.round(message.handlerThreadId); - } - return obj; - }, - - create, I>>(base?: I): HandlingFailureHaltReason { - return HandlingFailureHaltReason.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): HandlingFailureHaltReason { - const message = createBaseHandlingFailureHaltReason(); - message.handlerThreadId = object.handlerThreadId ?? 0; - return message; - }, -}; - -function createBaseParentHalted(): ParentHalted { - return { parentThreadId: 0 }; -} - -export const ParentHalted = { - encode(message: ParentHalted, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.parentThreadId !== 0) { - writer.uint32(8).int32(message.parentThreadId); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ParentHalted { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseParentHalted(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.parentThreadId = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ParentHalted { - return { parentThreadId: isSet(object.parentThreadId) ? globalThis.Number(object.parentThreadId) : 0 }; - }, - - toJSON(message: ParentHalted): unknown { - const obj: any = {}; - if (message.parentThreadId !== 0) { - obj.parentThreadId = Math.round(message.parentThreadId); - } - return obj; - }, - - create, I>>(base?: I): ParentHalted { - return ParentHalted.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ParentHalted { - const message = createBaseParentHalted(); - message.parentThreadId = object.parentThreadId ?? 0; - return message; - }, -}; - -function createBaseInterrupted(): Interrupted { - return { interruptThreadId: 0 }; -} - -export const Interrupted = { - encode(message: Interrupted, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.interruptThreadId !== 0) { - writer.uint32(8).int32(message.interruptThreadId); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Interrupted { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseInterrupted(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.interruptThreadId = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): Interrupted { - return { interruptThreadId: isSet(object.interruptThreadId) ? globalThis.Number(object.interruptThreadId) : 0 }; - }, - - toJSON(message: Interrupted): unknown { - const obj: any = {}; - if (message.interruptThreadId !== 0) { - obj.interruptThreadId = Math.round(message.interruptThreadId); - } - return obj; - }, - - create, I>>(base?: I): Interrupted { - return Interrupted.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Interrupted { - const message = createBaseInterrupted(); - message.interruptThreadId = object.interruptThreadId ?? 0; - return message; - }, -}; - -function createBaseManualHalt(): ManualHalt { - return { meaningOfLife: false }; -} - -export const ManualHalt = { - encode(message: ManualHalt, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.meaningOfLife !== false) { - writer.uint32(1096).bool(message.meaningOfLife); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ManualHalt { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseManualHalt(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 137: - if (tag !== 1096) { - break; - } - - message.meaningOfLife = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ManualHalt { - return { meaningOfLife: isSet(object.meaningOfLife) ? globalThis.Boolean(object.meaningOfLife) : false }; - }, - - toJSON(message: ManualHalt): unknown { - const obj: any = {}; - if (message.meaningOfLife !== false) { - obj.meaningOfLife = message.meaningOfLife; - } - return obj; - }, - - create, I>>(base?: I): ManualHalt { - return ManualHalt.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ManualHalt { - const message = createBaseManualHalt(); - message.meaningOfLife = object.meaningOfLife ?? false; - return message; - }, -}; - -function createBaseThreadHaltReason(): ThreadHaltReason { - return { - parentHalted: undefined, - interrupted: undefined, - pendingInterrupt: undefined, - pendingFailure: undefined, - handlingFailure: undefined, - manualHalt: undefined, - }; -} - -export const ThreadHaltReason = { - encode(message: ThreadHaltReason, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.parentHalted !== undefined) { - ParentHalted.encode(message.parentHalted, writer.uint32(10).fork()).ldelim(); - } - if (message.interrupted !== undefined) { - Interrupted.encode(message.interrupted, writer.uint32(18).fork()).ldelim(); - } - if (message.pendingInterrupt !== undefined) { - PendingInterruptHaltReason.encode(message.pendingInterrupt, writer.uint32(26).fork()).ldelim(); - } - if (message.pendingFailure !== undefined) { - PendingFailureHandlerHaltReason.encode(message.pendingFailure, writer.uint32(34).fork()).ldelim(); - } - if (message.handlingFailure !== undefined) { - HandlingFailureHaltReason.encode(message.handlingFailure, writer.uint32(42).fork()).ldelim(); - } - if (message.manualHalt !== undefined) { - ManualHalt.encode(message.manualHalt, writer.uint32(50).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ThreadHaltReason { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseThreadHaltReason(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.parentHalted = ParentHalted.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.interrupted = Interrupted.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.pendingInterrupt = PendingInterruptHaltReason.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.pendingFailure = PendingFailureHandlerHaltReason.decode(reader, reader.uint32()); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.handlingFailure = HandlingFailureHaltReason.decode(reader, reader.uint32()); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.manualHalt = ManualHalt.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ThreadHaltReason { - return { - parentHalted: isSet(object.parentHalted) ? ParentHalted.fromJSON(object.parentHalted) : undefined, - interrupted: isSet(object.interrupted) ? Interrupted.fromJSON(object.interrupted) : undefined, - pendingInterrupt: isSet(object.pendingInterrupt) - ? PendingInterruptHaltReason.fromJSON(object.pendingInterrupt) - : undefined, - pendingFailure: isSet(object.pendingFailure) - ? PendingFailureHandlerHaltReason.fromJSON(object.pendingFailure) - : undefined, - handlingFailure: isSet(object.handlingFailure) - ? HandlingFailureHaltReason.fromJSON(object.handlingFailure) - : undefined, - manualHalt: isSet(object.manualHalt) ? ManualHalt.fromJSON(object.manualHalt) : undefined, - }; - }, - - toJSON(message: ThreadHaltReason): unknown { - const obj: any = {}; - if (message.parentHalted !== undefined) { - obj.parentHalted = ParentHalted.toJSON(message.parentHalted); - } - if (message.interrupted !== undefined) { - obj.interrupted = Interrupted.toJSON(message.interrupted); - } - if (message.pendingInterrupt !== undefined) { - obj.pendingInterrupt = PendingInterruptHaltReason.toJSON(message.pendingInterrupt); - } - if (message.pendingFailure !== undefined) { - obj.pendingFailure = PendingFailureHandlerHaltReason.toJSON(message.pendingFailure); - } - if (message.handlingFailure !== undefined) { - obj.handlingFailure = HandlingFailureHaltReason.toJSON(message.handlingFailure); - } - if (message.manualHalt !== undefined) { - obj.manualHalt = ManualHalt.toJSON(message.manualHalt); - } - return obj; - }, - - create, I>>(base?: I): ThreadHaltReason { - return ThreadHaltReason.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ThreadHaltReason { - const message = createBaseThreadHaltReason(); - message.parentHalted = (object.parentHalted !== undefined && object.parentHalted !== null) - ? ParentHalted.fromPartial(object.parentHalted) - : undefined; - message.interrupted = (object.interrupted !== undefined && object.interrupted !== null) - ? Interrupted.fromPartial(object.interrupted) - : undefined; - message.pendingInterrupt = (object.pendingInterrupt !== undefined && object.pendingInterrupt !== null) - ? PendingInterruptHaltReason.fromPartial(object.pendingInterrupt) - : undefined; - message.pendingFailure = (object.pendingFailure !== undefined && object.pendingFailure !== null) - ? PendingFailureHandlerHaltReason.fromPartial(object.pendingFailure) - : undefined; - message.handlingFailure = (object.handlingFailure !== undefined && object.handlingFailure !== null) - ? HandlingFailureHaltReason.fromPartial(object.handlingFailure) - : undefined; - message.manualHalt = (object.manualHalt !== undefined && object.manualHalt !== null) - ? ManualHalt.fromPartial(object.manualHalt) - : undefined; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/wf_spec.ts b/dashboard/apps/web/littlehorse-public-api/wf_spec.ts deleted file mode 100644 index 57cf584e4..000000000 --- a/dashboard/apps/web/littlehorse-public-api/wf_spec.ts +++ /dev/null @@ -1,3699 +0,0 @@ -/* eslint-disable */ -import Long from "long"; -import * as _m0 from "protobufjs/minimal"; -import { - MetadataStatus, - metadataStatusFromJSON, - metadataStatusToJSON, - metadataStatusToNumber, - VariableType, - variableTypeFromJSON, - variableTypeToJSON, - variableTypeToNumber, -} from "./common_enums"; -import { - Comparator, - comparatorFromJSON, - comparatorToJSON, - comparatorToNumber, - TaskNode, - UTActionTrigger, - VariableAssignment, - VariableDef, - VariableMutation, -} from "./common_wfspec"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { ExternalEventDefId, WfSpecId, WorkflowEventDefId } from "./object_id"; - -export const protobufPackage = "littlehorse"; - -export enum WfRunVariableAccessLevel { - PUBLIC_VAR = "PUBLIC_VAR", - PRIVATE_VAR = "PRIVATE_VAR", - INHERITED_VAR = "INHERITED_VAR", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function wfRunVariableAccessLevelFromJSON(object: any): WfRunVariableAccessLevel { - switch (object) { - case 0: - case "PUBLIC_VAR": - return WfRunVariableAccessLevel.PUBLIC_VAR; - case 1: - case "PRIVATE_VAR": - return WfRunVariableAccessLevel.PRIVATE_VAR; - case 2: - case "INHERITED_VAR": - return WfRunVariableAccessLevel.INHERITED_VAR; - case -1: - case "UNRECOGNIZED": - default: - return WfRunVariableAccessLevel.UNRECOGNIZED; - } -} - -export function wfRunVariableAccessLevelToJSON(object: WfRunVariableAccessLevel): string { - switch (object) { - case WfRunVariableAccessLevel.PUBLIC_VAR: - return "PUBLIC_VAR"; - case WfRunVariableAccessLevel.PRIVATE_VAR: - return "PRIVATE_VAR"; - case WfRunVariableAccessLevel.INHERITED_VAR: - return "INHERITED_VAR"; - case WfRunVariableAccessLevel.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function wfRunVariableAccessLevelToNumber(object: WfRunVariableAccessLevel): number { - switch (object) { - case WfRunVariableAccessLevel.PUBLIC_VAR: - return 0; - case WfRunVariableAccessLevel.PRIVATE_VAR: - return 1; - case WfRunVariableAccessLevel.INHERITED_VAR: - return 2; - case WfRunVariableAccessLevel.UNRECOGNIZED: - default: - return -1; - } -} - -export interface WfSpec { - id: WfSpecId | undefined; - createdAt: string | undefined; - frozenVariables: ThreadVarDef[]; - /** to be used for WfSpec Status, i.e. ACTIVE/TERMINATING/ARCHIVED */ - status: MetadataStatus; - threadSpecs: { [key: string]: ThreadSpec }; - entrypointThreadName: string; - retentionPolicy?: WorkflowRetentionPolicy | undefined; - migration?: - | WfSpecVersionMigration - | undefined; - /** - * Reference to the parent WfSpec. If this is set, all WfRun's for this WfSpec must be the - * child of a WfRun belonging to the referenced WfSpec. - */ - parentWfSpec?: WfSpec_ParentWfSpecReference | undefined; -} - -export interface WfSpec_ThreadSpecsEntry { - key: string; - value: ThreadSpec | undefined; -} - -/** - * Reference to another WfSpec. If a WfSpec has a ParentWfSpecReference, then all - * WfRun's for that WfSpec *MUST* be the child of a WfRun of the provided WfSpec; meaning - * that the RunWf RPC must provide a `parent_wf_run_id` that belongs to the specified - * WfSpec. - * - * Currently, only reference by names is supported. - */ -export interface WfSpec_ParentWfSpecReference { - /** Name of the Parent WfSpec */ - wfSpecName: string; - /** - * FOR NOW: no validation of variables on parent. In the future we will pass - * wf_spec_major_version, but we should probably examine the rules for - * evolution in the future. - */ - wfSpecMajorVersion: number; -} - -export interface WorkflowRetentionPolicy { - /** - * Delete all WfRun's X seconds after they terminate, regardless of - * status. - */ - secondsAfterWfTermination?: number | undefined; -} - -export interface JsonIndex { - fieldPath: string; - fieldType: VariableType; -} - -export interface SearchableVariableDef { - /** Future: Add index information (local/remote/etc) */ - varDef: VariableDef | undefined; -} - -export interface ThreadVarDef { - varDef: VariableDef | undefined; - required: boolean; - searchable: boolean; - jsonIndexes: JsonIndex[]; - accessLevel: WfRunVariableAccessLevel; -} - -export interface ThreadSpec { - nodes: { [key: string]: Node }; - variableDefs: ThreadVarDef[]; - interruptDefs: InterruptDef[]; - retentionPolicy?: ThreadRetentionPolicy | undefined; -} - -export interface ThreadSpec_NodesEntry { - key: string; - value: Node | undefined; -} - -export interface ThreadRetentionPolicy { - /** - * Delete associated ThreadRun's X seconds after they terminate, regardless - * of status. - */ - secondsAfterThreadTermination?: number | undefined; -} - -export interface InterruptDef { - externalEventDefId: ExternalEventDefId | undefined; - handlerSpecName: string; -} - -export interface StartThreadNode { - threadSpecName: string; - variables: { [key: string]: VariableAssignment }; -} - -export interface StartThreadNode_VariablesEntry { - key: string; - value: VariableAssignment | undefined; -} - -export interface StartMultipleThreadsNode { - threadSpecName: string; - variables: { [key: string]: VariableAssignment }; - iterable: VariableAssignment | undefined; -} - -export interface StartMultipleThreadsNode_VariablesEntry { - key: string; - value: VariableAssignment | undefined; -} - -export interface FailureHandlerDef { - handlerSpecName: string; - specificFailure?: string | undefined; - anyFailureOfType?: FailureHandlerDef_LHFailureType | undefined; -} - -export enum FailureHandlerDef_LHFailureType { - FAILURE_TYPE_ERROR = "FAILURE_TYPE_ERROR", - FAILURE_TYPE_EXCEPTION = "FAILURE_TYPE_EXCEPTION", - UNRECOGNIZED = "UNRECOGNIZED", -} - -export function failureHandlerDef_LHFailureTypeFromJSON(object: any): FailureHandlerDef_LHFailureType { - switch (object) { - case 0: - case "FAILURE_TYPE_ERROR": - return FailureHandlerDef_LHFailureType.FAILURE_TYPE_ERROR; - case 1: - case "FAILURE_TYPE_EXCEPTION": - return FailureHandlerDef_LHFailureType.FAILURE_TYPE_EXCEPTION; - case -1: - case "UNRECOGNIZED": - default: - return FailureHandlerDef_LHFailureType.UNRECOGNIZED; - } -} - -export function failureHandlerDef_LHFailureTypeToJSON(object: FailureHandlerDef_LHFailureType): string { - switch (object) { - case FailureHandlerDef_LHFailureType.FAILURE_TYPE_ERROR: - return "FAILURE_TYPE_ERROR"; - case FailureHandlerDef_LHFailureType.FAILURE_TYPE_EXCEPTION: - return "FAILURE_TYPE_EXCEPTION"; - case FailureHandlerDef_LHFailureType.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} - -export function failureHandlerDef_LHFailureTypeToNumber(object: FailureHandlerDef_LHFailureType): number { - switch (object) { - case FailureHandlerDef_LHFailureType.FAILURE_TYPE_ERROR: - return 0; - case FailureHandlerDef_LHFailureType.FAILURE_TYPE_EXCEPTION: - return 1; - case FailureHandlerDef_LHFailureType.UNRECOGNIZED: - default: - return -1; - } -} - -export interface WaitForThreadsNode { - threads?: WaitForThreadsNode_ThreadsToWaitFor | undefined; - threadList?: VariableAssignment | undefined; - perThreadFailureHandlers: FailureHandlerDef[]; -} - -export interface WaitForThreadsNode_ThreadToWaitFor { - threadRunNumber: VariableAssignment | undefined; -} - -export interface WaitForThreadsNode_ThreadsToWaitFor { - threads: WaitForThreadsNode_ThreadToWaitFor[]; -} - -export interface ExternalEventNode { - externalEventDefId: ExternalEventDefId | undefined; - timeoutSeconds: VariableAssignment | undefined; -} - -export interface EntrypointNode { -} - -export interface ExitNode { - failureDef?: FailureDef | undefined; -} - -export interface FailureDef { - failureName: string; - message: string; - content?: VariableAssignment | undefined; -} - -export interface Node { - outgoingEdges: Edge[]; - failureHandlers: FailureHandlerDef[]; - entrypoint?: EntrypointNode | undefined; - exit?: ExitNode | undefined; - task?: TaskNode | undefined; - externalEvent?: ExternalEventNode | undefined; - startThread?: StartThreadNode | undefined; - waitForThreads?: WaitForThreadsNode | undefined; - nop?: NopNode | undefined; - sleep?: SleepNode | undefined; - userTask?: UserTaskNode | undefined; - startMultipleThreads?: StartMultipleThreadsNode | undefined; - throwEvent?: ThrowEventNode | undefined; -} - -/** A SubNode that throws a WorkflowEvent of a specific type. */ -export interface ThrowEventNode { - /** The WorkflowEventDefId of the WorkflowEvent that is thrown */ - eventDefId: - | WorkflowEventDefId - | undefined; - /** A VariableAssignment defining the content of the WorkflowEvent that is thrown */ - content: VariableAssignment | undefined; -} - -export interface UserTaskNode { - userTaskDefName: string; - /** to whom should the User Task Run be assigned? */ - userGroup?: VariableAssignment | undefined; - userId?: - | VariableAssignment - | undefined; - /** - * This is used to, for example, send a push notification to a mobile app - * to remind someone that they need to fill out a task, or to re-assign - * the task to another group of people - */ - actions: UTActionTrigger[]; - /** - * So, once the WfSpec is created, this will be pinned to a version. Customer - * can optionally specify a specific version or can leave it null, in which - * case we just use the latest - */ - userTaskDefVersion?: - | number - | undefined; - /** Allow WfRun-specific notes for this User Task. */ - notes?: - | VariableAssignment - | undefined; - /** Specifies the name of the exception thrown when the User Task is canceled */ - onCancellationExceptionName?: VariableAssignment | undefined; -} - -export interface EdgeCondition { - comparator: Comparator; - left: VariableAssignment | undefined; - right: VariableAssignment | undefined; -} - -export interface Edge { - sinkNodeName: string; - condition?: EdgeCondition | undefined; - variableMutations: VariableMutation[]; -} - -export interface NopNode { -} - -export interface SleepNode { - rawSeconds?: VariableAssignment | undefined; - timestamp?: VariableAssignment | undefined; - isoDate?: VariableAssignment | undefined; -} - -export interface WfSpecVersionMigration { - newMajorVersion: number; - newRevision: number; - threadSpecMigrations: { [key: string]: ThreadSpecMigration }; -} - -export interface WfSpecVersionMigration_ThreadSpecMigrationsEntry { - key: string; - value: ThreadSpecMigration | undefined; -} - -export interface ThreadSpecMigration { - newThreadSpecName: string; - nodeMigrations: { [key: string]: NodeMigration }; -} - -export interface ThreadSpecMigration_NodeMigrationsEntry { - key: string; - value: NodeMigration | undefined; -} - -export interface NodeMigration { - newNodeName: string; -} - -function createBaseWfSpec(): WfSpec { - return { - id: undefined, - createdAt: undefined, - frozenVariables: [], - status: MetadataStatus.ACTIVE, - threadSpecs: {}, - entrypointThreadName: "", - retentionPolicy: undefined, - migration: undefined, - parentWfSpec: undefined, - }; -} - -export const WfSpec = { - encode(message: WfSpec, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - WfSpecId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(18).fork()).ldelim(); - } - for (const v of message.frozenVariables) { - ThreadVarDef.encode(v!, writer.uint32(26).fork()).ldelim(); - } - if (message.status !== MetadataStatus.ACTIVE) { - writer.uint32(32).int32(metadataStatusToNumber(message.status)); - } - Object.entries(message.threadSpecs).forEach(([key, value]) => { - WfSpec_ThreadSpecsEntry.encode({ key: key as any, value }, writer.uint32(42).fork()).ldelim(); - }); - if (message.entrypointThreadName !== "") { - writer.uint32(50).string(message.entrypointThreadName); - } - if (message.retentionPolicy !== undefined) { - WorkflowRetentionPolicy.encode(message.retentionPolicy, writer.uint32(58).fork()).ldelim(); - } - if (message.migration !== undefined) { - WfSpecVersionMigration.encode(message.migration, writer.uint32(66).fork()).ldelim(); - } - if (message.parentWfSpec !== undefined) { - WfSpec_ParentWfSpecReference.encode(message.parentWfSpec, writer.uint32(74).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfSpec { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfSpec(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = WfSpecId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.frozenVariables.push(ThreadVarDef.decode(reader, reader.uint32())); - continue; - case 4: - if (tag !== 32) { - break; - } - - message.status = metadataStatusFromJSON(reader.int32()); - continue; - case 5: - if (tag !== 42) { - break; - } - - const entry5 = WfSpec_ThreadSpecsEntry.decode(reader, reader.uint32()); - if (entry5.value !== undefined) { - message.threadSpecs[entry5.key] = entry5.value; - } - continue; - case 6: - if (tag !== 50) { - break; - } - - message.entrypointThreadName = reader.string(); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.retentionPolicy = WorkflowRetentionPolicy.decode(reader, reader.uint32()); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.migration = WfSpecVersionMigration.decode(reader, reader.uint32()); - continue; - case 9: - if (tag !== 74) { - break; - } - - message.parentWfSpec = WfSpec_ParentWfSpecReference.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfSpec { - return { - id: isSet(object.id) ? WfSpecId.fromJSON(object.id) : undefined, - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - frozenVariables: globalThis.Array.isArray(object?.frozenVariables) - ? object.frozenVariables.map((e: any) => ThreadVarDef.fromJSON(e)) - : [], - status: isSet(object.status) ? metadataStatusFromJSON(object.status) : MetadataStatus.ACTIVE, - threadSpecs: isObject(object.threadSpecs) - ? Object.entries(object.threadSpecs).reduce<{ [key: string]: ThreadSpec }>((acc, [key, value]) => { - acc[key] = ThreadSpec.fromJSON(value); - return acc; - }, {}) - : {}, - entrypointThreadName: isSet(object.entrypointThreadName) ? globalThis.String(object.entrypointThreadName) : "", - retentionPolicy: isSet(object.retentionPolicy) - ? WorkflowRetentionPolicy.fromJSON(object.retentionPolicy) - : undefined, - migration: isSet(object.migration) ? WfSpecVersionMigration.fromJSON(object.migration) : undefined, - parentWfSpec: isSet(object.parentWfSpec) ? WfSpec_ParentWfSpecReference.fromJSON(object.parentWfSpec) : undefined, - }; - }, - - toJSON(message: WfSpec): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = WfSpecId.toJSON(message.id); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - if (message.frozenVariables?.length) { - obj.frozenVariables = message.frozenVariables.map((e) => ThreadVarDef.toJSON(e)); - } - if (message.status !== MetadataStatus.ACTIVE) { - obj.status = metadataStatusToJSON(message.status); - } - if (message.threadSpecs) { - const entries = Object.entries(message.threadSpecs); - if (entries.length > 0) { - obj.threadSpecs = {}; - entries.forEach(([k, v]) => { - obj.threadSpecs[k] = ThreadSpec.toJSON(v); - }); - } - } - if (message.entrypointThreadName !== "") { - obj.entrypointThreadName = message.entrypointThreadName; - } - if (message.retentionPolicy !== undefined) { - obj.retentionPolicy = WorkflowRetentionPolicy.toJSON(message.retentionPolicy); - } - if (message.migration !== undefined) { - obj.migration = WfSpecVersionMigration.toJSON(message.migration); - } - if (message.parentWfSpec !== undefined) { - obj.parentWfSpec = WfSpec_ParentWfSpecReference.toJSON(message.parentWfSpec); - } - return obj; - }, - - create, I>>(base?: I): WfSpec { - return WfSpec.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfSpec { - const message = createBaseWfSpec(); - message.id = (object.id !== undefined && object.id !== null) ? WfSpecId.fromPartial(object.id) : undefined; - message.createdAt = object.createdAt ?? undefined; - message.frozenVariables = object.frozenVariables?.map((e) => ThreadVarDef.fromPartial(e)) || []; - message.status = object.status ?? MetadataStatus.ACTIVE; - message.threadSpecs = Object.entries(object.threadSpecs ?? {}).reduce<{ [key: string]: ThreadSpec }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = ThreadSpec.fromPartial(value); - } - return acc; - }, - {}, - ); - message.entrypointThreadName = object.entrypointThreadName ?? ""; - message.retentionPolicy = (object.retentionPolicy !== undefined && object.retentionPolicy !== null) - ? WorkflowRetentionPolicy.fromPartial(object.retentionPolicy) - : undefined; - message.migration = (object.migration !== undefined && object.migration !== null) - ? WfSpecVersionMigration.fromPartial(object.migration) - : undefined; - message.parentWfSpec = (object.parentWfSpec !== undefined && object.parentWfSpec !== null) - ? WfSpec_ParentWfSpecReference.fromPartial(object.parentWfSpec) - : undefined; - return message; - }, -}; - -function createBaseWfSpec_ThreadSpecsEntry(): WfSpec_ThreadSpecsEntry { - return { key: "", value: undefined }; -} - -export const WfSpec_ThreadSpecsEntry = { - encode(message: WfSpec_ThreadSpecsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - ThreadSpec.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfSpec_ThreadSpecsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfSpec_ThreadSpecsEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = ThreadSpec.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfSpec_ThreadSpecsEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? ThreadSpec.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: WfSpec_ThreadSpecsEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = ThreadSpec.toJSON(message.value); - } - return obj; - }, - - create, I>>(base?: I): WfSpec_ThreadSpecsEntry { - return WfSpec_ThreadSpecsEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfSpec_ThreadSpecsEntry { - const message = createBaseWfSpec_ThreadSpecsEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? ThreadSpec.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseWfSpec_ParentWfSpecReference(): WfSpec_ParentWfSpecReference { - return { wfSpecName: "", wfSpecMajorVersion: 0 }; -} - -export const WfSpec_ParentWfSpecReference = { - encode(message: WfSpec_ParentWfSpecReference, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.wfSpecName !== "") { - writer.uint32(10).string(message.wfSpecName); - } - if (message.wfSpecMajorVersion !== 0) { - writer.uint32(16).int32(message.wfSpecMajorVersion); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfSpec_ParentWfSpecReference { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfSpec_ParentWfSpecReference(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.wfSpecName = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.wfSpecMajorVersion = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfSpec_ParentWfSpecReference { - return { - wfSpecName: isSet(object.wfSpecName) ? globalThis.String(object.wfSpecName) : "", - wfSpecMajorVersion: isSet(object.wfSpecMajorVersion) ? globalThis.Number(object.wfSpecMajorVersion) : 0, - }; - }, - - toJSON(message: WfSpec_ParentWfSpecReference): unknown { - const obj: any = {}; - if (message.wfSpecName !== "") { - obj.wfSpecName = message.wfSpecName; - } - if (message.wfSpecMajorVersion !== 0) { - obj.wfSpecMajorVersion = Math.round(message.wfSpecMajorVersion); - } - return obj; - }, - - create, I>>(base?: I): WfSpec_ParentWfSpecReference { - return WfSpec_ParentWfSpecReference.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfSpec_ParentWfSpecReference { - const message = createBaseWfSpec_ParentWfSpecReference(); - message.wfSpecName = object.wfSpecName ?? ""; - message.wfSpecMajorVersion = object.wfSpecMajorVersion ?? 0; - return message; - }, -}; - -function createBaseWorkflowRetentionPolicy(): WorkflowRetentionPolicy { - return { secondsAfterWfTermination: undefined }; -} - -export const WorkflowRetentionPolicy = { - encode(message: WorkflowRetentionPolicy, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.secondsAfterWfTermination !== undefined) { - writer.uint32(8).int64(message.secondsAfterWfTermination); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WorkflowRetentionPolicy { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWorkflowRetentionPolicy(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.secondsAfterWfTermination = longToNumber(reader.int64() as Long); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WorkflowRetentionPolicy { - return { - secondsAfterWfTermination: isSet(object.secondsAfterWfTermination) - ? globalThis.Number(object.secondsAfterWfTermination) - : undefined, - }; - }, - - toJSON(message: WorkflowRetentionPolicy): unknown { - const obj: any = {}; - if (message.secondsAfterWfTermination !== undefined) { - obj.secondsAfterWfTermination = Math.round(message.secondsAfterWfTermination); - } - return obj; - }, - - create, I>>(base?: I): WorkflowRetentionPolicy { - return WorkflowRetentionPolicy.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WorkflowRetentionPolicy { - const message = createBaseWorkflowRetentionPolicy(); - message.secondsAfterWfTermination = object.secondsAfterWfTermination ?? undefined; - return message; - }, -}; - -function createBaseJsonIndex(): JsonIndex { - return { fieldPath: "", fieldType: VariableType.JSON_OBJ }; -} - -export const JsonIndex = { - encode(message: JsonIndex, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.fieldPath !== "") { - writer.uint32(10).string(message.fieldPath); - } - if (message.fieldType !== VariableType.JSON_OBJ) { - writer.uint32(16).int32(variableTypeToNumber(message.fieldType)); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): JsonIndex { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseJsonIndex(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.fieldPath = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.fieldType = variableTypeFromJSON(reader.int32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): JsonIndex { - return { - fieldPath: isSet(object.fieldPath) ? globalThis.String(object.fieldPath) : "", - fieldType: isSet(object.fieldType) ? variableTypeFromJSON(object.fieldType) : VariableType.JSON_OBJ, - }; - }, - - toJSON(message: JsonIndex): unknown { - const obj: any = {}; - if (message.fieldPath !== "") { - obj.fieldPath = message.fieldPath; - } - if (message.fieldType !== VariableType.JSON_OBJ) { - obj.fieldType = variableTypeToJSON(message.fieldType); - } - return obj; - }, - - create, I>>(base?: I): JsonIndex { - return JsonIndex.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): JsonIndex { - const message = createBaseJsonIndex(); - message.fieldPath = object.fieldPath ?? ""; - message.fieldType = object.fieldType ?? VariableType.JSON_OBJ; - return message; - }, -}; - -function createBaseSearchableVariableDef(): SearchableVariableDef { - return { varDef: undefined }; -} - -export const SearchableVariableDef = { - encode(message: SearchableVariableDef, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.varDef !== undefined) { - VariableDef.encode(message.varDef, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SearchableVariableDef { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSearchableVariableDef(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.varDef = VariableDef.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SearchableVariableDef { - return { varDef: isSet(object.varDef) ? VariableDef.fromJSON(object.varDef) : undefined }; - }, - - toJSON(message: SearchableVariableDef): unknown { - const obj: any = {}; - if (message.varDef !== undefined) { - obj.varDef = VariableDef.toJSON(message.varDef); - } - return obj; - }, - - create, I>>(base?: I): SearchableVariableDef { - return SearchableVariableDef.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SearchableVariableDef { - const message = createBaseSearchableVariableDef(); - message.varDef = (object.varDef !== undefined && object.varDef !== null) - ? VariableDef.fromPartial(object.varDef) - : undefined; - return message; - }, -}; - -function createBaseThreadVarDef(): ThreadVarDef { - return { - varDef: undefined, - required: false, - searchable: false, - jsonIndexes: [], - accessLevel: WfRunVariableAccessLevel.PUBLIC_VAR, - }; -} - -export const ThreadVarDef = { - encode(message: ThreadVarDef, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.varDef !== undefined) { - VariableDef.encode(message.varDef, writer.uint32(10).fork()).ldelim(); - } - if (message.required !== false) { - writer.uint32(16).bool(message.required); - } - if (message.searchable !== false) { - writer.uint32(24).bool(message.searchable); - } - for (const v of message.jsonIndexes) { - JsonIndex.encode(v!, writer.uint32(34).fork()).ldelim(); - } - if (message.accessLevel !== WfRunVariableAccessLevel.PUBLIC_VAR) { - writer.uint32(40).int32(wfRunVariableAccessLevelToNumber(message.accessLevel)); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ThreadVarDef { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseThreadVarDef(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.varDef = VariableDef.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.required = reader.bool(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.searchable = reader.bool(); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.jsonIndexes.push(JsonIndex.decode(reader, reader.uint32())); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.accessLevel = wfRunVariableAccessLevelFromJSON(reader.int32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ThreadVarDef { - return { - varDef: isSet(object.varDef) ? VariableDef.fromJSON(object.varDef) : undefined, - required: isSet(object.required) ? globalThis.Boolean(object.required) : false, - searchable: isSet(object.searchable) ? globalThis.Boolean(object.searchable) : false, - jsonIndexes: globalThis.Array.isArray(object?.jsonIndexes) - ? object.jsonIndexes.map((e: any) => JsonIndex.fromJSON(e)) - : [], - accessLevel: isSet(object.accessLevel) - ? wfRunVariableAccessLevelFromJSON(object.accessLevel) - : WfRunVariableAccessLevel.PUBLIC_VAR, - }; - }, - - toJSON(message: ThreadVarDef): unknown { - const obj: any = {}; - if (message.varDef !== undefined) { - obj.varDef = VariableDef.toJSON(message.varDef); - } - if (message.required !== false) { - obj.required = message.required; - } - if (message.searchable !== false) { - obj.searchable = message.searchable; - } - if (message.jsonIndexes?.length) { - obj.jsonIndexes = message.jsonIndexes.map((e) => JsonIndex.toJSON(e)); - } - if (message.accessLevel !== WfRunVariableAccessLevel.PUBLIC_VAR) { - obj.accessLevel = wfRunVariableAccessLevelToJSON(message.accessLevel); - } - return obj; - }, - - create, I>>(base?: I): ThreadVarDef { - return ThreadVarDef.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ThreadVarDef { - const message = createBaseThreadVarDef(); - message.varDef = (object.varDef !== undefined && object.varDef !== null) - ? VariableDef.fromPartial(object.varDef) - : undefined; - message.required = object.required ?? false; - message.searchable = object.searchable ?? false; - message.jsonIndexes = object.jsonIndexes?.map((e) => JsonIndex.fromPartial(e)) || []; - message.accessLevel = object.accessLevel ?? WfRunVariableAccessLevel.PUBLIC_VAR; - return message; - }, -}; - -function createBaseThreadSpec(): ThreadSpec { - return { nodes: {}, variableDefs: [], interruptDefs: [], retentionPolicy: undefined }; -} - -export const ThreadSpec = { - encode(message: ThreadSpec, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - Object.entries(message.nodes).forEach(([key, value]) => { - ThreadSpec_NodesEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).ldelim(); - }); - for (const v of message.variableDefs) { - ThreadVarDef.encode(v!, writer.uint32(18).fork()).ldelim(); - } - for (const v of message.interruptDefs) { - InterruptDef.encode(v!, writer.uint32(26).fork()).ldelim(); - } - if (message.retentionPolicy !== undefined) { - ThreadRetentionPolicy.encode(message.retentionPolicy, writer.uint32(34).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ThreadSpec { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseThreadSpec(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - const entry1 = ThreadSpec_NodesEntry.decode(reader, reader.uint32()); - if (entry1.value !== undefined) { - message.nodes[entry1.key] = entry1.value; - } - continue; - case 2: - if (tag !== 18) { - break; - } - - message.variableDefs.push(ThreadVarDef.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.interruptDefs.push(InterruptDef.decode(reader, reader.uint32())); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.retentionPolicy = ThreadRetentionPolicy.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ThreadSpec { - return { - nodes: isObject(object.nodes) - ? Object.entries(object.nodes).reduce<{ [key: string]: Node }>((acc, [key, value]) => { - acc[key] = Node.fromJSON(value); - return acc; - }, {}) - : {}, - variableDefs: globalThis.Array.isArray(object?.variableDefs) - ? object.variableDefs.map((e: any) => ThreadVarDef.fromJSON(e)) - : [], - interruptDefs: globalThis.Array.isArray(object?.interruptDefs) - ? object.interruptDefs.map((e: any) => InterruptDef.fromJSON(e)) - : [], - retentionPolicy: isSet(object.retentionPolicy) - ? ThreadRetentionPolicy.fromJSON(object.retentionPolicy) - : undefined, - }; - }, - - toJSON(message: ThreadSpec): unknown { - const obj: any = {}; - if (message.nodes) { - const entries = Object.entries(message.nodes); - if (entries.length > 0) { - obj.nodes = {}; - entries.forEach(([k, v]) => { - obj.nodes[k] = Node.toJSON(v); - }); - } - } - if (message.variableDefs?.length) { - obj.variableDefs = message.variableDefs.map((e) => ThreadVarDef.toJSON(e)); - } - if (message.interruptDefs?.length) { - obj.interruptDefs = message.interruptDefs.map((e) => InterruptDef.toJSON(e)); - } - if (message.retentionPolicy !== undefined) { - obj.retentionPolicy = ThreadRetentionPolicy.toJSON(message.retentionPolicy); - } - return obj; - }, - - create, I>>(base?: I): ThreadSpec { - return ThreadSpec.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ThreadSpec { - const message = createBaseThreadSpec(); - message.nodes = Object.entries(object.nodes ?? {}).reduce<{ [key: string]: Node }>((acc, [key, value]) => { - if (value !== undefined) { - acc[key] = Node.fromPartial(value); - } - return acc; - }, {}); - message.variableDefs = object.variableDefs?.map((e) => ThreadVarDef.fromPartial(e)) || []; - message.interruptDefs = object.interruptDefs?.map((e) => InterruptDef.fromPartial(e)) || []; - message.retentionPolicy = (object.retentionPolicy !== undefined && object.retentionPolicy !== null) - ? ThreadRetentionPolicy.fromPartial(object.retentionPolicy) - : undefined; - return message; - }, -}; - -function createBaseThreadSpec_NodesEntry(): ThreadSpec_NodesEntry { - return { key: "", value: undefined }; -} - -export const ThreadSpec_NodesEntry = { - encode(message: ThreadSpec_NodesEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - Node.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ThreadSpec_NodesEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseThreadSpec_NodesEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = Node.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ThreadSpec_NodesEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? Node.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: ThreadSpec_NodesEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = Node.toJSON(message.value); - } - return obj; - }, - - create, I>>(base?: I): ThreadSpec_NodesEntry { - return ThreadSpec_NodesEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ThreadSpec_NodesEntry { - const message = createBaseThreadSpec_NodesEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) ? Node.fromPartial(object.value) : undefined; - return message; - }, -}; - -function createBaseThreadRetentionPolicy(): ThreadRetentionPolicy { - return { secondsAfterThreadTermination: undefined }; -} - -export const ThreadRetentionPolicy = { - encode(message: ThreadRetentionPolicy, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.secondsAfterThreadTermination !== undefined) { - writer.uint32(8).int64(message.secondsAfterThreadTermination); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ThreadRetentionPolicy { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseThreadRetentionPolicy(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.secondsAfterThreadTermination = longToNumber(reader.int64() as Long); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ThreadRetentionPolicy { - return { - secondsAfterThreadTermination: isSet(object.secondsAfterThreadTermination) - ? globalThis.Number(object.secondsAfterThreadTermination) - : undefined, - }; - }, - - toJSON(message: ThreadRetentionPolicy): unknown { - const obj: any = {}; - if (message.secondsAfterThreadTermination !== undefined) { - obj.secondsAfterThreadTermination = Math.round(message.secondsAfterThreadTermination); - } - return obj; - }, - - create, I>>(base?: I): ThreadRetentionPolicy { - return ThreadRetentionPolicy.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ThreadRetentionPolicy { - const message = createBaseThreadRetentionPolicy(); - message.secondsAfterThreadTermination = object.secondsAfterThreadTermination ?? undefined; - return message; - }, -}; - -function createBaseInterruptDef(): InterruptDef { - return { externalEventDefId: undefined, handlerSpecName: "" }; -} - -export const InterruptDef = { - encode(message: InterruptDef, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.externalEventDefId !== undefined) { - ExternalEventDefId.encode(message.externalEventDefId, writer.uint32(10).fork()).ldelim(); - } - if (message.handlerSpecName !== "") { - writer.uint32(18).string(message.handlerSpecName); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): InterruptDef { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseInterruptDef(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.externalEventDefId = ExternalEventDefId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.handlerSpecName = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): InterruptDef { - return { - externalEventDefId: isSet(object.externalEventDefId) - ? ExternalEventDefId.fromJSON(object.externalEventDefId) - : undefined, - handlerSpecName: isSet(object.handlerSpecName) ? globalThis.String(object.handlerSpecName) : "", - }; - }, - - toJSON(message: InterruptDef): unknown { - const obj: any = {}; - if (message.externalEventDefId !== undefined) { - obj.externalEventDefId = ExternalEventDefId.toJSON(message.externalEventDefId); - } - if (message.handlerSpecName !== "") { - obj.handlerSpecName = message.handlerSpecName; - } - return obj; - }, - - create, I>>(base?: I): InterruptDef { - return InterruptDef.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): InterruptDef { - const message = createBaseInterruptDef(); - message.externalEventDefId = (object.externalEventDefId !== undefined && object.externalEventDefId !== null) - ? ExternalEventDefId.fromPartial(object.externalEventDefId) - : undefined; - message.handlerSpecName = object.handlerSpecName ?? ""; - return message; - }, -}; - -function createBaseStartThreadNode(): StartThreadNode { - return { threadSpecName: "", variables: {} }; -} - -export const StartThreadNode = { - encode(message: StartThreadNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.threadSpecName !== "") { - writer.uint32(10).string(message.threadSpecName); - } - Object.entries(message.variables).forEach(([key, value]) => { - StartThreadNode_VariablesEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).ldelim(); - }); - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): StartThreadNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseStartThreadNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.threadSpecName = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - const entry2 = StartThreadNode_VariablesEntry.decode(reader, reader.uint32()); - if (entry2.value !== undefined) { - message.variables[entry2.key] = entry2.value; - } - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): StartThreadNode { - return { - threadSpecName: isSet(object.threadSpecName) ? globalThis.String(object.threadSpecName) : "", - variables: isObject(object.variables) - ? Object.entries(object.variables).reduce<{ [key: string]: VariableAssignment }>((acc, [key, value]) => { - acc[key] = VariableAssignment.fromJSON(value); - return acc; - }, {}) - : {}, - }; - }, - - toJSON(message: StartThreadNode): unknown { - const obj: any = {}; - if (message.threadSpecName !== "") { - obj.threadSpecName = message.threadSpecName; - } - if (message.variables) { - const entries = Object.entries(message.variables); - if (entries.length > 0) { - obj.variables = {}; - entries.forEach(([k, v]) => { - obj.variables[k] = VariableAssignment.toJSON(v); - }); - } - } - return obj; - }, - - create, I>>(base?: I): StartThreadNode { - return StartThreadNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): StartThreadNode { - const message = createBaseStartThreadNode(); - message.threadSpecName = object.threadSpecName ?? ""; - message.variables = Object.entries(object.variables ?? {}).reduce<{ [key: string]: VariableAssignment }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = VariableAssignment.fromPartial(value); - } - return acc; - }, - {}, - ); - return message; - }, -}; - -function createBaseStartThreadNode_VariablesEntry(): StartThreadNode_VariablesEntry { - return { key: "", value: undefined }; -} - -export const StartThreadNode_VariablesEntry = { - encode(message: StartThreadNode_VariablesEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - VariableAssignment.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): StartThreadNode_VariablesEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseStartThreadNode_VariablesEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): StartThreadNode_VariablesEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? VariableAssignment.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: StartThreadNode_VariablesEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = VariableAssignment.toJSON(message.value); - } - return obj; - }, - - create, I>>(base?: I): StartThreadNode_VariablesEntry { - return StartThreadNode_VariablesEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): StartThreadNode_VariablesEntry { - const message = createBaseStartThreadNode_VariablesEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? VariableAssignment.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseStartMultipleThreadsNode(): StartMultipleThreadsNode { - return { threadSpecName: "", variables: {}, iterable: undefined }; -} - -export const StartMultipleThreadsNode = { - encode(message: StartMultipleThreadsNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.threadSpecName !== "") { - writer.uint32(10).string(message.threadSpecName); - } - Object.entries(message.variables).forEach(([key, value]) => { - StartMultipleThreadsNode_VariablesEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).ldelim(); - }); - if (message.iterable !== undefined) { - VariableAssignment.encode(message.iterable, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): StartMultipleThreadsNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseStartMultipleThreadsNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.threadSpecName = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - const entry2 = StartMultipleThreadsNode_VariablesEntry.decode(reader, reader.uint32()); - if (entry2.value !== undefined) { - message.variables[entry2.key] = entry2.value; - } - continue; - case 3: - if (tag !== 26) { - break; - } - - message.iterable = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): StartMultipleThreadsNode { - return { - threadSpecName: isSet(object.threadSpecName) ? globalThis.String(object.threadSpecName) : "", - variables: isObject(object.variables) - ? Object.entries(object.variables).reduce<{ [key: string]: VariableAssignment }>((acc, [key, value]) => { - acc[key] = VariableAssignment.fromJSON(value); - return acc; - }, {}) - : {}, - iterable: isSet(object.iterable) ? VariableAssignment.fromJSON(object.iterable) : undefined, - }; - }, - - toJSON(message: StartMultipleThreadsNode): unknown { - const obj: any = {}; - if (message.threadSpecName !== "") { - obj.threadSpecName = message.threadSpecName; - } - if (message.variables) { - const entries = Object.entries(message.variables); - if (entries.length > 0) { - obj.variables = {}; - entries.forEach(([k, v]) => { - obj.variables[k] = VariableAssignment.toJSON(v); - }); - } - } - if (message.iterable !== undefined) { - obj.iterable = VariableAssignment.toJSON(message.iterable); - } - return obj; - }, - - create, I>>(base?: I): StartMultipleThreadsNode { - return StartMultipleThreadsNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): StartMultipleThreadsNode { - const message = createBaseStartMultipleThreadsNode(); - message.threadSpecName = object.threadSpecName ?? ""; - message.variables = Object.entries(object.variables ?? {}).reduce<{ [key: string]: VariableAssignment }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = VariableAssignment.fromPartial(value); - } - return acc; - }, - {}, - ); - message.iterable = (object.iterable !== undefined && object.iterable !== null) - ? VariableAssignment.fromPartial(object.iterable) - : undefined; - return message; - }, -}; - -function createBaseStartMultipleThreadsNode_VariablesEntry(): StartMultipleThreadsNode_VariablesEntry { - return { key: "", value: undefined }; -} - -export const StartMultipleThreadsNode_VariablesEntry = { - encode(message: StartMultipleThreadsNode_VariablesEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - VariableAssignment.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): StartMultipleThreadsNode_VariablesEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseStartMultipleThreadsNode_VariablesEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): StartMultipleThreadsNode_VariablesEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? VariableAssignment.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: StartMultipleThreadsNode_VariablesEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = VariableAssignment.toJSON(message.value); - } - return obj; - }, - - create, I>>( - base?: I, - ): StartMultipleThreadsNode_VariablesEntry { - return StartMultipleThreadsNode_VariablesEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): StartMultipleThreadsNode_VariablesEntry { - const message = createBaseStartMultipleThreadsNode_VariablesEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? VariableAssignment.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseFailureHandlerDef(): FailureHandlerDef { - return { handlerSpecName: "", specificFailure: undefined, anyFailureOfType: undefined }; -} - -export const FailureHandlerDef = { - encode(message: FailureHandlerDef, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.handlerSpecName !== "") { - writer.uint32(18).string(message.handlerSpecName); - } - if (message.specificFailure !== undefined) { - writer.uint32(10).string(message.specificFailure); - } - if (message.anyFailureOfType !== undefined) { - writer.uint32(24).int32(failureHandlerDef_LHFailureTypeToNumber(message.anyFailureOfType)); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): FailureHandlerDef { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseFailureHandlerDef(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 2: - if (tag !== 18) { - break; - } - - message.handlerSpecName = reader.string(); - continue; - case 1: - if (tag !== 10) { - break; - } - - message.specificFailure = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.anyFailureOfType = failureHandlerDef_LHFailureTypeFromJSON(reader.int32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): FailureHandlerDef { - return { - handlerSpecName: isSet(object.handlerSpecName) ? globalThis.String(object.handlerSpecName) : "", - specificFailure: isSet(object.specificFailure) ? globalThis.String(object.specificFailure) : undefined, - anyFailureOfType: isSet(object.anyFailureOfType) - ? failureHandlerDef_LHFailureTypeFromJSON(object.anyFailureOfType) - : undefined, - }; - }, - - toJSON(message: FailureHandlerDef): unknown { - const obj: any = {}; - if (message.handlerSpecName !== "") { - obj.handlerSpecName = message.handlerSpecName; - } - if (message.specificFailure !== undefined) { - obj.specificFailure = message.specificFailure; - } - if (message.anyFailureOfType !== undefined) { - obj.anyFailureOfType = failureHandlerDef_LHFailureTypeToJSON(message.anyFailureOfType); - } - return obj; - }, - - create, I>>(base?: I): FailureHandlerDef { - return FailureHandlerDef.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): FailureHandlerDef { - const message = createBaseFailureHandlerDef(); - message.handlerSpecName = object.handlerSpecName ?? ""; - message.specificFailure = object.specificFailure ?? undefined; - message.anyFailureOfType = object.anyFailureOfType ?? undefined; - return message; - }, -}; - -function createBaseWaitForThreadsNode(): WaitForThreadsNode { - return { threads: undefined, threadList: undefined, perThreadFailureHandlers: [] }; -} - -export const WaitForThreadsNode = { - encode(message: WaitForThreadsNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.threads !== undefined) { - WaitForThreadsNode_ThreadsToWaitFor.encode(message.threads, writer.uint32(10).fork()).ldelim(); - } - if (message.threadList !== undefined) { - VariableAssignment.encode(message.threadList, writer.uint32(18).fork()).ldelim(); - } - for (const v of message.perThreadFailureHandlers) { - FailureHandlerDef.encode(v!, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WaitForThreadsNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWaitForThreadsNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.threads = WaitForThreadsNode_ThreadsToWaitFor.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.threadList = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.perThreadFailureHandlers.push(FailureHandlerDef.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WaitForThreadsNode { - return { - threads: isSet(object.threads) ? WaitForThreadsNode_ThreadsToWaitFor.fromJSON(object.threads) : undefined, - threadList: isSet(object.threadList) ? VariableAssignment.fromJSON(object.threadList) : undefined, - perThreadFailureHandlers: globalThis.Array.isArray(object?.perThreadFailureHandlers) - ? object.perThreadFailureHandlers.map((e: any) => FailureHandlerDef.fromJSON(e)) - : [], - }; - }, - - toJSON(message: WaitForThreadsNode): unknown { - const obj: any = {}; - if (message.threads !== undefined) { - obj.threads = WaitForThreadsNode_ThreadsToWaitFor.toJSON(message.threads); - } - if (message.threadList !== undefined) { - obj.threadList = VariableAssignment.toJSON(message.threadList); - } - if (message.perThreadFailureHandlers?.length) { - obj.perThreadFailureHandlers = message.perThreadFailureHandlers.map((e) => FailureHandlerDef.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): WaitForThreadsNode { - return WaitForThreadsNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WaitForThreadsNode { - const message = createBaseWaitForThreadsNode(); - message.threads = (object.threads !== undefined && object.threads !== null) - ? WaitForThreadsNode_ThreadsToWaitFor.fromPartial(object.threads) - : undefined; - message.threadList = (object.threadList !== undefined && object.threadList !== null) - ? VariableAssignment.fromPartial(object.threadList) - : undefined; - message.perThreadFailureHandlers = object.perThreadFailureHandlers?.map((e) => FailureHandlerDef.fromPartial(e)) || - []; - return message; - }, -}; - -function createBaseWaitForThreadsNode_ThreadToWaitFor(): WaitForThreadsNode_ThreadToWaitFor { - return { threadRunNumber: undefined }; -} - -export const WaitForThreadsNode_ThreadToWaitFor = { - encode(message: WaitForThreadsNode_ThreadToWaitFor, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.threadRunNumber !== undefined) { - VariableAssignment.encode(message.threadRunNumber, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WaitForThreadsNode_ThreadToWaitFor { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWaitForThreadsNode_ThreadToWaitFor(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.threadRunNumber = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WaitForThreadsNode_ThreadToWaitFor { - return { - threadRunNumber: isSet(object.threadRunNumber) ? VariableAssignment.fromJSON(object.threadRunNumber) : undefined, - }; - }, - - toJSON(message: WaitForThreadsNode_ThreadToWaitFor): unknown { - const obj: any = {}; - if (message.threadRunNumber !== undefined) { - obj.threadRunNumber = VariableAssignment.toJSON(message.threadRunNumber); - } - return obj; - }, - - create, I>>( - base?: I, - ): WaitForThreadsNode_ThreadToWaitFor { - return WaitForThreadsNode_ThreadToWaitFor.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): WaitForThreadsNode_ThreadToWaitFor { - const message = createBaseWaitForThreadsNode_ThreadToWaitFor(); - message.threadRunNumber = (object.threadRunNumber !== undefined && object.threadRunNumber !== null) - ? VariableAssignment.fromPartial(object.threadRunNumber) - : undefined; - return message; - }, -}; - -function createBaseWaitForThreadsNode_ThreadsToWaitFor(): WaitForThreadsNode_ThreadsToWaitFor { - return { threads: [] }; -} - -export const WaitForThreadsNode_ThreadsToWaitFor = { - encode(message: WaitForThreadsNode_ThreadsToWaitFor, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.threads) { - WaitForThreadsNode_ThreadToWaitFor.encode(v!, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WaitForThreadsNode_ThreadsToWaitFor { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWaitForThreadsNode_ThreadsToWaitFor(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.threads.push(WaitForThreadsNode_ThreadToWaitFor.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WaitForThreadsNode_ThreadsToWaitFor { - return { - threads: globalThis.Array.isArray(object?.threads) - ? object.threads.map((e: any) => WaitForThreadsNode_ThreadToWaitFor.fromJSON(e)) - : [], - }; - }, - - toJSON(message: WaitForThreadsNode_ThreadsToWaitFor): unknown { - const obj: any = {}; - if (message.threads?.length) { - obj.threads = message.threads.map((e) => WaitForThreadsNode_ThreadToWaitFor.toJSON(e)); - } - return obj; - }, - - create, I>>( - base?: I, - ): WaitForThreadsNode_ThreadsToWaitFor { - return WaitForThreadsNode_ThreadsToWaitFor.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): WaitForThreadsNode_ThreadsToWaitFor { - const message = createBaseWaitForThreadsNode_ThreadsToWaitFor(); - message.threads = object.threads?.map((e) => WaitForThreadsNode_ThreadToWaitFor.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseExternalEventNode(): ExternalEventNode { - return { externalEventDefId: undefined, timeoutSeconds: undefined }; -} - -export const ExternalEventNode = { - encode(message: ExternalEventNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.externalEventDefId !== undefined) { - ExternalEventDefId.encode(message.externalEventDefId, writer.uint32(10).fork()).ldelim(); - } - if (message.timeoutSeconds !== undefined) { - VariableAssignment.encode(message.timeoutSeconds, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExternalEventNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExternalEventNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.externalEventDefId = ExternalEventDefId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.timeoutSeconds = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExternalEventNode { - return { - externalEventDefId: isSet(object.externalEventDefId) - ? ExternalEventDefId.fromJSON(object.externalEventDefId) - : undefined, - timeoutSeconds: isSet(object.timeoutSeconds) ? VariableAssignment.fromJSON(object.timeoutSeconds) : undefined, - }; - }, - - toJSON(message: ExternalEventNode): unknown { - const obj: any = {}; - if (message.externalEventDefId !== undefined) { - obj.externalEventDefId = ExternalEventDefId.toJSON(message.externalEventDefId); - } - if (message.timeoutSeconds !== undefined) { - obj.timeoutSeconds = VariableAssignment.toJSON(message.timeoutSeconds); - } - return obj; - }, - - create, I>>(base?: I): ExternalEventNode { - return ExternalEventNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExternalEventNode { - const message = createBaseExternalEventNode(); - message.externalEventDefId = (object.externalEventDefId !== undefined && object.externalEventDefId !== null) - ? ExternalEventDefId.fromPartial(object.externalEventDefId) - : undefined; - message.timeoutSeconds = (object.timeoutSeconds !== undefined && object.timeoutSeconds !== null) - ? VariableAssignment.fromPartial(object.timeoutSeconds) - : undefined; - return message; - }, -}; - -function createBaseEntrypointNode(): EntrypointNode { - return {}; -} - -export const EntrypointNode = { - encode(_: EntrypointNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): EntrypointNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEntrypointNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(_: any): EntrypointNode { - return {}; - }, - - toJSON(_: EntrypointNode): unknown { - const obj: any = {}; - return obj; - }, - - create, I>>(base?: I): EntrypointNode { - return EntrypointNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(_: I): EntrypointNode { - const message = createBaseEntrypointNode(); - return message; - }, -}; - -function createBaseExitNode(): ExitNode { - return { failureDef: undefined }; -} - -export const ExitNode = { - encode(message: ExitNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.failureDef !== undefined) { - FailureDef.encode(message.failureDef, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ExitNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseExitNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.failureDef = FailureDef.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ExitNode { - return { failureDef: isSet(object.failureDef) ? FailureDef.fromJSON(object.failureDef) : undefined }; - }, - - toJSON(message: ExitNode): unknown { - const obj: any = {}; - if (message.failureDef !== undefined) { - obj.failureDef = FailureDef.toJSON(message.failureDef); - } - return obj; - }, - - create, I>>(base?: I): ExitNode { - return ExitNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ExitNode { - const message = createBaseExitNode(); - message.failureDef = (object.failureDef !== undefined && object.failureDef !== null) - ? FailureDef.fromPartial(object.failureDef) - : undefined; - return message; - }, -}; - -function createBaseFailureDef(): FailureDef { - return { failureName: "", message: "", content: undefined }; -} - -export const FailureDef = { - encode(message: FailureDef, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.failureName !== "") { - writer.uint32(10).string(message.failureName); - } - if (message.message !== "") { - writer.uint32(18).string(message.message); - } - if (message.content !== undefined) { - VariableAssignment.encode(message.content, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): FailureDef { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseFailureDef(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.failureName = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.message = reader.string(); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.content = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): FailureDef { - return { - failureName: isSet(object.failureName) ? globalThis.String(object.failureName) : "", - message: isSet(object.message) ? globalThis.String(object.message) : "", - content: isSet(object.content) ? VariableAssignment.fromJSON(object.content) : undefined, - }; - }, - - toJSON(message: FailureDef): unknown { - const obj: any = {}; - if (message.failureName !== "") { - obj.failureName = message.failureName; - } - if (message.message !== "") { - obj.message = message.message; - } - if (message.content !== undefined) { - obj.content = VariableAssignment.toJSON(message.content); - } - return obj; - }, - - create, I>>(base?: I): FailureDef { - return FailureDef.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): FailureDef { - const message = createBaseFailureDef(); - message.failureName = object.failureName ?? ""; - message.message = object.message ?? ""; - message.content = (object.content !== undefined && object.content !== null) - ? VariableAssignment.fromPartial(object.content) - : undefined; - return message; - }, -}; - -function createBaseNode(): Node { - return { - outgoingEdges: [], - failureHandlers: [], - entrypoint: undefined, - exit: undefined, - task: undefined, - externalEvent: undefined, - startThread: undefined, - waitForThreads: undefined, - nop: undefined, - sleep: undefined, - userTask: undefined, - startMultipleThreads: undefined, - throwEvent: undefined, - }; -} - -export const Node = { - encode(message: Node, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - for (const v of message.outgoingEdges) { - Edge.encode(v!, writer.uint32(10).fork()).ldelim(); - } - for (const v of message.failureHandlers) { - FailureHandlerDef.encode(v!, writer.uint32(34).fork()).ldelim(); - } - if (message.entrypoint !== undefined) { - EntrypointNode.encode(message.entrypoint, writer.uint32(42).fork()).ldelim(); - } - if (message.exit !== undefined) { - ExitNode.encode(message.exit, writer.uint32(50).fork()).ldelim(); - } - if (message.task !== undefined) { - TaskNode.encode(message.task, writer.uint32(58).fork()).ldelim(); - } - if (message.externalEvent !== undefined) { - ExternalEventNode.encode(message.externalEvent, writer.uint32(66).fork()).ldelim(); - } - if (message.startThread !== undefined) { - StartThreadNode.encode(message.startThread, writer.uint32(74).fork()).ldelim(); - } - if (message.waitForThreads !== undefined) { - WaitForThreadsNode.encode(message.waitForThreads, writer.uint32(82).fork()).ldelim(); - } - if (message.nop !== undefined) { - NopNode.encode(message.nop, writer.uint32(90).fork()).ldelim(); - } - if (message.sleep !== undefined) { - SleepNode.encode(message.sleep, writer.uint32(98).fork()).ldelim(); - } - if (message.userTask !== undefined) { - UserTaskNode.encode(message.userTask, writer.uint32(106).fork()).ldelim(); - } - if (message.startMultipleThreads !== undefined) { - StartMultipleThreadsNode.encode(message.startMultipleThreads, writer.uint32(122).fork()).ldelim(); - } - if (message.throwEvent !== undefined) { - ThrowEventNode.encode(message.throwEvent, writer.uint32(130).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Node { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.outgoingEdges.push(Edge.decode(reader, reader.uint32())); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.failureHandlers.push(FailureHandlerDef.decode(reader, reader.uint32())); - continue; - case 5: - if (tag !== 42) { - break; - } - - message.entrypoint = EntrypointNode.decode(reader, reader.uint32()); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.exit = ExitNode.decode(reader, reader.uint32()); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.task = TaskNode.decode(reader, reader.uint32()); - continue; - case 8: - if (tag !== 66) { - break; - } - - message.externalEvent = ExternalEventNode.decode(reader, reader.uint32()); - continue; - case 9: - if (tag !== 74) { - break; - } - - message.startThread = StartThreadNode.decode(reader, reader.uint32()); - continue; - case 10: - if (tag !== 82) { - break; - } - - message.waitForThreads = WaitForThreadsNode.decode(reader, reader.uint32()); - continue; - case 11: - if (tag !== 90) { - break; - } - - message.nop = NopNode.decode(reader, reader.uint32()); - continue; - case 12: - if (tag !== 98) { - break; - } - - message.sleep = SleepNode.decode(reader, reader.uint32()); - continue; - case 13: - if (tag !== 106) { - break; - } - - message.userTask = UserTaskNode.decode(reader, reader.uint32()); - continue; - case 15: - if (tag !== 122) { - break; - } - - message.startMultipleThreads = StartMultipleThreadsNode.decode(reader, reader.uint32()); - continue; - case 16: - if (tag !== 130) { - break; - } - - message.throwEvent = ThrowEventNode.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): Node { - return { - outgoingEdges: globalThis.Array.isArray(object?.outgoingEdges) - ? object.outgoingEdges.map((e: any) => Edge.fromJSON(e)) - : [], - failureHandlers: globalThis.Array.isArray(object?.failureHandlers) - ? object.failureHandlers.map((e: any) => FailureHandlerDef.fromJSON(e)) - : [], - entrypoint: isSet(object.entrypoint) ? EntrypointNode.fromJSON(object.entrypoint) : undefined, - exit: isSet(object.exit) ? ExitNode.fromJSON(object.exit) : undefined, - task: isSet(object.task) ? TaskNode.fromJSON(object.task) : undefined, - externalEvent: isSet(object.externalEvent) ? ExternalEventNode.fromJSON(object.externalEvent) : undefined, - startThread: isSet(object.startThread) ? StartThreadNode.fromJSON(object.startThread) : undefined, - waitForThreads: isSet(object.waitForThreads) ? WaitForThreadsNode.fromJSON(object.waitForThreads) : undefined, - nop: isSet(object.nop) ? NopNode.fromJSON(object.nop) : undefined, - sleep: isSet(object.sleep) ? SleepNode.fromJSON(object.sleep) : undefined, - userTask: isSet(object.userTask) ? UserTaskNode.fromJSON(object.userTask) : undefined, - startMultipleThreads: isSet(object.startMultipleThreads) - ? StartMultipleThreadsNode.fromJSON(object.startMultipleThreads) - : undefined, - throwEvent: isSet(object.throwEvent) ? ThrowEventNode.fromJSON(object.throwEvent) : undefined, - }; - }, - - toJSON(message: Node): unknown { - const obj: any = {}; - if (message.outgoingEdges?.length) { - obj.outgoingEdges = message.outgoingEdges.map((e) => Edge.toJSON(e)); - } - if (message.failureHandlers?.length) { - obj.failureHandlers = message.failureHandlers.map((e) => FailureHandlerDef.toJSON(e)); - } - if (message.entrypoint !== undefined) { - obj.entrypoint = EntrypointNode.toJSON(message.entrypoint); - } - if (message.exit !== undefined) { - obj.exit = ExitNode.toJSON(message.exit); - } - if (message.task !== undefined) { - obj.task = TaskNode.toJSON(message.task); - } - if (message.externalEvent !== undefined) { - obj.externalEvent = ExternalEventNode.toJSON(message.externalEvent); - } - if (message.startThread !== undefined) { - obj.startThread = StartThreadNode.toJSON(message.startThread); - } - if (message.waitForThreads !== undefined) { - obj.waitForThreads = WaitForThreadsNode.toJSON(message.waitForThreads); - } - if (message.nop !== undefined) { - obj.nop = NopNode.toJSON(message.nop); - } - if (message.sleep !== undefined) { - obj.sleep = SleepNode.toJSON(message.sleep); - } - if (message.userTask !== undefined) { - obj.userTask = UserTaskNode.toJSON(message.userTask); - } - if (message.startMultipleThreads !== undefined) { - obj.startMultipleThreads = StartMultipleThreadsNode.toJSON(message.startMultipleThreads); - } - if (message.throwEvent !== undefined) { - obj.throwEvent = ThrowEventNode.toJSON(message.throwEvent); - } - return obj; - }, - - create, I>>(base?: I): Node { - return Node.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Node { - const message = createBaseNode(); - message.outgoingEdges = object.outgoingEdges?.map((e) => Edge.fromPartial(e)) || []; - message.failureHandlers = object.failureHandlers?.map((e) => FailureHandlerDef.fromPartial(e)) || []; - message.entrypoint = (object.entrypoint !== undefined && object.entrypoint !== null) - ? EntrypointNode.fromPartial(object.entrypoint) - : undefined; - message.exit = (object.exit !== undefined && object.exit !== null) ? ExitNode.fromPartial(object.exit) : undefined; - message.task = (object.task !== undefined && object.task !== null) ? TaskNode.fromPartial(object.task) : undefined; - message.externalEvent = (object.externalEvent !== undefined && object.externalEvent !== null) - ? ExternalEventNode.fromPartial(object.externalEvent) - : undefined; - message.startThread = (object.startThread !== undefined && object.startThread !== null) - ? StartThreadNode.fromPartial(object.startThread) - : undefined; - message.waitForThreads = (object.waitForThreads !== undefined && object.waitForThreads !== null) - ? WaitForThreadsNode.fromPartial(object.waitForThreads) - : undefined; - message.nop = (object.nop !== undefined && object.nop !== null) ? NopNode.fromPartial(object.nop) : undefined; - message.sleep = (object.sleep !== undefined && object.sleep !== null) - ? SleepNode.fromPartial(object.sleep) - : undefined; - message.userTask = (object.userTask !== undefined && object.userTask !== null) - ? UserTaskNode.fromPartial(object.userTask) - : undefined; - message.startMultipleThreads = (object.startMultipleThreads !== undefined && object.startMultipleThreads !== null) - ? StartMultipleThreadsNode.fromPartial(object.startMultipleThreads) - : undefined; - message.throwEvent = (object.throwEvent !== undefined && object.throwEvent !== null) - ? ThrowEventNode.fromPartial(object.throwEvent) - : undefined; - return message; - }, -}; - -function createBaseThrowEventNode(): ThrowEventNode { - return { eventDefId: undefined, content: undefined }; -} - -export const ThrowEventNode = { - encode(message: ThrowEventNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.eventDefId !== undefined) { - WorkflowEventDefId.encode(message.eventDefId, writer.uint32(10).fork()).ldelim(); - } - if (message.content !== undefined) { - VariableAssignment.encode(message.content, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ThrowEventNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseThrowEventNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.eventDefId = WorkflowEventDefId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.content = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ThrowEventNode { - return { - eventDefId: isSet(object.eventDefId) ? WorkflowEventDefId.fromJSON(object.eventDefId) : undefined, - content: isSet(object.content) ? VariableAssignment.fromJSON(object.content) : undefined, - }; - }, - - toJSON(message: ThrowEventNode): unknown { - const obj: any = {}; - if (message.eventDefId !== undefined) { - obj.eventDefId = WorkflowEventDefId.toJSON(message.eventDefId); - } - if (message.content !== undefined) { - obj.content = VariableAssignment.toJSON(message.content); - } - return obj; - }, - - create, I>>(base?: I): ThrowEventNode { - return ThrowEventNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ThrowEventNode { - const message = createBaseThrowEventNode(); - message.eventDefId = (object.eventDefId !== undefined && object.eventDefId !== null) - ? WorkflowEventDefId.fromPartial(object.eventDefId) - : undefined; - message.content = (object.content !== undefined && object.content !== null) - ? VariableAssignment.fromPartial(object.content) - : undefined; - return message; - }, -}; - -function createBaseUserTaskNode(): UserTaskNode { - return { - userTaskDefName: "", - userGroup: undefined, - userId: undefined, - actions: [], - userTaskDefVersion: undefined, - notes: undefined, - onCancellationExceptionName: undefined, - }; -} - -export const UserTaskNode = { - encode(message: UserTaskNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.userTaskDefName !== "") { - writer.uint32(10).string(message.userTaskDefName); - } - if (message.userGroup !== undefined) { - VariableAssignment.encode(message.userGroup, writer.uint32(18).fork()).ldelim(); - } - if (message.userId !== undefined) { - VariableAssignment.encode(message.userId, writer.uint32(26).fork()).ldelim(); - } - for (const v of message.actions) { - UTActionTrigger.encode(v!, writer.uint32(34).fork()).ldelim(); - } - if (message.userTaskDefVersion !== undefined) { - writer.uint32(40).int32(message.userTaskDefVersion); - } - if (message.notes !== undefined) { - VariableAssignment.encode(message.notes, writer.uint32(50).fork()).ldelim(); - } - if (message.onCancellationExceptionName !== undefined) { - VariableAssignment.encode(message.onCancellationExceptionName, writer.uint32(58).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): UserTaskNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserTaskNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.userTaskDefName = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.userGroup = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.userId = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 4: - if (tag !== 34) { - break; - } - - message.actions.push(UTActionTrigger.decode(reader, reader.uint32())); - continue; - case 5: - if (tag !== 40) { - break; - } - - message.userTaskDefVersion = reader.int32(); - continue; - case 6: - if (tag !== 50) { - break; - } - - message.notes = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 7: - if (tag !== 58) { - break; - } - - message.onCancellationExceptionName = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): UserTaskNode { - return { - userTaskDefName: isSet(object.userTaskDefName) ? globalThis.String(object.userTaskDefName) : "", - userGroup: isSet(object.userGroup) ? VariableAssignment.fromJSON(object.userGroup) : undefined, - userId: isSet(object.userId) ? VariableAssignment.fromJSON(object.userId) : undefined, - actions: globalThis.Array.isArray(object?.actions) - ? object.actions.map((e: any) => UTActionTrigger.fromJSON(e)) - : [], - userTaskDefVersion: isSet(object.userTaskDefVersion) ? globalThis.Number(object.userTaskDefVersion) : undefined, - notes: isSet(object.notes) ? VariableAssignment.fromJSON(object.notes) : undefined, - onCancellationExceptionName: isSet(object.onCancellationExceptionName) - ? VariableAssignment.fromJSON(object.onCancellationExceptionName) - : undefined, - }; - }, - - toJSON(message: UserTaskNode): unknown { - const obj: any = {}; - if (message.userTaskDefName !== "") { - obj.userTaskDefName = message.userTaskDefName; - } - if (message.userGroup !== undefined) { - obj.userGroup = VariableAssignment.toJSON(message.userGroup); - } - if (message.userId !== undefined) { - obj.userId = VariableAssignment.toJSON(message.userId); - } - if (message.actions?.length) { - obj.actions = message.actions.map((e) => UTActionTrigger.toJSON(e)); - } - if (message.userTaskDefVersion !== undefined) { - obj.userTaskDefVersion = Math.round(message.userTaskDefVersion); - } - if (message.notes !== undefined) { - obj.notes = VariableAssignment.toJSON(message.notes); - } - if (message.onCancellationExceptionName !== undefined) { - obj.onCancellationExceptionName = VariableAssignment.toJSON(message.onCancellationExceptionName); - } - return obj; - }, - - create, I>>(base?: I): UserTaskNode { - return UserTaskNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UserTaskNode { - const message = createBaseUserTaskNode(); - message.userTaskDefName = object.userTaskDefName ?? ""; - message.userGroup = (object.userGroup !== undefined && object.userGroup !== null) - ? VariableAssignment.fromPartial(object.userGroup) - : undefined; - message.userId = (object.userId !== undefined && object.userId !== null) - ? VariableAssignment.fromPartial(object.userId) - : undefined; - message.actions = object.actions?.map((e) => UTActionTrigger.fromPartial(e)) || []; - message.userTaskDefVersion = object.userTaskDefVersion ?? undefined; - message.notes = (object.notes !== undefined && object.notes !== null) - ? VariableAssignment.fromPartial(object.notes) - : undefined; - message.onCancellationExceptionName = - (object.onCancellationExceptionName !== undefined && object.onCancellationExceptionName !== null) - ? VariableAssignment.fromPartial(object.onCancellationExceptionName) - : undefined; - return message; - }, -}; - -function createBaseEdgeCondition(): EdgeCondition { - return { comparator: Comparator.LESS_THAN, left: undefined, right: undefined }; -} - -export const EdgeCondition = { - encode(message: EdgeCondition, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.comparator !== Comparator.LESS_THAN) { - writer.uint32(8).int32(comparatorToNumber(message.comparator)); - } - if (message.left !== undefined) { - VariableAssignment.encode(message.left, writer.uint32(18).fork()).ldelim(); - } - if (message.right !== undefined) { - VariableAssignment.encode(message.right, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): EdgeCondition { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEdgeCondition(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.comparator = comparatorFromJSON(reader.int32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.left = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.right = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): EdgeCondition { - return { - comparator: isSet(object.comparator) ? comparatorFromJSON(object.comparator) : Comparator.LESS_THAN, - left: isSet(object.left) ? VariableAssignment.fromJSON(object.left) : undefined, - right: isSet(object.right) ? VariableAssignment.fromJSON(object.right) : undefined, - }; - }, - - toJSON(message: EdgeCondition): unknown { - const obj: any = {}; - if (message.comparator !== Comparator.LESS_THAN) { - obj.comparator = comparatorToJSON(message.comparator); - } - if (message.left !== undefined) { - obj.left = VariableAssignment.toJSON(message.left); - } - if (message.right !== undefined) { - obj.right = VariableAssignment.toJSON(message.right); - } - return obj; - }, - - create, I>>(base?: I): EdgeCondition { - return EdgeCondition.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): EdgeCondition { - const message = createBaseEdgeCondition(); - message.comparator = object.comparator ?? Comparator.LESS_THAN; - message.left = (object.left !== undefined && object.left !== null) - ? VariableAssignment.fromPartial(object.left) - : undefined; - message.right = (object.right !== undefined && object.right !== null) - ? VariableAssignment.fromPartial(object.right) - : undefined; - return message; - }, -}; - -function createBaseEdge(): Edge { - return { sinkNodeName: "", condition: undefined, variableMutations: [] }; -} - -export const Edge = { - encode(message: Edge, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.sinkNodeName !== "") { - writer.uint32(10).string(message.sinkNodeName); - } - if (message.condition !== undefined) { - EdgeCondition.encode(message.condition, writer.uint32(18).fork()).ldelim(); - } - for (const v of message.variableMutations) { - VariableMutation.encode(v!, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): Edge { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEdge(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.sinkNodeName = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.condition = EdgeCondition.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.variableMutations.push(VariableMutation.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): Edge { - return { - sinkNodeName: isSet(object.sinkNodeName) ? globalThis.String(object.sinkNodeName) : "", - condition: isSet(object.condition) ? EdgeCondition.fromJSON(object.condition) : undefined, - variableMutations: globalThis.Array.isArray(object?.variableMutations) - ? object.variableMutations.map((e: any) => VariableMutation.fromJSON(e)) - : [], - }; - }, - - toJSON(message: Edge): unknown { - const obj: any = {}; - if (message.sinkNodeName !== "") { - obj.sinkNodeName = message.sinkNodeName; - } - if (message.condition !== undefined) { - obj.condition = EdgeCondition.toJSON(message.condition); - } - if (message.variableMutations?.length) { - obj.variableMutations = message.variableMutations.map((e) => VariableMutation.toJSON(e)); - } - return obj; - }, - - create, I>>(base?: I): Edge { - return Edge.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): Edge { - const message = createBaseEdge(); - message.sinkNodeName = object.sinkNodeName ?? ""; - message.condition = (object.condition !== undefined && object.condition !== null) - ? EdgeCondition.fromPartial(object.condition) - : undefined; - message.variableMutations = object.variableMutations?.map((e) => VariableMutation.fromPartial(e)) || []; - return message; - }, -}; - -function createBaseNopNode(): NopNode { - return {}; -} - -export const NopNode = { - encode(_: NopNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): NopNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseNopNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(_: any): NopNode { - return {}; - }, - - toJSON(_: NopNode): unknown { - const obj: any = {}; - return obj; - }, - - create, I>>(base?: I): NopNode { - return NopNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(_: I): NopNode { - const message = createBaseNopNode(); - return message; - }, -}; - -function createBaseSleepNode(): SleepNode { - return { rawSeconds: undefined, timestamp: undefined, isoDate: undefined }; -} - -export const SleepNode = { - encode(message: SleepNode, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.rawSeconds !== undefined) { - VariableAssignment.encode(message.rawSeconds, writer.uint32(10).fork()).ldelim(); - } - if (message.timestamp !== undefined) { - VariableAssignment.encode(message.timestamp, writer.uint32(18).fork()).ldelim(); - } - if (message.isoDate !== undefined) { - VariableAssignment.encode(message.isoDate, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): SleepNode { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSleepNode(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.rawSeconds = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.timestamp = VariableAssignment.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.isoDate = VariableAssignment.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): SleepNode { - return { - rawSeconds: isSet(object.rawSeconds) ? VariableAssignment.fromJSON(object.rawSeconds) : undefined, - timestamp: isSet(object.timestamp) ? VariableAssignment.fromJSON(object.timestamp) : undefined, - isoDate: isSet(object.isoDate) ? VariableAssignment.fromJSON(object.isoDate) : undefined, - }; - }, - - toJSON(message: SleepNode): unknown { - const obj: any = {}; - if (message.rawSeconds !== undefined) { - obj.rawSeconds = VariableAssignment.toJSON(message.rawSeconds); - } - if (message.timestamp !== undefined) { - obj.timestamp = VariableAssignment.toJSON(message.timestamp); - } - if (message.isoDate !== undefined) { - obj.isoDate = VariableAssignment.toJSON(message.isoDate); - } - return obj; - }, - - create, I>>(base?: I): SleepNode { - return SleepNode.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SleepNode { - const message = createBaseSleepNode(); - message.rawSeconds = (object.rawSeconds !== undefined && object.rawSeconds !== null) - ? VariableAssignment.fromPartial(object.rawSeconds) - : undefined; - message.timestamp = (object.timestamp !== undefined && object.timestamp !== null) - ? VariableAssignment.fromPartial(object.timestamp) - : undefined; - message.isoDate = (object.isoDate !== undefined && object.isoDate !== null) - ? VariableAssignment.fromPartial(object.isoDate) - : undefined; - return message; - }, -}; - -function createBaseWfSpecVersionMigration(): WfSpecVersionMigration { - return { newMajorVersion: 0, newRevision: 0, threadSpecMigrations: {} }; -} - -export const WfSpecVersionMigration = { - encode(message: WfSpecVersionMigration, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.newMajorVersion !== 0) { - writer.uint32(8).int32(message.newMajorVersion); - } - if (message.newRevision !== 0) { - writer.uint32(16).int32(message.newRevision); - } - Object.entries(message.threadSpecMigrations).forEach(([key, value]) => { - WfSpecVersionMigration_ThreadSpecMigrationsEntry.encode({ key: key as any, value }, writer.uint32(26).fork()) - .ldelim(); - }); - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfSpecVersionMigration { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfSpecVersionMigration(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.newMajorVersion = reader.int32(); - continue; - case 2: - if (tag !== 16) { - break; - } - - message.newRevision = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - - const entry3 = WfSpecVersionMigration_ThreadSpecMigrationsEntry.decode(reader, reader.uint32()); - if (entry3.value !== undefined) { - message.threadSpecMigrations[entry3.key] = entry3.value; - } - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfSpecVersionMigration { - return { - newMajorVersion: isSet(object.newMajorVersion) ? globalThis.Number(object.newMajorVersion) : 0, - newRevision: isSet(object.newRevision) ? globalThis.Number(object.newRevision) : 0, - threadSpecMigrations: isObject(object.threadSpecMigrations) - ? Object.entries(object.threadSpecMigrations).reduce<{ [key: string]: ThreadSpecMigration }>( - (acc, [key, value]) => { - acc[key] = ThreadSpecMigration.fromJSON(value); - return acc; - }, - {}, - ) - : {}, - }; - }, - - toJSON(message: WfSpecVersionMigration): unknown { - const obj: any = {}; - if (message.newMajorVersion !== 0) { - obj.newMajorVersion = Math.round(message.newMajorVersion); - } - if (message.newRevision !== 0) { - obj.newRevision = Math.round(message.newRevision); - } - if (message.threadSpecMigrations) { - const entries = Object.entries(message.threadSpecMigrations); - if (entries.length > 0) { - obj.threadSpecMigrations = {}; - entries.forEach(([k, v]) => { - obj.threadSpecMigrations[k] = ThreadSpecMigration.toJSON(v); - }); - } - } - return obj; - }, - - create, I>>(base?: I): WfSpecVersionMigration { - return WfSpecVersionMigration.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WfSpecVersionMigration { - const message = createBaseWfSpecVersionMigration(); - message.newMajorVersion = object.newMajorVersion ?? 0; - message.newRevision = object.newRevision ?? 0; - message.threadSpecMigrations = Object.entries(object.threadSpecMigrations ?? {}).reduce< - { [key: string]: ThreadSpecMigration } - >((acc, [key, value]) => { - if (value !== undefined) { - acc[key] = ThreadSpecMigration.fromPartial(value); - } - return acc; - }, {}); - return message; - }, -}; - -function createBaseWfSpecVersionMigration_ThreadSpecMigrationsEntry(): WfSpecVersionMigration_ThreadSpecMigrationsEntry { - return { key: "", value: undefined }; -} - -export const WfSpecVersionMigration_ThreadSpecMigrationsEntry = { - encode( - message: WfSpecVersionMigration_ThreadSpecMigrationsEntry, - writer: _m0.Writer = _m0.Writer.create(), - ): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - ThreadSpecMigration.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WfSpecVersionMigration_ThreadSpecMigrationsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWfSpecVersionMigration_ThreadSpecMigrationsEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = ThreadSpecMigration.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WfSpecVersionMigration_ThreadSpecMigrationsEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? ThreadSpecMigration.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: WfSpecVersionMigration_ThreadSpecMigrationsEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = ThreadSpecMigration.toJSON(message.value); - } - return obj; - }, - - create, I>>( - base?: I, - ): WfSpecVersionMigration_ThreadSpecMigrationsEntry { - return WfSpecVersionMigration_ThreadSpecMigrationsEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): WfSpecVersionMigration_ThreadSpecMigrationsEntry { - const message = createBaseWfSpecVersionMigration_ThreadSpecMigrationsEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? ThreadSpecMigration.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseThreadSpecMigration(): ThreadSpecMigration { - return { newThreadSpecName: "", nodeMigrations: {} }; -} - -export const ThreadSpecMigration = { - encode(message: ThreadSpecMigration, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.newThreadSpecName !== "") { - writer.uint32(10).string(message.newThreadSpecName); - } - Object.entries(message.nodeMigrations).forEach(([key, value]) => { - ThreadSpecMigration_NodeMigrationsEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).ldelim(); - }); - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ThreadSpecMigration { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseThreadSpecMigration(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.newThreadSpecName = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - const entry2 = ThreadSpecMigration_NodeMigrationsEntry.decode(reader, reader.uint32()); - if (entry2.value !== undefined) { - message.nodeMigrations[entry2.key] = entry2.value; - } - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ThreadSpecMigration { - return { - newThreadSpecName: isSet(object.newThreadSpecName) ? globalThis.String(object.newThreadSpecName) : "", - nodeMigrations: isObject(object.nodeMigrations) - ? Object.entries(object.nodeMigrations).reduce<{ [key: string]: NodeMigration }>((acc, [key, value]) => { - acc[key] = NodeMigration.fromJSON(value); - return acc; - }, {}) - : {}, - }; - }, - - toJSON(message: ThreadSpecMigration): unknown { - const obj: any = {}; - if (message.newThreadSpecName !== "") { - obj.newThreadSpecName = message.newThreadSpecName; - } - if (message.nodeMigrations) { - const entries = Object.entries(message.nodeMigrations); - if (entries.length > 0) { - obj.nodeMigrations = {}; - entries.forEach(([k, v]) => { - obj.nodeMigrations[k] = NodeMigration.toJSON(v); - }); - } - } - return obj; - }, - - create, I>>(base?: I): ThreadSpecMigration { - return ThreadSpecMigration.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ThreadSpecMigration { - const message = createBaseThreadSpecMigration(); - message.newThreadSpecName = object.newThreadSpecName ?? ""; - message.nodeMigrations = Object.entries(object.nodeMigrations ?? {}).reduce<{ [key: string]: NodeMigration }>( - (acc, [key, value]) => { - if (value !== undefined) { - acc[key] = NodeMigration.fromPartial(value); - } - return acc; - }, - {}, - ); - return message; - }, -}; - -function createBaseThreadSpecMigration_NodeMigrationsEntry(): ThreadSpecMigration_NodeMigrationsEntry { - return { key: "", value: undefined }; -} - -export const ThreadSpecMigration_NodeMigrationsEntry = { - encode(message: ThreadSpecMigration_NodeMigrationsEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.key !== "") { - writer.uint32(10).string(message.key); - } - if (message.value !== undefined) { - NodeMigration.encode(message.value, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): ThreadSpecMigration_NodeMigrationsEntry { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseThreadSpecMigration_NodeMigrationsEntry(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.key = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.value = NodeMigration.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): ThreadSpecMigration_NodeMigrationsEntry { - return { - key: isSet(object.key) ? globalThis.String(object.key) : "", - value: isSet(object.value) ? NodeMigration.fromJSON(object.value) : undefined, - }; - }, - - toJSON(message: ThreadSpecMigration_NodeMigrationsEntry): unknown { - const obj: any = {}; - if (message.key !== "") { - obj.key = message.key; - } - if (message.value !== undefined) { - obj.value = NodeMigration.toJSON(message.value); - } - return obj; - }, - - create, I>>( - base?: I, - ): ThreadSpecMigration_NodeMigrationsEntry { - return ThreadSpecMigration_NodeMigrationsEntry.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>( - object: I, - ): ThreadSpecMigration_NodeMigrationsEntry { - const message = createBaseThreadSpecMigration_NodeMigrationsEntry(); - message.key = object.key ?? ""; - message.value = (object.value !== undefined && object.value !== null) - ? NodeMigration.fromPartial(object.value) - : undefined; - return message; - }, -}; - -function createBaseNodeMigration(): NodeMigration { - return { newNodeName: "" }; -} - -export const NodeMigration = { - encode(message: NodeMigration, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.newNodeName !== "") { - writer.uint32(10).string(message.newNodeName); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): NodeMigration { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseNodeMigration(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.newNodeName = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): NodeMigration { - return { newNodeName: isSet(object.newNodeName) ? globalThis.String(object.newNodeName) : "" }; - }, - - toJSON(message: NodeMigration): unknown { - const obj: any = {}; - if (message.newNodeName !== "") { - obj.newNodeName = message.newNodeName; - } - return obj; - }, - - create, I>>(base?: I): NodeMigration { - return NodeMigration.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): NodeMigration { - const message = createBaseNodeMigration(); - message.newNodeName = object.newNodeName ?? ""; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function longToNumber(long: Long): number { - if (long.gt(globalThis.Number.MAX_SAFE_INTEGER)) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - return long.toNumber(); -} - -if (_m0.util.Long !== Long) { - _m0.util.Long = Long as any; - _m0.configure(); -} - -function isObject(value: any): boolean { - return typeof value === "object" && value !== null; -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/littlehorse-public-api/workflow_event.ts b/dashboard/apps/web/littlehorse-public-api/workflow_event.ts deleted file mode 100644 index 6fbf1ea2f..000000000 --- a/dashboard/apps/web/littlehorse-public-api/workflow_event.ts +++ /dev/null @@ -1,246 +0,0 @@ -/* eslint-disable */ -import * as _m0 from "protobufjs/minimal"; -import { VariableType, variableTypeFromJSON, variableTypeToJSON, variableTypeToNumber } from "./common_enums"; -import { Timestamp } from "./google/protobuf/timestamp"; -import { WorkflowEventDefId, WorkflowEventId } from "./object_id"; -import { VariableValue } from "./variable"; - -export const protobufPackage = "littlehorse"; - -/** - * A WorkflowEvent represents a "Thing That Happened" *INSIDE* a WfRun. It is DIFFERENT from - * an ExternalEvent, because an ExternalEvent represents something that happened OUTSIDE the WfRun, - * and is used to send information to the WfRun. - * - * In contrast, a WorkflowEvent is thrown by the WfRun and is used to send information to the outside - * world. - */ -export interface WorkflowEvent { - /** The ID of the WorkflowEvent. Contains WfRunId and WorkflowEventDefId. */ - id: - | WorkflowEventId - | undefined; - /** The content of the WorkflowEvent. */ - content: - | VariableValue - | undefined; - /** The time that the WorkflowEvent was created. */ - createdAt: string | undefined; -} - -export interface WorkflowEventDef { - id: WorkflowEventDefId | undefined; - createdAt: string | undefined; - type: VariableType; -} - -function createBaseWorkflowEvent(): WorkflowEvent { - return { id: undefined, content: undefined, createdAt: undefined }; -} - -export const WorkflowEvent = { - encode(message: WorkflowEvent, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - WorkflowEventId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.content !== undefined) { - VariableValue.encode(message.content, writer.uint32(18).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WorkflowEvent { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWorkflowEvent(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = WorkflowEventId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.content = VariableValue.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WorkflowEvent { - return { - id: isSet(object.id) ? WorkflowEventId.fromJSON(object.id) : undefined, - content: isSet(object.content) ? VariableValue.fromJSON(object.content) : undefined, - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - }; - }, - - toJSON(message: WorkflowEvent): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = WorkflowEventId.toJSON(message.id); - } - if (message.content !== undefined) { - obj.content = VariableValue.toJSON(message.content); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - return obj; - }, - - create, I>>(base?: I): WorkflowEvent { - return WorkflowEvent.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WorkflowEvent { - const message = createBaseWorkflowEvent(); - message.id = (object.id !== undefined && object.id !== null) ? WorkflowEventId.fromPartial(object.id) : undefined; - message.content = (object.content !== undefined && object.content !== null) - ? VariableValue.fromPartial(object.content) - : undefined; - message.createdAt = object.createdAt ?? undefined; - return message; - }, -}; - -function createBaseWorkflowEventDef(): WorkflowEventDef { - return { id: undefined, createdAt: undefined, type: VariableType.JSON_OBJ }; -} - -export const WorkflowEventDef = { - encode(message: WorkflowEventDef, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== undefined) { - WorkflowEventDefId.encode(message.id, writer.uint32(10).fork()).ldelim(); - } - if (message.createdAt !== undefined) { - Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(18).fork()).ldelim(); - } - if (message.type !== VariableType.JSON_OBJ) { - writer.uint32(24).int32(variableTypeToNumber(message.type)); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): WorkflowEventDef { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseWorkflowEventDef(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.id = WorkflowEventDefId.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - - message.createdAt = fromTimestamp(Timestamp.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 24) { - break; - } - - message.type = variableTypeFromJSON(reader.int32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - - fromJSON(object: any): WorkflowEventDef { - return { - id: isSet(object.id) ? WorkflowEventDefId.fromJSON(object.id) : undefined, - createdAt: isSet(object.createdAt) ? globalThis.String(object.createdAt) : undefined, - type: isSet(object.type) ? variableTypeFromJSON(object.type) : VariableType.JSON_OBJ, - }; - }, - - toJSON(message: WorkflowEventDef): unknown { - const obj: any = {}; - if (message.id !== undefined) { - obj.id = WorkflowEventDefId.toJSON(message.id); - } - if (message.createdAt !== undefined) { - obj.createdAt = message.createdAt; - } - if (message.type !== VariableType.JSON_OBJ) { - obj.type = variableTypeToJSON(message.type); - } - return obj; - }, - - create, I>>(base?: I): WorkflowEventDef { - return WorkflowEventDef.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): WorkflowEventDef { - const message = createBaseWorkflowEventDef(); - message.id = (object.id !== undefined && object.id !== null) - ? WorkflowEventDefId.fromPartial(object.id) - : undefined; - message.createdAt = object.createdAt ?? undefined; - message.type = object.type ?? VariableType.JSON_OBJ; - return message; - }, -}; - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function toTimestamp(dateStr: string): Timestamp { - const date = new globalThis.Date(dateStr); - const seconds = Math.trunc(date.getTime() / 1_000); - const nanos = (date.getTime() % 1_000) * 1_000_000; - return { seconds, nanos }; -} - -function fromTimestamp(t: Timestamp): string { - let millis = (t.seconds || 0) * 1_000; - millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis).toISOString(); -} - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/dashboard/apps/web/middleware.ts b/dashboard/apps/web/middleware.ts deleted file mode 100644 index f981d0743..000000000 --- a/dashboard/apps/web/middleware.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { NextRequest } from 'next/server' -import { NextResponse } from 'next/server' -import type { TokenWithJWTInfo } from './pages/api/auth/[...nextauth]' -import { getToken } from 'next-auth/jwt' -import type { JWT } from 'next-auth/jwt' - -export async function middleware(req: NextRequest) { - if (process.env.LHD_OAUTH_ENABLED === 'true') { - - const token: JWT | null = await getToken({ req, secret: process.env.AUTH_SECRET }) - const { pathname } = req.nextUrl - const origin = req.nextUrl.origin - - const isPublicRoute = - pathname.includes('/api/auth') || - pathname.includes('/signin') || - pathname.includes('.png') || - pathname.includes('.svg') || - pathname.includes('/favicon.ico') || - pathname.includes('jpg') || - pathname.includes('_next') || - pathname.includes('/errors') - - if (isPublicRoute) { - return NextResponse.next() - } - - const tokenHasExpired = token && new Date() > new Date((token as unknown as TokenWithJWTInfo).expireTime * 1000) - if (tokenHasExpired && !pathname.includes('/signin')) { - const response = NextResponse.redirect(new URL('/signin', origin)) - return response - } - } - - return NextResponse.next() -} diff --git a/dashboard/apps/web/next-env.d.ts b/dashboard/apps/web/next-env.d.ts deleted file mode 100644 index fd36f9494..000000000 --- a/dashboard/apps/web/next-env.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/// -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/dashboard/apps/web/next.config.js b/dashboard/apps/web/next.config.js deleted file mode 100644 index 5b91c14a3..000000000 --- a/dashboard/apps/web/next.config.js +++ /dev/null @@ -1,12 +0,0 @@ -const webpack = require('webpack') -const { join } = require('path') - -module.exports = { - reactStrictMode: true, - transpilePackages: [ 'ui' ], - sassOptions: { - outputStyle: 'expanded', - }, - output: 'standalone', - outputFileTracingRoot: join(__dirname, '../../'), -} diff --git a/dashboard/apps/web/package.json b/dashboard/apps/web/package.json deleted file mode 100644 index cd046e7f0..000000000 --- a/dashboard/apps/web/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "web", - "version": "1.0.0", - "private": true, - "scripts": { - "dev": "next dev --port 3001", - "build": "next build", - "start": "next start --port 8080", - "lint": "next lint" - }, - "dependencies": { - "d3": "^7.8.5", - "lodash": "^4.17.21", - "material-icons": "^1.13.12", - "moment": "^2.29.4", - "next": "^13.5.5", - "next-auth": "^4.24.5", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-syntax-highlighter": "^15.5.0", - "sass": "^1.63.6", - "ui": "workspace:*", - "nice-grpc": "^2.1.5", - "protobufjs": "^7.2.5", - "long": "^5.2.3", - "nice-grpc-common": "^2.0.2", - "reactflow": "^11.9.3", - "@tisoap/react-flow-smart-edge": "^3.0.0", - "elkjs": "^0.8.2" - }, - "devDependencies": { - "@types/lodash": "^4.14.197", - "@types/node": "^17.0.12", - "@types/react": "^18.0.22", - "@types/react-dom": "^18.0.7", - "@types/react-syntax-highlighter": "^15.5.7", - "@types/jest": "^29.5.8", - "eslint-config-custom": "workspace:*", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-jsx-a11y": "^6.8.0", - "tsconfig": "workspace:*", - "typescript": "^4.5.3", - "jest": "29.7.0", - "ts-jest": "29.1.1", - "@faker-js/faker": "^8.2.0" - } -} diff --git a/dashboard/apps/web/pages/api/LHClient.ts b/dashboard/apps/web/pages/api/LHClient.ts deleted file mode 100644 index 5f095bf4c..000000000 --- a/dashboard/apps/web/pages/api/LHClient.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { Channel } from 'nice-grpc' -import { ChannelCredentials, createChannel, createClientFactory } from 'nice-grpc' -import type { Client } from 'nice-grpc/src/client/Client' -import { LittleHorseDefinition } from '../../littlehorse-public-api/service' -import { Metadata } from 'nice-grpc-common' -import * as fs from 'fs' - -export default class LHClient { - private static channel: Channel - // eslint-disable-next-line @typescript-eslint/no-empty-function -- needed for a singleton - private constructor() { - } - - public static getInstance(accessToken?: string): Client { - if (process.env.API_URL === undefined) { - throw new Error('Not able to get the API URL from your configuration.') - } - - if (process.env.LHD_OAUTH_ENABLED === 'true') { - this.createUniqueSecureChannel(process.env.API_URL) - - return createClientFactory().use((call, options) => - call.next(call.request, { - ...options, - metadata: Metadata(options.metadata).set( - 'Authorization', - `Bearer ${accessToken}`, - ), - })).create(LittleHorseDefinition, LHClient.channel) - } else { - this.createUniqueInsecureChannel(process.env.API_URL) - - return createClientFactory().use((call, options) => - call.next(call.request, { - ...options, - })).create(LittleHorseDefinition, LHClient.channel) - } - } - - private static createUniqueSecureChannel(apiUrl: string) { - const caCertificatePath: string | undefined = process.env.LHC_CA_CERT - const applicationHasProvidedCACertificate = caCertificatePath !== undefined - - if (LHClient.channel === undefined) { - if (applicationHasProvidedCACertificate) { - LHClient.channel = createChannel(apiUrl, - ChannelCredentials.createSsl(fs.readFileSync(caCertificatePath))) - } else { - LHClient.channel = createChannel(apiUrl, - ChannelCredentials.createSsl()) - } - } - } - - private static createUniqueInsecureChannel(apiUrl: string) { - if (LHClient.channel === undefined) { - LHClient.channel = createChannel(apiUrl) - } - } -} diff --git a/dashboard/apps/web/pages/api/auth/[...nextauth].ts b/dashboard/apps/web/pages/api/auth/[...nextauth].ts deleted file mode 100644 index 5a5d7189f..000000000 --- a/dashboard/apps/web/pages/api/auth/[...nextauth].ts +++ /dev/null @@ -1,89 +0,0 @@ -import type { Session } from 'next-auth' -import NextAuth from 'next-auth' -import type { JWT } from 'next-auth/jwt' -import KeycloakProvider from 'next-auth/providers/keycloak' - - -const providers:any = [] -if (process.env.KEYCLOAK_CLIENT_ID && - process.env.KEYCLOAK_CLIENT_ID !== '' && - process.env.KEYCLOAK_CLIENT_SECRET && - process.env.KEYCLOAK_CLIENT_SECRET !== '') { - providers.push( - KeycloakProvider({ - clientId: process.env.KEYCLOAK_CLIENT_ID , - clientSecret: process.env.KEYCLOAK_CLIENT_SECRET, - issuer: process.env.KEYCLOAK_ISSUER_URI - }) - ) -} - -async function logoutFromKeyCloack(jwt: JWT) { - const { id_token } = jwt - - try { - const params = new URLSearchParams() - params.append('id_token_hint', id_token as string) - await fetch(`${process.env.KEYCLOAK_ISSUER_URI}/protocol/openid-connect/logout?${params.toString()}`) - } catch (e: any) { - console.error('Unable to perform post-logout handshake', e) - } -} - - - -export const authOptions = { - pages:{ - signIn:'/signin' - }, - secret: process.env.AUTH_SECRET, - providers, - callbacks: { - jwt({ token, account }) { - if (process.env.LHD_OAUTH_ENABLED === 'true') { - if (account) { - token.accessToken = account.access_token - token.exp = account.expires_at - token.expireTime = account.expires_at - token.id_token = account.id_token - } - - const tokenHasExpired = new Date() > new Date(token.expireTime * 1000) - - if (tokenHasExpired) { - logoutFromKeyCloack(token) - } - } - - return token as TokenWithJWTInfo - }, - session({ session, token }) { - if (process.env.LHD_OAUTH_ENABLED === 'true') { - session.accessToken = token.accessToken - session.expireTime = token.expireTime - session.id_token = token.id_token - } - - return session as SessionWithJWTExpireTime - }, - }, - events: { - signOut: ({ token }) => { - logoutFromKeyCloack(token) - } - } -} - -export interface SessionWithJWTExpireTime extends Session { - expireTime: number, - accessToken: string, - id_token: string -} - -export interface TokenWithJWTInfo extends JWT { - expireTime: number, - accessToken: string, - id_token: string -} - -export default NextAuth(authOptions) diff --git a/dashboard/apps/web/pages/api/drawer/externalEvent.ts b/dashboard/apps/web/pages/api/drawer/externalEvent.ts deleted file mode 100644 index 68e47d8d3..000000000 --- a/dashboard/apps/web/pages/api/drawer/externalEvent.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' -import { ExternalEventId } from '../../../littlehorse-public-api/object_id' - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - if (req.method === 'POST') { - const httpRequestBody = JSON.parse(req.body) - const grpcRequestBody = { - wfRunId: httpRequestBody.wfRunId, - externalEventDefId: httpRequestBody.externalEventDefId, - guid: httpRequestBody.guid - } as ExternalEventId - - await handleGrpcCallWithNext('getExternalEvent', req, res, ExternalEventId.fromJSON(grpcRequestBody)) - } -} diff --git a/dashboard/apps/web/pages/api/drawer/nodeRun.ts b/dashboard/apps/web/pages/api/drawer/nodeRun.ts deleted file mode 100644 index 77acfbfa1..000000000 --- a/dashboard/apps/web/pages/api/drawer/nodeRun.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' -import { NodeRunId } from '../../../littlehorse-public-api/object_id' - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - if (req.method === 'POST') { - const body = JSON.parse(req.body) - const { wfRunId, threadRunNumber, name } = body - await handleGrpcCallWithNext('getNodeRun', req, res, NodeRunId.fromJSON( - { - wfRunId: { - id: wfRunId - }, - threadRunNumber: threadRunNumber, - position: Number(name) - } as NodeRunId)) - } -} diff --git a/dashboard/apps/web/pages/api/drawer/taskDef/[name]/index.ts b/dashboard/apps/web/pages/api/drawer/taskDef/[name]/index.ts deleted file mode 100644 index fa8292011..000000000 --- a/dashboard/apps/web/pages/api/drawer/taskDef/[name]/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../../../grpcMethodCallHandler' -import { TaskDefId } from '../../../../../littlehorse-public-api/object_id' - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - if (req.method === 'GET') { - await handleGrpcCallWithNext('getTaskDef', req, res, TaskDefId.fromJSON({ name: req.query.name })) - } -} diff --git a/dashboard/apps/web/pages/api/drawer/taskRun.ts b/dashboard/apps/web/pages/api/drawer/taskRun.ts deleted file mode 100644 index 9f66d9bd1..000000000 --- a/dashboard/apps/web/pages/api/drawer/taskRun.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' -import { TaskRunId } from '../../../littlehorse-public-api/object_id' - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - if (req.method === 'POST') { - const httpRequestBody = JSON.parse(req.body) - const grpcRequestBody = { - wfRunId: httpRequestBody.wfRunId, - taskGuid: httpRequestBody.taskGuid - } as TaskRunId - - await handleGrpcCallWithNext('getTaskRun', req, res, TaskRunId.fromJSON(grpcRequestBody)) - } -} diff --git a/dashboard/apps/web/pages/api/drawer/userTaskRun.ts b/dashboard/apps/web/pages/api/drawer/userTaskRun.ts deleted file mode 100644 index 739bd3336..000000000 --- a/dashboard/apps/web/pages/api/drawer/userTaskRun.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' -import { UserTaskRunId } from '../../../littlehorse-public-api/object_id' - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - if (req.method === 'POST') { - const { wfRunId, guid } = JSON.parse(req.body) - const grpcRequestBody = { - wfRunId: { - id: wfRunId - }, - userTaskGuid: guid - } as UserTaskRunId - - await handleGrpcCallWithNext('getUserTaskRun', req, res, UserTaskRunId.fromJSON(grpcRequestBody)) - } -} diff --git a/dashboard/apps/web/pages/api/drawer/variable.ts b/dashboard/apps/web/pages/api/drawer/variable.ts deleted file mode 100644 index 3084c38b4..000000000 --- a/dashboard/apps/web/pages/api/drawer/variable.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' -import { VariableId } from '../../../littlehorse-public-api/object_id' - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - if (req.method === 'POST') { - const httpRequestBody = JSON.parse(req.body) - const grpcRequestBody = { - wfRunId: { - id: httpRequestBody.wfRunId, - }, - threadRunNumber: httpRequestBody.threadRunNumber, - name: httpRequestBody.name - } as VariableId - await handleGrpcCallWithNext('getVariable', req, res, VariableId.fromJSON(grpcRequestBody)) - } -} diff --git a/dashboard/apps/web/pages/api/drawer/wfRun/[id]/index.ts b/dashboard/apps/web/pages/api/drawer/wfRun/[id]/index.ts deleted file mode 100644 index e955d20a9..000000000 --- a/dashboard/apps/web/pages/api/drawer/wfRun/[id]/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { ListNodeRunsRequest } from '../../../../../littlehorse-public-api/service' -import { handleGrpcCallWithNext } from '../../../grpcMethodCallHandler' - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - if (req.method === 'GET') { - await handleGrpcCallWithNext('listNodeRuns', req, res, ListNodeRunsRequest.fromJSON({ - wfRunId: { - id: req.query.id - } - })) - } -} diff --git a/dashboard/apps/web/pages/api/drawer/wfSpec/[name]/index.ts b/dashboard/apps/web/pages/api/drawer/wfSpec/[name]/index.ts deleted file mode 100644 index 459fd0d84..000000000 --- a/dashboard/apps/web/pages/api/drawer/wfSpec/[name]/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../../../grpcMethodCallHandler' -import { GetLatestWfSpecRequest } from '../../../../../littlehorse-public-api/service' - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - if (req.method === 'GET') { - await handleGrpcCallWithNext('getLatestWfSpec', req, res, GetLatestWfSpecRequest.fromJSON({ name: req.query.name })) - } -} diff --git a/dashboard/apps/web/pages/api/grpcMethodCallHandler.ts b/dashboard/apps/web/pages/api/grpcMethodCallHandler.ts deleted file mode 100644 index d1c29e8f1..000000000 --- a/dashboard/apps/web/pages/api/grpcMethodCallHandler.ts +++ /dev/null @@ -1,65 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { getServerSession } from 'next-auth/next' -import { authOptions } from './auth/[...nextauth]' -import type { Client } from 'nice-grpc/src/client/Client' -import type { LittleHorseDefinition } from '../../littlehorse-public-api/service' -import LHClient from './LHClient' -import { Status } from 'nice-grpc-common' -import { constants } from 'http2' - -const unauthorizedResponseContent = { - status: constants.HTTP_STATUS_UNAUTHORIZED, - message: 'You need to be authenticated to access this resource.' -} -export const makeGrpcCall = async (grpcMethodToCall: string, - req: NextApiRequest, res: NextApiResponse, grpcRequestBody: object): Promise => { - const session = await getServerSession(req, res, authOptions) - - if ( process.env.LHD_OAUTH_ENABLED === 'true' && !session) { - res.status(401) - .json(unauthorizedResponseContent) - } else { - const client: Client = LHClient.getInstance(session?.accessToken) - - try { - return await client[grpcMethodToCall](grpcRequestBody) - } catch (error) { - console.error('grpcMethodCallHandler - Error during GRPC call:', error) - _handleError(error, res) - } - } - -} -export const handleGrpcCallWithNext = async (grpcMethodToCall: string, - req: NextApiRequest, res: NextApiResponse, grpcRequestBody: object) => { - - const session = await getServerSession(req, res, authOptions) - - if (process.env.LHD_OAUTH_ENABLED === 'true' && !session) { - res.status(401) - .json(unauthorizedResponseContent) - } else { - const client: Client = LHClient.getInstance(session?.accessToken) - - try { - const response: any = await client[grpcMethodToCall](grpcRequestBody) - res.send(response) - } catch (error) { - console.error('grpcMethodCallHandler - Error during GRPC call:', error) - _handleError(error, res) - } - } -} - -function _handleError(error, res: NextApiResponse) { - if (error.code === Status.PERMISSION_DENIED || error.code === Status.UNAUTHENTICATED) { - res.status(constants.HTTP_STATUS_UNAUTHORIZED) - .json(unauthorizedResponseContent) - } else { - res.status(constants.HTTP_STATUS_INTERNAL_SERVER_ERROR) - .json({ - status: constants.HTTP_STATUS_INTERNAL_SERVER_ERROR, - message: `There was an error while processing your request. ${error.details}` - }) - } -} diff --git a/dashboard/apps/web/pages/api/information/taskDef.ts b/dashboard/apps/web/pages/api/information/taskDef.ts deleted file mode 100644 index 184359b52..000000000 --- a/dashboard/apps/web/pages/api/information/taskDef.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' -import { TaskDefId } from '../../../littlehorse-public-api/object_id' - - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - const body = JSON.parse(req.body) - const { id } = body - - await handleGrpcCallWithNext('getTaskDef', req, res, TaskDefId.fromJSON({ - name: id - } as TaskDefId)) - } -} diff --git a/dashboard/apps/web/pages/api/information/userTaskDef.ts b/dashboard/apps/web/pages/api/information/userTaskDef.ts deleted file mode 100644 index fcce23f8d..000000000 --- a/dashboard/apps/web/pages/api/information/userTaskDef.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' -import { UserTaskDefId } from '../../../littlehorse-public-api/object_id' - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - if (req.method === 'POST') { - const body = JSON.parse(req.body) - const { id, version } = body - - await handleGrpcCallWithNext('getUserTaskDef', req, res, UserTaskDefId.fromJSON({ - name: id, - version: version - })) - } -} diff --git a/dashboard/apps/web/pages/api/loops/taskRun.ts b/dashboard/apps/web/pages/api/loops/taskRun.ts deleted file mode 100644 index 90504636e..000000000 --- a/dashboard/apps/web/pages/api/loops/taskRun.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { SearchTaskRunRequest } from '../../../littlehorse-public-api/service' -import { makeGrpcCall } from '../grpcMethodCallHandler' - -export default async function handler(req:NextApiRequest, res:NextApiResponse) { - if (req.method === 'POST') { - // const session = await getServerSession(req, res, authOptions) - - // if (session) { - // - TASK_SCHEDULED - // - TASK_RUNNING - // - TASK_SUCCESS - // - TASK_FAILED - // - TASK_TIMEOUT - // - TASK_OUTPUT_SERIALIZING_ERROR - // - TASK_INPUT_VAR_SUB_ERROR" - const body = JSON.parse(req.body) - const { taskDefName, wfRunId } = body - let out = [] - - const scheduledTasks = await makeGrpcCall('searchTaskRun', - req, - res, - SearchTaskRunRequest.fromJSON({ - status: 'TASK_SCHEDULED', - taskDefName, - limit: 99 - })) - - out = out.concat(scheduledTasks.results.filter(r => r.wfRunId === wfRunId) ) - - const runningTasks = await makeGrpcCall('searchTaskRun', - req, - res, - SearchTaskRunRequest.fromJSON({ - status: 'TASK_RUNNING', - taskDefName, - limit: 99 - })) - out = out.concat(runningTasks.results.filter(r => r.wfRunId === wfRunId) ) - - const successfulTasks = await makeGrpcCall('searchTaskRun', - req, - res, - SearchTaskRunRequest.fromJSON({ - status: 'TASK_SUCCESS', - taskDefName, - limit: 99 - })) - out = out.concat(successfulTasks.results.filter(r => r.wfRunId === wfRunId) ) - - - res.send(out) - } -} diff --git a/dashboard/apps/web/pages/api/metrics/taskDef.ts b/dashboard/apps/web/pages/api/metrics/taskDef.ts deleted file mode 100644 index e03bf1339..000000000 --- a/dashboard/apps/web/pages/api/metrics/taskDef.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { ListTaskMetricsRequest } from '../../../littlehorse-public-api/service' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - const httpRequestBody = (JSON.parse(req.body)) - const grpcRequestBody = { - lastWindowStart: httpRequestBody.lastWindowStart, - numWindows: httpRequestBody.numWindows, - taskDefId: { - name: httpRequestBody.taskDefName - }, - windowLength: httpRequestBody.windowLength - } as ListTaskMetricsRequest - await handleGrpcCallWithNext('listTaskDefMetrics', req, res, ListTaskMetricsRequest.fromJSON(grpcRequestBody)) - } -} diff --git a/dashboard/apps/web/pages/api/metrics/wfSpec.ts b/dashboard/apps/web/pages/api/metrics/wfSpec.ts deleted file mode 100644 index ab79e1488..000000000 --- a/dashboard/apps/web/pages/api/metrics/wfSpec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { ListWfMetricsRequest } from '../../../littlehorse-public-api/service' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - const httpRequestBody = JSON.parse(req.body) - - const grpcRequestBody = { - wfSpecId: { - name: httpRequestBody.wfSpecName, - majorVersion: httpRequestBody.majorVersion, - revision: httpRequestBody.revision - }, - lastWindowStart: httpRequestBody.lastWindowStart, - windowLength: httpRequestBody.windowLength, - numWindows: httpRequestBody.numWindows - } as ListWfMetricsRequest - await handleGrpcCallWithNext('listWfSpecMetrics', req, res, ListWfMetricsRequest.fromJSON(grpcRequestBody)) - } -} diff --git a/dashboard/apps/web/pages/api/search/externalEventDef.ts b/dashboard/apps/web/pages/api/search/externalEventDef.ts deleted file mode 100644 index 7f64372a8..000000000 --- a/dashboard/apps/web/pages/api/search/externalEventDef.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { SearchExternalEventDefRequest } from '../../../littlehorse-public-api/service' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' - -export default async function handler(req:NextApiRequest, res:NextApiResponse) { - if (req.method === 'POST') { - await handleGrpcCallWithNext('searchExternalEventDef', req, res, SearchExternalEventDefRequest.fromJSON(JSON.parse(req.body))) - } -} diff --git a/dashboard/apps/web/pages/api/search/nodeRun/[number]/[position].ts b/dashboard/apps/web/pages/api/search/nodeRun/[number]/[position].ts deleted file mode 100644 index 9d260109f..000000000 --- a/dashboard/apps/web/pages/api/search/nodeRun/[number]/[position].ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../../../grpcMethodCallHandler' -import { NodeRunId } from '../../../../../littlehorse-public-api/object_id' - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - const { - id - } = JSON.parse(req.body) - - const { - number, - position - } = req.query - - await handleGrpcCallWithNext('getNodeRun', req, res, NodeRunId.fromJSON({ - wfRunId: { - id - }, - threadRunNumber: Number(number), - position: Number(position) - } as NodeRunId)) - } -} diff --git a/dashboard/apps/web/pages/api/search/taskDef.ts b/dashboard/apps/web/pages/api/search/taskDef.ts deleted file mode 100644 index 1e3d44be0..000000000 --- a/dashboard/apps/web/pages/api/search/taskDef.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { SearchTaskDefRequest } from '../../../littlehorse-public-api/service' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - await handleGrpcCallWithNext('searchTaskDef', req, res, SearchTaskDefRequest.fromJSON(JSON.parse(req.body))) - } -} diff --git a/dashboard/apps/web/pages/api/search/taskRun.ts b/dashboard/apps/web/pages/api/search/taskRun.ts deleted file mode 100644 index 7ac350632..000000000 --- a/dashboard/apps/web/pages/api/search/taskRun.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { SearchTaskRunRequest } from '../../../littlehorse-public-api/service' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - await handleGrpcCallWithNext('searchTaskRun', req, res, SearchTaskRunRequest.fromJSON(JSON.parse(req.body))) - } -} diff --git a/dashboard/apps/web/pages/api/search/userTaskDef.ts b/dashboard/apps/web/pages/api/search/userTaskDef.ts deleted file mode 100644 index d5f086d1d..000000000 --- a/dashboard/apps/web/pages/api/search/userTaskDef.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { SearchUserTaskDefRequest } from '../../../littlehorse-public-api/service' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - await handleGrpcCallWithNext('searchUserTaskDef', req, res, SearchUserTaskDefRequest.fromJSON(JSON.parse(req.body))) - } -} diff --git a/dashboard/apps/web/pages/api/search/userTaskRun.ts b/dashboard/apps/web/pages/api/search/userTaskRun.ts deleted file mode 100644 index 4255cb2cc..000000000 --- a/dashboard/apps/web/pages/api/search/userTaskRun.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' -import { SearchUserTaskRunRequest } from '../../../littlehorse-public-api/service' - - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - if (req.method === 'POST') { - await handleGrpcCallWithNext('searchUserTaskRun', req, res, SearchUserTaskRunRequest.fromJSON(JSON.parse(req.body))) - } -} diff --git a/dashboard/apps/web/pages/api/search/wfRun.ts b/dashboard/apps/web/pages/api/search/wfRun.ts deleted file mode 100644 index 661e4b8e3..000000000 --- a/dashboard/apps/web/pages/api/search/wfRun.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' -import { SearchWfRunRequest } from '../../../littlehorse-public-api/service' - -export default async function handler(req:NextApiRequest, res:NextApiResponse) { - if (req.method === 'POST'){ - await handleGrpcCallWithNext('searchWfRun', req, res, SearchWfRunRequest.fromJSON(JSON.parse(req.body))) - } -} diff --git a/dashboard/apps/web/pages/api/search/wfSpec.ts b/dashboard/apps/web/pages/api/search/wfSpec.ts deleted file mode 100644 index 226f4f2e5..000000000 --- a/dashboard/apps/web/pages/api/search/wfSpec.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { makeGrpcCall } from '../grpcMethodCallHandler' -import type { WfSpecIdList } from '../../../littlehorse-public-api/service' -import { SearchWfSpecRequest } from '../../../littlehorse-public-api/service' -import type { WfSpecId } from '../../../littlehorse-public-api/object_id' - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - const response = await makeGrpcCall('searchWfSpec', req, res, SearchWfSpecRequest.fromJSON(JSON.parse(req.body))) - - const resultsWithFormattedVersion = response.results.map((result: WfSpecId) => ({ - ...result, version: `${result.majorVersion}.${result.revision}` - })) - - res.json({ ...response, results: resultsWithFormattedVersion } as WfSpecIdList) - } -} diff --git a/dashboard/apps/web/pages/api/visualization/wfRun.ts b/dashboard/apps/web/pages/api/visualization/wfRun.ts deleted file mode 100644 index e95610e7b..000000000 --- a/dashboard/apps/web/pages/api/visualization/wfRun.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - - if (req.method === 'POST'){ - - const parsedRequestBody = JSON.parse(req.body) - const grpcRequestBody = { - id: parsedRequestBody.wfRunId - } - - await handleGrpcCallWithNext('getWfRun', req, res, grpcRequestBody) - } -} diff --git a/dashboard/apps/web/pages/api/visualization/wfSpec.ts b/dashboard/apps/web/pages/api/visualization/wfSpec.ts deleted file mode 100644 index 7b6abc5f1..000000000 --- a/dashboard/apps/web/pages/api/visualization/wfSpec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { handleGrpcCallWithNext } from '../grpcMethodCallHandler' -import type { WfSpecId } from '../../../littlehorse-public-api/object_id' - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - const parsedRequestBody = JSON.parse(req.body) - const grpcRequestBody = { - name: parsedRequestBody.id, - majorVersion: parsedRequestBody.majorVersion, - revision: parsedRequestBody.revision - } as WfSpecId - - await handleGrpcCallWithNext('getWfSpec', req, res, grpcRequestBody) - } -} diff --git a/dashboard/apps/web/pages/api/visualization/workflowLayoutedGraph.ts b/dashboard/apps/web/pages/api/visualization/workflowLayoutedGraph.ts deleted file mode 100644 index 883a93292..000000000 --- a/dashboard/apps/web/pages/api/visualization/workflowLayoutedGraph.ts +++ /dev/null @@ -1,69 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import ElkConstructor from 'elkjs/lib/elk.bundled.js' -import type { Client } from 'nice-grpc/src/client/Client' -import type { LittleHorseDefinition } from '../../../littlehorse-public-api/service' -import type { ReactFlowGraph } from '../../../app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter' -import GraphLayouter from '../../../app/wfspec/[id]/[version]/components/visualizer/mappers/GraphLayouter' -import EdgeLabelExtractor from '../../../app/wfspec/[id]/[version]/components/visualizer/extractors/EdgeLabelExtractor' -import type { WfSpec } from '../../../littlehorse-public-api/wf_spec' -import LHClient from '../LHClient' -import { getServerSession } from 'next-auth/next' -import type { SessionWithJWTExpireTime } from '../auth/[...nextauth]' -import { authOptions } from '../auth/[...nextauth]' -import { makeGrpcCall } from '../grpcMethodCallHandler' -import { WfSpecId } from '../../../littlehorse-public-api/object_id' -import { constants } from 'http2' - -const unauthorizedResponseContent = { - status: constants.HTTP_STATUS_UNAUTHORIZED, - message: 'You need to be authenticated to access this resource.' -} - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - - if (req.method === 'POST') { - let session: SessionWithJWTExpireTime | null - let client: Client - - if (process.env.LHD_OAUTH_ENABLED === 'true') { - session = await getServerSession(req, res, authOptions) - if (!session) { - res.status(constants.HTTP_STATUS_UNAUTHORIZED) - .json(unauthorizedResponseContent) - return - } - client = LHClient.getInstance(session.accessToken) - } else { - client = LHClient.getInstance() - } - - const parsedRequestBody = JSON.parse(req.body) - - const wfSpec: WfSpec = await makeGrpcCall('getWfSpec', req, res, WfSpecId.fromJSON({ - name: parsedRequestBody.wfSpecName, - majorVersion: parsedRequestBody.majorVersion, - revision: parsedRequestBody.revision - })) - - const elkInstance = new ElkConstructor() - let layoutedGraph: ReactFlowGraph - - if (parsedRequestBody.isWfSpecVisualization) { - layoutedGraph = await new GraphLayouter( - elkInstance, - EdgeLabelExtractor.extract).getLayoutedGraph(wfSpec, parsedRequestBody.wfSpecName, parsedRequestBody.threadSpec) - } else { - layoutedGraph = await new GraphLayouter( - elkInstance, - EdgeLabelExtractor.extract, - client).getLayoutedGraphForWfRun(wfSpec, - parsedRequestBody.wfSpecName, - parsedRequestBody.wfRunId, - parsedRequestBody.threadRunNumber, - parsedRequestBody.threadSpec - ) - } - - res.send(layoutedGraph) - } -} diff --git a/dashboard/apps/web/providers/index.tsx b/dashboard/apps/web/providers/index.tsx deleted file mode 100644 index 6cab13163..000000000 --- a/dashboard/apps/web/providers/index.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { SessionProvider } from '../components/SessionProvider' -import FeatureToggleProvider from '../contexts/FeatureToggleContext' -import React from 'react' -import { CheckSession } from '../components/CheckSession' - -interface CheckSessionProps { - children?: React.ReactNode; -} -export function Providers({ children }: CheckSessionProps) { - const toggles = { - isAuthenticationEnabled: process.env.LHD_OAUTH_ENABLED, - } - - return ( - - - - {children} - - - - ) -} diff --git a/dashboard/apps/web/public/ENTRYPOINT.svg b/dashboard/apps/web/public/ENTRYPOINT.svg deleted file mode 100644 index 07ba77808..000000000 --- a/dashboard/apps/web/public/ENTRYPOINT.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/EXCEPTION.svg b/dashboard/apps/web/public/EXCEPTION.svg deleted file mode 100644 index cdab91b1c..000000000 --- a/dashboard/apps/web/public/EXCEPTION.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/EXIT.svg b/dashboard/apps/web/public/EXIT.svg deleted file mode 100644 index e919a67c6..000000000 --- a/dashboard/apps/web/public/EXIT.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/EXTERNAL_EVENT.svg b/dashboard/apps/web/public/EXTERNAL_EVENT.svg deleted file mode 100644 index b7f35739f..000000000 --- a/dashboard/apps/web/public/EXTERNAL_EVENT.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/LH Logo.svg b/dashboard/apps/web/public/LH Logo.svg deleted file mode 100644 index 0f65990ae..000000000 --- a/dashboard/apps/web/public/LH Logo.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard/apps/web/public/NOP.svg b/dashboard/apps/web/public/NOP.svg deleted file mode 100644 index ff265eeae..000000000 --- a/dashboard/apps/web/public/NOP.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/SLEEP.svg b/dashboard/apps/web/public/SLEEP.svg deleted file mode 100644 index 88ed645c2..000000000 --- a/dashboard/apps/web/public/SLEEP.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/SLEEP2.svg b/dashboard/apps/web/public/SLEEP2.svg deleted file mode 100644 index 12bcfaec6..000000000 --- a/dashboard/apps/web/public/SLEEP2.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/START_THREAD.svg b/dashboard/apps/web/public/START_THREAD.svg deleted file mode 100644 index eea5d7784..000000000 --- a/dashboard/apps/web/public/START_THREAD.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/Spinner.svg b/dashboard/apps/web/public/Spinner.svg deleted file mode 100644 index 13ab0c94b..000000000 --- a/dashboard/apps/web/public/Spinner.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dashboard/apps/web/public/TASK.svg b/dashboard/apps/web/public/TASK.svg deleted file mode 100644 index bb76c1b0e..000000000 --- a/dashboard/apps/web/public/TASK.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/TASKICON.svg b/dashboard/apps/web/public/TASKICON.svg deleted file mode 100644 index fbf2d3fc9..000000000 --- a/dashboard/apps/web/public/TASKICON.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/USER_TASK.svg b/dashboard/apps/web/public/USER_TASK.svg deleted file mode 100644 index b0cbb7183..000000000 --- a/dashboard/apps/web/public/USER_TASK.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/WAIT_FOR_THREAD.svg b/dashboard/apps/web/public/WAIT_FOR_THREAD.svg deleted file mode 100644 index 12bcfaec6..000000000 --- a/dashboard/apps/web/public/WAIT_FOR_THREAD.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/WAIT_FOR_THREADS.svg b/dashboard/apps/web/public/WAIT_FOR_THREADS.svg deleted file mode 100644 index 12bcfaec6..000000000 --- a/dashboard/apps/web/public/WAIT_FOR_THREADS.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/add.svg b/dashboard/apps/web/public/add.svg deleted file mode 100644 index b7c4618f7..000000000 --- a/dashboard/apps/web/public/add.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/public/chevron_right.svg b/dashboard/apps/web/public/chevron_right.svg deleted file mode 100644 index 42f0ba949..000000000 --- a/dashboard/apps/web/public/chevron_right.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/public/distance.svg b/dashboard/apps/web/public/distance.svg deleted file mode 100644 index 2cf4ff6f3..000000000 --- a/dashboard/apps/web/public/distance.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/expand_more.svg b/dashboard/apps/web/public/expand_more.svg deleted file mode 100644 index 49bb94560..000000000 --- a/dashboard/apps/web/public/expand_more.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/public/key.svg b/dashboard/apps/web/public/key.svg deleted file mode 100644 index b71214e4f..000000000 --- a/dashboard/apps/web/public/key.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/public/link.svg b/dashboard/apps/web/public/link.svg deleted file mode 100644 index 70e9f8362..000000000 --- a/dashboard/apps/web/public/link.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/public/littlehorse.svg b/dashboard/apps/web/public/littlehorse.svg deleted file mode 100644 index 48a0217e0..000000000 --- a/dashboard/apps/web/public/littlehorse.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dashboard/apps/web/public/logo-lh.svg b/dashboard/apps/web/public/logo-lh.svg deleted file mode 100644 index 0241160d8..000000000 --- a/dashboard/apps/web/public/logo-lh.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/dashboard/apps/web/public/loop.svg b/dashboard/apps/web/public/loop.svg deleted file mode 100644 index fec4507cb..000000000 --- a/dashboard/apps/web/public/loop.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/public/polyline.svg b/dashboard/apps/web/public/polyline.svg deleted file mode 100644 index 040c9c407..000000000 --- a/dashboard/apps/web/public/polyline.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/public/replay.svg b/dashboard/apps/web/public/replay.svg deleted file mode 100644 index 7555a7256..000000000 --- a/dashboard/apps/web/public/replay.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/public/search.svg b/dashboard/apps/web/public/search.svg deleted file mode 100644 index e94d6fdf9..000000000 --- a/dashboard/apps/web/public/search.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dashboard/apps/web/tsconfig.json b/dashboard/apps/web/tsconfig.json deleted file mode 100644 index f1e48d9eb..000000000 --- a/dashboard/apps/web/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "tsconfig/nextjs.json", - "compilerOptions": { - "plugins": [ - { - "name": "next" - } - ], - "strictNullChecks": true - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - "build/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/dashboard/jest.config.js b/dashboard/jest.config.js deleted file mode 100644 index 2c2f03506..000000000 --- a/dashboard/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node' -} diff --git a/dashboard/jest.config.ts b/dashboard/jest.config.ts new file mode 100644 index 000000000..0ab38a377 --- /dev/null +++ b/dashboard/jest.config.ts @@ -0,0 +1,18 @@ +import type { Config } from 'jest' +import nextJest from 'next/jest.js' + +const createJestConfig = nextJest({ + // Provide the path to your Next.js app to load next.config.js and .env files in your test environment + dir: './', +}) + +// Add any custom config to be passed to Jest +const config: Config = { + coverageProvider: 'v8', + testEnvironment: 'jsdom', + // Add more setup options before each test is run + // setupFilesAfterEnv: ['/jest.setup.ts'], +} + +// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async +export default createJestConfig(config) diff --git a/dashboard/jest.setup.js b/dashboard/jest.setup.js new file mode 100644 index 000000000..d5dc35681 --- /dev/null +++ b/dashboard/jest.setup.js @@ -0,0 +1,2 @@ +// Learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom' diff --git a/dashboard/meta.json b/dashboard/meta.json deleted file mode 100644 index eff0c70a3..000000000 --- a/dashboard/meta.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "Next.js", - "description": "Minimal Turborepo example for learning the fundamentals.", - "template": "https://vercel.com/templates/next.js/turborepo-next-basic", - "featured": true, - "boost": true -} diff --git a/dashboard/next.config.mjs b/dashboard/next.config.mjs new file mode 100644 index 000000000..6ef810ce7 --- /dev/null +++ b/dashboard/next.config.mjs @@ -0,0 +1,30 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + output: 'standalone', + webpack: config => { + // Grab the existing rule that handles SVG imports + const fileLoaderRule = config.module.rules.find(rule => rule.test?.test?.('.svg')) + + config.module.rules.push( + // Reapply the existing rule, but only for svg imports ending in ?url + { + ...fileLoaderRule, + test: /\.svg$/i, + resourceQuery: /url/, // *.svg?url + }, + // Convert all other *.svg imports to React components + { + test: /\.svg$/i, + issuer: fileLoaderRule.issuer, + resourceQuery: { not: [...fileLoaderRule.resourceQuery.not, /url/] }, // exclude if *.svg?url + use: ['@svgr/webpack'], + } + ) + + // Modify the file loader rule to ignore *.svg, since we have it handled now. + fileLoaderRule.exclude = /\.svg$/i + return config + }, +} + +export default nextConfig diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json new file mode 100644 index 000000000..65dd98a6d --- /dev/null +++ b/dashboard/package-lock.json @@ -0,0 +1,11907 @@ +{ + "name": "dashboard", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dashboard", + "version": "0.1.0", + "hasInstallScript": true, + "dependencies": { + "@headlessui/react": "^1.7.18", + "@heroicons/react": "^2.1.1", + "@tanstack/react-query": "^5.28.6", + "dagre": "^0.8.5", + "littlehorse-client": "file://../sdk-js", + "next": "^14.2.1", + "next-auth": "^4.24.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "reactflow": "^11.11.1" + }, + "devDependencies": { + "@svgr/webpack": "^8.1.0", + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/react": "^15.0.0", + "@types/dagre": "^0.7.52", + "@types/jest": "^29.5.12", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "eslint": "^8", + "eslint-config-next": "^14.2.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "nice-grpc-common": "^2.0.2", + "postcss": "^8", + "prettier": "^3.2.5", + "prettier-plugin-tailwindcss": "^0.5.12", + "tailwindcss": "^3.3.0", + "ts-node": "^10.9.2", + "typescript": "^5" + } + }, + "../sdk-js": { + "name": "littlehorse-client", + "version": "0.0.0-development", + "dependencies": { + "nice-grpc": "^2.1.7" + }, + "devDependencies": { + "@tsconfig/node12": "^12.1.1", + "@types/jest": "^29.5.12", + "@types/node": "^20.11.20", + "eslint": "^8.56.0", + "jest": "^29.7.0", + "lint-staged": "^15.2.2", + "prettier": "^3.2.5", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.2", + "ts-proto": "^1.167.8", + "typescript": "^5.3.3" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "dev": true + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@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", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@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", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "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/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "dev": true, + "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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "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-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", + "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", + "@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-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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-transform-for-of": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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-function-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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-transform-member-expression-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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-transform-numeric-separator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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-transform-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@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-transform-property-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", + "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dev": true, + "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-pure-annotations": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", + "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@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.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz", + "integrity": "sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-typescript": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", + "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@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-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.1", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", + "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-syntax-jsx": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-typescript": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "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.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "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/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@headlessui/react": { + "version": "1.7.18", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.18.tgz", + "integrity": "sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==", + "dependencies": { + "@tanstack/react-virtual": "^3.0.0-beta.60", + "client-only": "^0.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/@heroicons/react": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.1.tgz", + "integrity": "sha512-JyyN9Lo66kirbCMuMMRPtJxtKJoIsXKS569ebHGGRKbl8s4CtUfLnyKJxteA+vIKySocO4s1SkTkGS4xtG/yEA==", + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.1.tgz", + "integrity": "sha512-qsHJle3GU3CmVx7pUoXcghX4sRN+vINkbLdH611T8ZlsP//grzqVW87BSUgOZeSAD4q7ZdZicdwNe/20U2janA==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.1.tgz", + "integrity": "sha512-Fp+mthEBjkn8r9qd6o4JgxKp0IDEzW0VYHD8ZC05xS5/lFNwHKuOdr2kVhWG7BQCO9L6eeepshM1Wbs2T+LgSg==", + "dev": true, + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.1.tgz", + "integrity": "sha512-kGjnjcIJehEcd3rT/3NAATJQndAEELk0J9GmGMXHSC75TMnvpOhONcjNHbjtcWE5HUQnIHy5JVkatrnYm1QhVw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.1.tgz", + "integrity": "sha512-dAdWndgdQi7BK2WSXrx4lae7mYcOYjbHJUhvOUnJjMNYrmYhxbbvJ2xElZpxNxdfA6zkqagIB9He2tQk+l16ew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.1.tgz", + "integrity": "sha512-2ZctfnyFOGvTkoD6L+DtQtO3BfFz4CapoHnyLTXkOxbZkVRgg3TQBUjTD/xKrO1QWeydeo8AWfZRg8539qNKrg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.1.tgz", + "integrity": "sha512-jazZXctiaanemy4r+TPIpFP36t1mMwWCKMsmrTRVChRqE6putyAxZA4PDujx0SnfvZHosjdkx9xIq9BzBB5tWg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.1.tgz", + "integrity": "sha512-VjCHWCjsAzQAAo8lkBOLEIkBZFdfW+Z18qcQ056kL4KpUYc8o59JhLDCBlhg+hINQRgzQ2UPGma2AURGOH0+Qg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.1.tgz", + "integrity": "sha512-7HZKYKvAp4nAHiHIbY04finRqjeYvkITOGOurP1aLMexIFG/1+oCnqhGogBdc4lao/lkMW1c+AkwWSzSlLasqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.1.tgz", + "integrity": "sha512-YGHklaJ/Cj/F0Xd8jxgj2p8po4JTCi6H7Z3Yics3xJhm9CPIqtl8erlpK1CLv+HInDqEWfXilqatF8YsLxxA2Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.1.tgz", + "integrity": "sha512-o+ISKOlvU/L43ZhtAAfCjwIfcwuZstiHVXq/BDsZwGqQE0h/81td95MPHliWCnFoikzWcYqh+hz54ZB2FIT8RA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.1.tgz", + "integrity": "sha512-GmRoTiLcvCLifujlisknv4zu9/C4i9r0ktsA8E51EMqJL4bD4CpO7lDYr7SrUxCR0tS4RVcrqKmCak24T0ohaw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@panva/hkdf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", + "integrity": "sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@reactflow/background": { + "version": "11.3.11", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.11.tgz", + "integrity": "sha512-27ahQyHuX2YTc1lABvAPpd5JWBH5P3qTHLGOO+Qfqq4mbicwQ0UGQ2bVDWDwoHOyep2EuMuphrLttaMr0hiviw==", + "dependencies": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/controls": { + "version": "11.2.11", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.11.tgz", + "integrity": "sha512-FyqQv5pWEc2ycEGgIaLPmD5ezW3chsNwqMCjBMETxRj45R4uy6j+gDNi5EgURCan7T12uvoFeQopSZ96JL8XDQ==", + "dependencies": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/core": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.1.tgz", + "integrity": "sha512-O9f/q9SZ+29am/XdoZgm/LTdkgQdypcVj9a1yZZgcS6rVDkij1yIiOT3nkGxwnNkJz0rwCn2xtL5SkK038AQ7w==", + "dependencies": { + "@types/d3": "^7.4.0", + "@types/d3-drag": "^3.0.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/minimap": { + "version": "11.7.11", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.11.tgz", + "integrity": "sha512-zXxv+IExvWuaZ+gmRIfmU09A+slG9rMKTVfjqd+ewFV4LFcCyMNMIx3gZybdLZtgUDKIOoU/hAWIY+FbU7GTKw==", + "dependencies": { + "@reactflow/core": "11.11.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-resizer": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.11.tgz", + "integrity": "sha512-g/5iLo5vPBoFozU+2WXub+mbpNkQhR+PRX9o0YvH/lYs1pS7JYFSzCOHdHpLHAImoCGrKY1XN5scYly36jWkDw==", + "dependencies": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.4", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-toolbar": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.11.tgz", + "integrity": "sha512-PKcTrtC88WZjNQz4ACnPgbNDBprsLJVDxyV1x8drGMNRePPrErkUNxsbhrr49L8ffmIavd4kxW5XVNOx8Kswmw==", + "dependencies": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz", + "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.28.6", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.28.6.tgz", + "integrity": "sha512-hnhotV+DnQtvtR3jPvbQMPNMW4KEK0J4k7c609zJ8muiNknm+yoDyMHmxTWM5ZnlZpsz0zOxYFr+mzRJNHWJsA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.28.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.28.6.tgz", + "integrity": "sha512-/DdYuDBSsA21Qbcder1R8Cr/3Nx0ZnA2lgtqKsLMvov8wL4+g0HBz/gWYZPlIsof7iyfQafyhg4wUVUsS3vWZw==", + "dependencies": { + "@tanstack/query-core": "5.28.6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.1.3.tgz", + "integrity": "sha512-YCzcbF/Ws/uZ0q3Z6fagH+JVhx4JLvbSflgldMgLsuvB8aXjZLLb3HvrEVxY480F9wFlBiXlvQxOyXb5ENPrNA==", + "dependencies": { + "@tanstack/virtual-core": "3.1.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.1.3.tgz", + "integrity": "sha512-Y5B4EYyv1j9V8LzeAoOVeTg0LI7Fo5InYKgAjkY1Pu9GjtUwX/EKxNcU7ng3sKr99WEf+bPTcktAeybyMOYo+g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.0.0.tgz", + "integrity": "sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "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/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz", + "integrity": "sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.3.2", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + }, + "peerDependencies": { + "@jest/globals": ">= 28", + "@types/bun": "latest", + "@types/jest": ">= 28", + "jest": ">= 28", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "@jest/globals": { + "optional": true + }, + "@types/bun": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.0.tgz", + "integrity": "sha512-Nb2Sq8MoSvGVdOGGppRqXeafLtvXCOwiOQtcbqCfkpVNZZNUqIjeSOwrfJ59zBfmZbAn8PitnWEzUKD1YwMrCg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^10.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "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.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz", + "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/dagre": { + "version": "0.7.52", + "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.52.tgz", + "integrity": "sha512-XKJdy+OClLk3hketHi9Qg6gTfe1F3y+UFnHxKA2rn9Dw+oXa4Gb378Ztz9HlMgZKSxpPmn4BNVh9wgkpvrK1uw==", + "dev": true + }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "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", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.2.64", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.64.tgz", + "integrity": "sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.21.tgz", + "integrity": "sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "devOptional": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "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.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "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.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "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-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "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/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "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": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001596", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz", + "integrity": "sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "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/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-js-compat": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "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/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "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" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "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/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.699", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.699.tgz", + "integrity": "sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", + "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "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/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "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.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.1.tgz", + "integrity": "sha512-BgD0kPCWMlqoItRf3xe9fG0MqwObKfVch+f2ccwDpZiCJA8ghkz2wrASH+bI6nLZzGcOJOpMm1v1Q1euhfpt4Q==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "14.2.1", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", + "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "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-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/jest-config/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@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/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jose": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", + "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "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/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/littlehorse-client": { + "resolved": "../sdk-js", + "link": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/next": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.1.tgz", + "integrity": "sha512-SF3TJnKdH43PMkCcErLPv+x/DY1YCklslk3ZmwaVoyUfDgHKexuKlf9sEfBQ69w+ue8jQ3msLb+hSj1T19hGag==", + "dependencies": { + "@next/env": "14.2.1", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.1", + "@next/swc-darwin-x64": "14.2.1", + "@next/swc-linux-arm64-gnu": "14.2.1", + "@next/swc-linux-arm64-musl": "14.2.1", + "@next/swc-linux-x64-gnu": "14.2.1", + "@next/swc-linux-x64-musl": "14.2.1", + "@next/swc-win32-arm64-msvc": "14.2.1", + "@next/swc-win32-ia32-msvc": "14.2.1", + "@next/swc-win32-x64-msvc": "14.2.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-auth": { + "version": "4.24.7", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.7.tgz", + "integrity": "sha512-iChjE8ov/1K/z98gdKbn2Jw+2vLgJtVV39X+rCP5SGnVQuco7QOr19FRNGMIrD8d3LYhHWV9j9sKLzq1aDWWQQ==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.5.0", + "jose": "^4.15.5", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "next": "^12.2.5 || ^13 || ^14", + "nodemailer": "^6.6.5", + "react": "^17.0.2 || ^18", + "react-dom": "^17.0.2 || ^18" + }, + "peerDependenciesMeta": { + "nodemailer": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/nice-grpc-common": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/nice-grpc-common/-/nice-grpc-common-2.0.2.tgz", + "integrity": "sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==", + "dev": true, + "dependencies": { + "ts-error": "^1.0.6" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "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.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "dependencies": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oidc-token-hash": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", + "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openid-client": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.5.tgz", + "integrity": "sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w==", + "dependencies": { + "jose": "^4.15.5", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/openid-client/node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "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/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "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-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/preact": { + "version": "10.19.6", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.6.tgz", + "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.12.tgz", + "integrity": "sha512-o74kiDBVE73oHW+pdkFSluHBL3cYEvru5YgEqNkBMFF7Cjv+w1vI565lTlfoJT4VLWDe0FMtZ7FkE/7a4pMXSQ==", + "dev": true, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + }, + "prettier-plugin-twig-melody": { + "optional": true + } + } + }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/reactflow": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.1.tgz", + "integrity": "sha512-2GEh0bTkYR7rzAV3qdeN6C1o4qumtETZl7yQv1GVrfgr3c77nCUAOKsv5hetRejOGNnJudRwn6axeWFAY+IjNg==", + "dependencies": { + "@reactflow/background": "11.3.11", + "@reactflow/controls": "11.2.11", + "@reactflow/core": "11.11.1", + "@reactflow/minimap": "11.7.11", + "@reactflow/node-resizer": "2.2.11", + "@reactflow/node-toolbar": "1.3.11" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "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/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "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/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "node_modules/svgo": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", + "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/tailwindcss": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", + "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-error": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/ts-error/-/ts-error-1.0.6.tgz", + "integrity": "sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==", + "dev": true + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "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/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "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/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.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", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "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-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "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-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "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/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "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/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "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/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", + "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/dashboard/package.json b/dashboard/package.json index d45e98180..0e070cc83 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -1,34 +1,48 @@ { + "name": "dashboard", + "version": "0.1.0", "private": true, "scripts": { - "start": "turbo run start", - "build": "turbo run build", - "dev": "turbo run dev", - "test-watch": "jest --watch", + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "prettier --check .", + "lint:fix": "prettier --write .", "test": "jest", - "lint": "turbo run lint" - }, - "devDependencies": { - "@next/eslint-plugin-next": "^12.3.4", - "@turbo/gen": "^1.10.16", - "@types/jest": "29.5.5", - "node-mocks-http": "^1.13.0", - "@vercel/style-guide": "^5.0.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-tsdoc": "^0.2.17", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-import": "^2.29.0", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "eslint": "^8.53.0", - "@stylistic/eslint-plugin": "^1.0.1", - "eslint-config-custom": "*", - "jest": "29.7.0", - "ts-jest": "29.1.1", - "turbo": "^1.10.16" + "preinstall": "cd ../sdk-js && npm i && npm run build" }, "dependencies": { - "material-icons": "^1.13.12" + "@headlessui/react": "^1.7.18", + "@heroicons/react": "^2.1.1", + "@tanstack/react-query": "^5.28.6", + "dagre": "^0.8.5", + "littlehorse-client": "file://../sdk-js", + "next": "^14.2.1", + "next-auth": "^4.24.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "reactflow": "^11.11.1" }, - "packageManager": "pnpm@7.33.6" + "devDependencies": { + "@svgr/webpack": "^8.1.0", + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/react": "^15.0.0", + "@types/dagre": "^0.7.52", + "@types/jest": "^29.5.12", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "eslint": "^8", + "eslint-config-next": "^14.2.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "nice-grpc-common": "^2.0.2", + "postcss": "^8", + "prettier": "^3.2.5", + "prettier-plugin-tailwindcss": "^0.5.12", + "tailwindcss": "^3.3.0", + "ts-node": "^10.9.2", + "typescript": "^5" + } } diff --git a/dashboard/packages/eslint-config-custom/next.js b/dashboard/packages/eslint-config-custom/next.js deleted file mode 100644 index 2588f6826..000000000 --- a/dashboard/packages/eslint-config-custom/next.js +++ /dev/null @@ -1,93 +0,0 @@ -const { - resolve -} = require('node:path') - -const project = resolve(process.cwd(), 'tsconfig.json') - -/* - * This is a custom ESLint configuration for use with - * Next.js apps. - * - * This config extends the Vercel Engineering Style Guide. - * For more information, see https://github.com/vercel/style-guide - * - */ - -module.exports = { - extends: [ - '@vercel/style-guide/eslint/typescript', - '@vercel/style-guide/eslint/react', - ].map(require.resolve), - plugins: [ - '@stylistic' - ], - parserOptions: { - project, - sourceType: 'module', - ecmaVersion: 2015 - }, - globals: { - React: true, - JSX: true - }, - settings: { - 'import/resolver': { - typescript: { - project, - }, - }, - }, - ignorePatterns: [ 'node_modules/', 'dist/' ], - // add rules configurations here - rules: { - 'import/no-default-export': 'off', // turned off intentionally, we like to have default exports - '@typescript-eslint/restrict-template-expressions': 'off', // turning this rule off, as we don't need it - 'unicorn/filename-case': 'off', // turned off as we like the CamelCase naming convention for files - '@typescript-eslint/no-extraneous-class': 'off', // check if we have static field on classes, for now we don't need this check as we are using typescript and we need static attrs. - 'jsx-a11y/click-events-have-key-events': 'off', // needs to be addressed in: https://littlehorse.atlassian.net/browse/LH-224 - 'jsx-a11y/alt-text': 'off', // needs to be addressed in: https://littlehorse.atlassian.net/browse/LH-224 - 'jsx-a11y/no-static-element-interactions': 'off', // needs to be addressed in: https://littlehorse.atlassian.net/browse/LH-224 - 'jsx-a11y/no-noninteractive-element-interactions': 'off', // needs to be addressed in: https://littlehorse.atlassian.net/browse/LH-224 - '@typescript-eslint/no-unnecessary-condition': 'off', // ignored because it has issues with the key-signature we have for objects in our protos - '@typescript-eslint/no-base-to-string': 'off', // turned off as we don't need it - '@typescript-eslint/no-misused-promises': 'off', // turned off as the violations we have are mainly on jsx event handlers which is acceptable - 'react-hooks/exhaustive-deps': 'off', // a lot of warnings, ticket created to analyze case by case if needed -- https://littlehorse.atlassian.net/browse/LH-235 - 'react/button-has-type': 'off', // not needed as we are using only submit buttons - // '@next/next/no-img-element': 'off', // aparently using Next JS Imge requires extra storage on the server, disabling until a decision is taken - 'react/hook-use-state': 'error', - 'react/no-array-index-key': 'error', - 'react-hooks/rules-of-hooks': 'error', - // '@next/next/no-html-link-for-pages': 'error', - // '@next/next/no-head-element': 'error', - 'no-console': [ 'error', { - 'allow': [ 'error' ] - } ], - '@typescript-eslint/no-explicit-any': 'off', // https://littlehorse.atlassian.net/browse/LH-233 - '@typescript-eslint/explicit-function-return-type': 'off', //https://littlehorse.atlassian.net/browse/LH-232 - '@typescript-eslint/no-unsafe-assignment': 'off', // https://littlehorse.atlassian.net/browse/LH-231 - '@typescript-eslint/no-unsafe-call': 'off', // https://littlehorse.atlassian.net/browse/LH-230 - '@typescript-eslint/no-unsafe-member-access': 'off', // https://littlehorse.atlassian.net/browse/LH-229 - '@typescript-eslint/no-unsafe-argument': 'off', // https://littlehorse.atlassian.net/browse/LH-228 - '@typescript-eslint/no-unsafe-return': 'off', // https://littlehorse.atlassian.net/browse/LH-225 - '@typescript-eslint/no-floating-promises': 'off', // https://littlehorse.atlassian.net/browse/LH-227 - // starting here, we have our formatting rules - '@stylistic/keyword-spacing': 'error', - '@stylistic/semi': [ 'error', 'never' ], - '@stylistic/quotes': [ 'error', 'single', { - 'allowTemplateLiterals': true, 'avoidEscape': true - } ], - '@stylistic/prefer-named-capture-group': 'off', // not needed - '@stylistic/indent': [ 'warn', 4 ], - '@stylistic/object-curly-spacing': [ 'error', 'always' ], - '@stylistic/jsx-curly-spacing': 'error', - '@stylistic/array-bracket-spacing': [ 'error', 'always' ], - // '@stylistic/jsx-indent': [ 'error', 4 ], - '@stylistic/template-curly-spacing': 'error', - '@stylistic/brace-style': [ 'error', '1tbs', { - 'allowSingleLine': true - } ], - 'curly': 'error', - 'no-unreachable': 'error', - 'no-unexpected-multiline': 'error' - } -} diff --git a/dashboard/packages/eslint-config-custom/package.json b/dashboard/packages/eslint-config-custom/package.json deleted file mode 100644 index e29d4f70b..000000000 --- a/dashboard/packages/eslint-config-custom/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "eslint-config-custom", - "version": "0.0.0", - "main": "next.js", - "license": "MIT", - "devDependencies": { - - }, - "publishConfig": { - "access": "public" - } -} diff --git a/dashboard/packages/tsconfig/base.json b/dashboard/packages/tsconfig/base.json deleted file mode 100644 index d72a9f3a2..000000000 --- a/dashboard/packages/tsconfig/base.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "Default", - "compilerOptions": { - "composite": false, - "declaration": true, - "declarationMap": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "inlineSources": false, - "isolatedModules": true, - "moduleResolution": "node", - "noUnusedLocals": false, - "noUnusedParameters": false, - "preserveWatchOutput": true, - "skipLibCheck": true, - "strict": true - }, - "exclude": ["node_modules"] -} diff --git a/dashboard/packages/tsconfig/nextjs.json b/dashboard/packages/tsconfig/nextjs.json deleted file mode 100644 index d5010a1bb..000000000 --- a/dashboard/packages/tsconfig/nextjs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "Next.js", - "extends": "./base.json", - "compilerOptions": { - "plugins": [{ "name": "next" }], - "allowJs": true, - "declaration": false, - "declarationMap": false, - "incremental": true, - "jsx": "preserve", - "lib": ["dom", "dom.iterable", "esnext"], - "module": "esnext", - "noEmit": true, - "resolveJsonModule": true, - "strict": false, - "target": "es5" - }, - "include": ["src", "next-env.d.ts"], - "exclude": ["node_modules"] -} diff --git a/dashboard/packages/tsconfig/package.json b/dashboard/packages/tsconfig/package.json deleted file mode 100644 index 6efb83e14..000000000 --- a/dashboard/packages/tsconfig/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "tsconfig", - "version": "0.0.0", - "private": true, - "license": "MIT", - "publishConfig": { - "access": "public" - } -} diff --git a/dashboard/packages/tsconfig/react-library.json b/dashboard/packages/tsconfig/react-library.json deleted file mode 100644 index 36b62be38..000000000 --- a/dashboard/packages/tsconfig/react-library.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "React Library", - "extends": "./base.json", - "compilerOptions": { - "jsx": "react-jsx", - "lib": ["ES2015", "DOM"], - "module": "ESNext", - "target": "es6" - } -} diff --git a/dashboard/packages/ui/Header.tsx b/dashboard/packages/ui/Header.tsx deleted file mode 100644 index 9da9239e9..000000000 --- a/dashboard/packages/ui/Header.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import * as React from 'react' - -export function Header({ text }: { text: string }) { - return

{text}

-} diff --git a/dashboard/packages/ui/components/Button/Button.tsx b/dashboard/packages/ui/components/Button/Button.tsx deleted file mode 100644 index a2486df89..000000000 --- a/dashboard/packages/ui/components/Button/Button.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from 'react' - -export interface ButtonProps - extends React.ButtonHTMLAttributes { - onClick?: () => void; - active?: boolean; - className?: string; - children: React.ReactNode; -} - -/* - eslint-disable-next-line react/function-component-definition - */ -const Button: React.ForwardRefRenderFunction = ({ active, children, onClick, className }: ButtonProps) => { - return ( - - ) -} - -Button.displayName = 'Button' - -export default Button diff --git a/dashboard/packages/ui/components/Button/_button.scss b/dashboard/packages/ui/components/Button/_button.scss deleted file mode 100644 index 294c5ba9c..000000000 --- a/dashboard/packages/ui/components/Button/_button.scss +++ /dev/null @@ -1,60 +0,0 @@ -.btn{ - - cursor: pointer; - display: flex; - // min-width: 95px; - height: 32px; - padding: 12px; - justify-content: center; - align-items: center; - text-align: center; - - border-radius: 4px; - border: 1px solid var(--color-gray, #4D5461); - background: var(--color-bg-dark, #242529); - - color: #FFF; - text-align: center; - font-size: 14px; - font-family: "Inter"; - - -} - -.btns{ - display: flex; - gap: 8px; -} -.btns-right{ - justify-content: end; -} -.btn-icon{ - justify-content: space-between; -} - -.btn-dark{ - -} -.active-dark{ - border-radius: 4px; - border: 1px solid var(--color-gray, #4D5461); - background: var(--color-ghost-light, #363A41); -} - -.btn.active-purple{ - border-radius: 4px; - border: 1px solid var(--color-primary-light, #AAA7FF); - background: var(--color-primary, #7F7AFF); -} - -.btn-wfrun-link { - color: var(--color-primary, #7F7AFF); - text-align: center; - font-family: Inter; - font-size: 12px; - font-style: normal; - font-weight: 700; - line-height: normal; - border: none; - display: inline-block; -} diff --git a/dashboard/packages/ui/components/Button/index.tsx b/dashboard/packages/ui/components/Button/index.tsx deleted file mode 100644 index e3ae2469b..000000000 --- a/dashboard/packages/ui/components/Button/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default as Button, type ButtonProps } from './Button' diff --git a/dashboard/packages/ui/components/Calendar/Calendar.tsx b/dashboard/packages/ui/components/Calendar/Calendar.tsx deleted file mode 100644 index fce15f576..000000000 --- a/dashboard/packages/ui/components/Calendar/Calendar.tsx +++ /dev/null @@ -1,151 +0,0 @@ -'use client' - -import * as React from 'react' -import { useState } from 'react' -import moment from 'moment' -import { useOutsideClick, getFirstDate } from '../../utils' -import { CInput } from './CalendarComponents' -import { CalendarCanvas } from './CalendarCanvas' - -const wl = [ - { label: '1 day', value: 'DAYS_1' }, - { label: '2 hours', value: 'HOURS_2' }, - { label: '5 minutes', value: 'MINUTES_5' } -] - -interface CalendarProps { - type: string; - changeType: (type: string) => void; - lastDate: Date; - changeLastDate: (date: Date) => void; - noWindows: number; - changeNoWindows: (n: number) => void; -} - -export function Calendar({ type, changeType, lastDate, changeLastDate, noWindows, changeNoWindows }: CalendarProps) { - - const [ ttype, setType ] = useState(wl.find((t) => t.value === type) || wl[1]) - const [ startDt, setStartDT ] = useState(getFirstDate(lastDate, type, noWindows)) - const [ endDt, setEndDT ] = useState(lastDate) - const [ showCalendar, setShowCalendar ] = useState(false) - const [ showWL, setShowWL ] = useState(false) - - const setTypeHandler = (e: React.MouseEvent, type:{ label: string; value: string }) => { - e.stopPropagation() - setType(type) - changeType(type.value) - setShowWL(false) - } - const setShowWLHandler = () => { - setShowWL((prev) => !prev) - setShowCalendar(false) - } - const setShowCalendarHandler = () => { - setShowCalendar((prev) => !prev) - setShowWL(false) - } - const setStartDTHandler = (date?: Date) => { - setStartDT(date) - } - const setEndDTHandler = (date?: Date) => { - setEndDT(date) - } - // handler that will close the dropdown menu when the user clicks on different part of the page. - const handleOutsideClick = () => { - setShowWL(false) - } - // handler that will close the calendar when the user clicks outside of it - const handleOutsideCalendarClick = () => { - setShowCalendar(false) - } - - const onApply = () => { - let diff = 0 - const endDte = endDt ? endDt : moment(startDt).endOf('day').toDate() - - if (type === 'DAYS_1') { - diff = moment(endDte).diff(moment(startDt), 'days') - diff = diff + 1 - } else if (type === 'HOURS_2') { - diff = moment(endDte).diff(moment(startDt), 'hours') - diff = Math.ceil(diff / 2) - } else { - diff = moment(endDte).diff(moment(startDt), 'minutes') - diff = Math.ceil(diff / 5) - } - changeNoWindows(diff > 1500 ? 1500 : diff) - changeLastDate(endDte || lastDate) - setShowCalendar(false) - } - - // ref used to locate the ancestor Ref so the handler doesn't reopen the dropdown - const ancestorOutsideClickRef = React.useRef(null) - // anchor element that triggers handler when is not clicked. - const outsideClickRef = useOutsideClick(handleOutsideClick,ancestorOutsideClickRef) - - // ref used to locate the ancestor Ref so the handler doesn't reopen the calendar - const ancestorOutsideCalendarClickRef = React.useRef(null) - // anchor element that triggers handler when is not clicked. - const outsideCalendarClickRef = useOutsideClick(handleOutsideCalendarClick, ancestorOutsideCalendarClickRef) - - return ( -
-
- - {showWL ? ( -
Select one
- ) : ( -
{ttype.label}
- )} - expand_more - {showWL ?
- {wl.map((w) => ( -
{ setTypeHandler(e, w) }}> - {w.label} -
- ))} -
: null} -
- - -
- {!startDt ? ( -
Select date and time
- ) : ( - <> - {Boolean(startDt) && !endDt ? ( -
- - {moment(startDt).format(`MMM DD ${ttype.value === 'HOURS_2' ? 'HH:00' : ''} ${ttype.value === 'MINUTES_5' ? 'HH:mm' : ''} `)} - -
- ) : ( -
- from{` `} - - {moment(startDt).format(`MMM DD ${ttype.value === 'HOURS_2' ? 'HH:00' : ''} ${ttype.value === 'MINUTES_5' ? 'HH:mm' : ''} `)} - - to{` `} - - {moment(endDt).format(`MMM DD ${ttype.value === 'HOURS_2' ? 'HH:00' : ''} ${ttype.value === 'MINUTES_5' ? 'HH:mm' : ''}`)} - -
- )} - - )} - expand_more - calendar_month -
- {showCalendar ? : null} -
-
-
- ) -} diff --git a/dashboard/packages/ui/components/Calendar/CalendarB.tsx b/dashboard/packages/ui/components/Calendar/CalendarB.tsx deleted file mode 100644 index 7f69fcd78..000000000 --- a/dashboard/packages/ui/components/Calendar/CalendarB.tsx +++ /dev/null @@ -1,73 +0,0 @@ -'use client' - -import { useState, useRef } from 'react' -import moment from 'moment' -import { useOutsideClick } from '../../utils' -import { CInput } from './CalendarComponents' -import { CalendarCanvasB } from './CalendarCanvas' - -interface CalendarBProps { - earlyDate:Date, changeEarlyDate:(date:Date) => void, - lastDate:Date, changeLastDate:(date:Date) => void -} - -export function CalendarB({ earlyDate, changeEarlyDate, lastDate, changeLastDate }: CalendarBProps) { - - const [ startDt, setStartDT ] = useState(earlyDate) - const [ endDt, setEndDT ] = useState(lastDate) - const [ showCalendar, setShowCalendar ] = useState(false) - - const setShowCalendarHandler = () => { - setShowCalendar(prev => !prev) - } - const setStartDTHandler = (date?:Date) => { - setStartDT(date) - } - const setEndDTHandler = (date?:Date) => { - setEndDT(date) - } - // handler that will close the calendar when the user clicks outside of it - const handleOutsideCalendarClick = () => { - setShowCalendar(false) - } - const onApply = () => { - changeEarlyDate(startDt || moment().toDate()) - changeLastDate(endDt || moment().toDate()) - setShowCalendar(false) - } - - // ref used to locate the ancestor Ref so the handler doesn't reopen the calendar - const ancestorOutsideCalendarClickRef = useRef(null) - // anchor element that triggers handler when is not clicked. - const outsideCalendarClickRef = useOutsideClick(handleOutsideCalendarClick, ancestorOutsideCalendarClickRef) - - return ( -
-
- -
- {!startDt ? ( -
Select date and time
- ) : ( - <>{(Boolean(startDt) && !endDt) ? ( -
- {moment(startDt).format(`MMM DD, HH:mm`)} -
- ) : ( -
Early Started: - {moment(startDt).format(`MMM DD, HH:mm`)} - Latest Started - {moment(endDt).format(`MMM DD, HH:mm`)} -
- ) } - - )} - expand_more - calendar_month -
- {showCalendar ? : null} -
-
-
- ) -} diff --git a/dashboard/packages/ui/components/Calendar/CalendarCanvas/CalendarCanvas.tsx b/dashboard/packages/ui/components/Calendar/CalendarCanvas/CalendarCanvas.tsx deleted file mode 100644 index f5e139df8..000000000 --- a/dashboard/packages/ui/components/Calendar/CalendarCanvas/CalendarCanvas.tsx +++ /dev/null @@ -1,93 +0,0 @@ -'use client' - -import React, { useState, useEffect } from 'react' -import moment from 'moment' -import { Content } from '../CalendarComponents' - -interface CalendarCanvasProps { - type: string; - lastDate: Date; - setEndDT: (dt?: Date) => void; - setStartDT: (dt?: Date) => void; - onApply: () => void; - outsideCalendarClickRef: React.LegacyRef; -} - -// Calendar Canvas will be drilled with outsideCalendarClickRef so the click outside custom hook anchors the element and doesn't reopen -export function CalendarCanvas({ type, setEndDT, setStartDT, onApply, lastDate, outsideCalendarClickRef }: CalendarCanvasProps) { - - const [ date, setDate ] = useState(moment().toDate()) - const [ selected, setSelected ] = useState(lastDate) - const [ endSelected, setEndSelected ] = useState() - - const updateEndSelectedH = (H: string) => { - setEndSelected( - endSelected - ? moment(endSelected).set('hour', Number(H)).toDate() - : moment(selected).set('hour', Number(H)).toDate() - ) - } - const updateEndSelectedM = (M: string) => { - setEndSelected( - endSelected - ? moment(endSelected).set('minute', Number(M)).toDate() - : moment(selected).set('minute', Number(M)).toDate() - ) - } - const updateSelectedH = (H: string) => { - setSelected(moment(selected).set('hour', Number(H)).toDate()) - } - const updateSelectedM = (M: string) => { - setSelected(moment(selected).set('minute', Number(M)).toDate()) - } - const selectDate = (date: Date) => { - if (endSelected) { - setSelected(date) - setStartDT(date) - setEndSelected(undefined) - setEndDT(undefined) - } else if (selected) { - if (date > selected) { - setEndDT(date) - setEndSelected(date) - } else { - setEndDT(selected) - setEndSelected(selected) - setSelected(date) - setStartDT(date) - } - } else { - setSelected(date) - setStartDT(date) - } - } - - useEffect(() => { setEndDT(endSelected) }, [ endSelected ]) - useEffect(() => { setStartDT(selected) }, [ selected ]) - - const nextMonth = () => { - setDate((date) => moment(date).add(1, 'month').toDate()) - } - const prevMonth = () => { - setDate((date) => moment(date).subtract(1, 'month').toDate()) - } - - return ( -
- -
- ) -} diff --git a/dashboard/packages/ui/components/Calendar/CalendarCanvas/CalendarCanvasB.tsx b/dashboard/packages/ui/components/Calendar/CalendarCanvas/CalendarCanvasB.tsx deleted file mode 100644 index 2bf39c035..000000000 --- a/dashboard/packages/ui/components/Calendar/CalendarCanvas/CalendarCanvasB.tsx +++ /dev/null @@ -1,87 +0,0 @@ -'use client' - -import React, { useState, useEffect } from 'react' -import moment from 'moment' -import { Content } from '../CalendarComponents' - -interface CalendarCanvasBProps { - earlyDate:Date, - lastDate:Date, - setEndDT:(dt?:Date) => void, - setStartDT:(dt?:Date) => void, - onApply:() => void, - outsideCalendarClickRef: React.LegacyRef -} - -export function CalendarCanvasB({ earlyDate, setEndDT, setStartDT, onApply, lastDate, outsideCalendarClickRef }: CalendarCanvasBProps) { - - const [ date, setDate ] = useState(moment().toDate()) - const [ selected, setSelected ] = useState(earlyDate) - const [ endSelected, setEndSelected ] = useState(lastDate) - - const updateEndSelectedH = (H:string) => { - setEndSelected(endSelected ? moment(endSelected).set('hour',Number(H)).toDate() : moment(selected).set('hour',Number(H)).toDate() ) - } - const updateEndSelectedM = (M:string) => { - setEndSelected(endSelected ? moment(endSelected).set('minute',Number(M)).toDate() : moment(selected).set('minute',Number(M)).toDate() ) - } - const updateSelectedH = (H:string) => { - setSelected(moment(selected).set('hour',Number(H)).toDate()) - } - const updateSelectedM = (M:string) => { - setSelected(moment(selected).set('minute',Number(M)).toDate()) - } - const selectDate = (date:Date) => { - if (endSelected) { - setSelected(date) - setStartDT(date) - setEndSelected(undefined) - setEndDT(undefined) - } else if (selected){ - if (date > selected){ - setEndDT(date) - setEndSelected(date) - } else { - setEndDT(selected) - setEndSelected(selected) - setSelected(date) - setStartDT(date) - } - } else { - setSelected(date) - setStartDT(date) - } - - } - useEffect(()=> { - setEndDT(endSelected) - },[ endSelected ]) - useEffect(()=> { - setStartDT(selected) - },[ selected ]) - const nextMonth = () => { - setDate(date => moment(date).add(1,'month').toDate()) - } - const prevMonth = () => { - setDate(date => moment(date).subtract(1,'month').toDate()) - } - - return ( -
- -
- ) -} diff --git a/dashboard/packages/ui/components/Calendar/CalendarCanvas/index.ts b/dashboard/packages/ui/components/Calendar/CalendarCanvas/index.ts deleted file mode 100644 index c56c3d441..000000000 --- a/dashboard/packages/ui/components/Calendar/CalendarCanvas/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { CalendarCanvas } from './CalendarCanvas' -export { CalendarCanvasB } from './CalendarCanvasB' diff --git a/dashboard/packages/ui/components/Calendar/CalendarComponents/CInput.tsx b/dashboard/packages/ui/components/Calendar/CalendarComponents/CInput.tsx deleted file mode 100644 index 44179a9b1..000000000 --- a/dashboard/packages/ui/components/Calendar/CalendarComponents/CInput.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import * as React from 'react' - -interface CInputProps { - label: string; - children?: React.ReactNode | React.ReactNode[]; - onClick?: () => void; -} -export function CInput({ label, children, onClick }: CInputProps) { - - if (onClick === undefined) { - return ( - - ) - } - - return ( - - ) -} diff --git a/dashboard/packages/ui/components/Calendar/CalendarComponents/Content.tsx b/dashboard/packages/ui/components/Calendar/CalendarComponents/Content.tsx deleted file mode 100644 index 0f8508e01..000000000 --- a/dashboard/packages/ui/components/Calendar/CalendarComponents/Content.tsx +++ /dev/null @@ -1,318 +0,0 @@ -'use client' - -import { useState, useEffect } from 'react' -import moment from 'moment' -import { YearSelector } from './YearSelector' - -export function Content({ - init, - nextMonth, - prevMonth, - onApply, - selectDay, - updateSelectedH, - updateSelectedM, - updateEndSelectedH, - updateEndSelectedM, - selected, - endSelected, - type -}: { - init: any; - nextMonth: any; - prevMonth: any; - onApply: () => void; - selectDay: any; - updateSelectedH: any; - updateSelectedM: any; - updateEndSelectedH: any; - updateEndSelectedM: any; - selected: any; - endSelected: any; - type: any; -}) { - const [ weeks, setWeeks ] = useState([]) - const fillDays = (firstDay: moment.Moment, lastDay: moment.Moment) => { - const dates: any = [] - const month = moment(init).month() - while (firstDay < lastDay) { - dates.push({ - day: firstDay.format('DD'), - selected, - endSelected, - date: firstDay.toDate(), - otherMonth: firstDay.month() !== month, - inRange: - selected && - endSelected && - firstDay > selected && - firstDay < endSelected, - startRange: - selected && - firstDay.format('YMMDD') === moment(selected).format('YMMDD'), - endsRange: - (selected && - !endSelected && - firstDay.format('YMMDD') === moment(selected).format('YMMDD')) || - (endSelected && - firstDay.format('YMMDD') === moment(endSelected).format('YMMDD')), - today: - firstDay.date() === moment().date() && - firstDay.month() === moment().month(), - afterPresent: firstDay.format('YMMDD') > moment().format('YMMDD') - }) - firstDay.add(1, 'day') - } - return dates - } - const enumerateWeeks = function () { - const date = moment(init).startOf('month') - let firstWeek = moment(init).startOf('month').week() - const endWeek = moment(init).endOf('month').week() - const dates: any = [] - while (firstWeek <= endWeek) { - const firstDay = date.clone().startOf('week') - const lastDay = date.clone().endOf('week') - dates.push(fillDays(firstDay, lastDay)) - date.add(1, 'week') - firstWeek++ - } - return dates - } - const selectDayHandler = (day: any) => { - if (day.afterPresent) {return false} - selectDay(day.date) - } - useEffect(() => { - setWeeks(enumerateWeeks()) - }, [ init, selected, endSelected ]) - - const renderMinutesSelectorValue = () => { - if (type === 'HOURS_2') { - return '00' - } - - if (endSelected) { - return moment(endSelected).format('mm') - } - - moment(selected).format('mm') - } - - return ( -
-
- -
-
- S -
-
- M -
-
- T -
-
- W -
-
- T -
-
- F -
-
- S -
-
- {weeks.map((week: any, ix: number) => ( -
- {week.map((day: any) => ( -
selectDayHandler(day)} - style={{ - fontSize: '14px', - lineHeight: '150%', - fontWeight: '700' - }} - > -
- {day.day} {day.today ?
: null} -
-
- ))} -
- ))} - {type === 'DAYS_1' && ( -
- Apply range -
- )} -
- - {type !== 'DAYS_1' && ( -
-
-
From
-
- {moment(selected).format('DD')} - {moment(selected).format('MMMM')} - {moment(selected).format('Y')} -
-
- -
:
- -
-
-
-
To
-
- - {endSelected - ? moment(endSelected).format('DD') - : moment(selected).format('DD')} - - - {endSelected - ? moment(endSelected).format('MMMM') - : moment(selected).format('MMMM')} - - - {endSelected - ? moment(endSelected).format('Y') - : moment(selected).format('Y')} - -
-
- -
:
- -
-
- -
- )} -
- ) -} diff --git a/dashboard/packages/ui/components/Calendar/CalendarComponents/YearSelector.tsx b/dashboard/packages/ui/components/Calendar/CalendarComponents/YearSelector.tsx deleted file mode 100644 index 70f47692c..000000000 --- a/dashboard/packages/ui/components/Calendar/CalendarComponents/YearSelector.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import * as React from 'react' -import { utc } from 'moment' -/* - eslint-disable-next-line import/no-unresolved - */ -import 'material-icons/iconfont/material-icons.css' - -export interface YearSelectorProps { - prevMonth: () => void; - nextMonth: () => void; - date: string; -} -export function YearSelector({ - prevMonth, - nextMonth, - date -}: YearSelectorProps) { - return ( -
-
- chevron_left -
-
-
{utc(date).format('MMMM')}
-
{utc(date).format('Y')}
-
-
- chevron_right -
-
- ) -} diff --git a/dashboard/packages/ui/components/Calendar/CalendarComponents/index.ts b/dashboard/packages/ui/components/Calendar/CalendarComponents/index.ts deleted file mode 100644 index 41b80f7ce..000000000 --- a/dashboard/packages/ui/components/Calendar/CalendarComponents/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { YearSelector } from './YearSelector' -export { CInput } from './CInput' -export { Content } from './Content' diff --git a/dashboard/packages/ui/components/Calendar/_calendar.scss b/dashboard/packages/ui/components/Calendar/_calendar.scss deleted file mode 100644 index dce65af62..000000000 --- a/dashboard/packages/ui/components/Calendar/_calendar.scss +++ /dev/null @@ -1,437 +0,0 @@ -.metricsCalendar *{ - font-family: 'Inter', sans-serif; -} -.metricsCalendar .header{ - /* color-gray */ - background-color: #4D5461; - border-radius: 4px 4px 0px 0px; - display: flex; - height: 41px; - justify-content: space-between; - -} -.metricsCalendar .header .lfBtn{ - width: 30px; - display: flex; - align-items: center; - cursor: pointer; -} -.metricsCalendar .header .lfBtn:first-child{ - border-radius: 4px 0px 0px 0px; -} -.metricsCalendar .header .lfBtn:last-child{ - border-radius: 0px 4px 0px 0px; -} -.metricsCalendar .header .lfBtn:active{ - /* color-ghostLight */ - background-color: #363A41; -} - - -.metricsCalendar .controls{ - display: inline-flex; - gap: 40px; -} -.metricsCalendar .label{ - display: inline-flex; - align-items: center; - gap: 20px; - font-family: 'Inter', sans-serif; - font-size: 12px; - font-weight: 400; - line-height: 15px; - letter-spacing: 0em; - text-align: center; - /* color-brightLight */ - color: #EDEEF0; - text-transform: none; - position: relative; - -} -.metricsCalendar .input{ - /* color-gray */ - border: 1px solid #4D5461; - border-radius: 4px; - padding-left: 12px; - padding-right: 12px; - height: 32px; - display: flex; - justify-content: space-between; - /* color-ghostLight */ - background-color: #363A41; - align-items: center; - min-width: 140px; - position: relative; -} -.metricsCalendar .input .inputWrapper{ - height: 32px; - display: flex; - justify-content: space-between; - /* color-ghostLight */ - align-items: center; - min-width: 140px; - position: relative; -} -.metricsCalendar .input .float{ - position: absolute; - z-index: 80; - top: 36px; - right: 0px; - background: #394150; - padding: 4px 0px 4px 0px; - border-radius: 4px; - min-width: 100%; - -} -.metricsCalendar .input .option{ - padding: 8px 12px 8px 12px; - font-family: 'Inter', sans-serif; - font-size: 14px; - font-weight: 500; - line-height: 16px; - letter-spacing: 0em; - text-align: left; - cursor: pointer; -} -.metricsCalendar .input .option.selected, .metricsCalendar .input .option:hover{ - /* color-gray */ - background-color: #4D5461; - -} -.metricsCalendar .input>.material-icons-outlined, .metricsCalendar .input .inputWrapper>.material-icons-outlined{ - font-size: 16px; - user-select: none; -} -.metricsCalendar .input>.material-icons, .metricsCalendar .input .inputWrapper>.material-icons{ - font-size: 16px; - margin-left: 20px; - user-select: none; -} -.metricsCalendar .input .placeholder{ - /* color-mildLight */ - color: #9098A0; - font-family: 'Inter', sans-serif; - font-weight: 400; - font-size: 14px; - line-height: 16.94px; - user-select: none; -} -.metricsCalendar .input .text{ - /* color-brightLight */ - color: #EDEEF0; - font-family: 'Inter', sans-serif; - font-size: 14px; - font-weight: 400; - line-height: 17px; - letter-spacing: 0em; - text-align: center; -} - -.metricsCalendar .weeks, .metricsCalendar .weeks *{ - /* color-mildLight */ - color: #9098A0; - font-family: 'Roboto', sans-serif; - font-weight: 400; - font-size: 14px; - line-height: 21px; -} - -.metricsCalendar .day { - /* color-brightLight */ - color: #EDEEF0; - padding: 2px; - display: flex; - user-select: none; -} -.metricsCalendar .startRange>div { - display: flex; - flex:1; - border-radius: 8px 0px 0px 8px !important; - cursor: pointer; - /* color-primary */ - background-color: #7F7AFF !important; - /* color-brightLight */ - color: #EDEEF0 !important; - margin-right: -2px; - padding-right: 2px; - box-sizing: border-box; -} - -.metricsCalendar .endsRange>div { - display: flex; - flex:1; - border-radius: 0px 8px 8px 0px !important; - cursor: pointer; - /* color-primary */ - background-color: #7F7AFF !important; - /* color-brightLight */ - color: #EDEEF0 !important; - margin-left: -2px; - padding-left: 2px; - box-sizing: border-box; -} -.metricsCalendar .endsRange.startRange>div { - - border-radius: 8px 8px 8px 8px !important; - margin-left: 0px; - margin-right: 0px; - box-sizing: border-box; - - -} -.metricsCalendar .inRange>div { - display: flex; - flex:1; - border-radius: 0px 0px 0px 0px !important; - cursor: pointer; - /* color-primary */ - background-color: #6363B9 !important; - /* color-brightLight */ - color: #EDEEF0 !important; - margin-left: -2px; - margin-right: -2px; - box-sizing: border-box; -} - -.metricsCalendar .endsRange.currentDay>div, .metricsCalendar .startRange.currentDay>div, .metricsCalendar .inRange.currentDay>div { - /* color-brightLight */ - color: #EDEEF0 !important; -} -.metricsCalendar .day>div { - display: flex; - flex:1; - border-radius: 8px; - cursor: pointer; -} -.metricsCalendar .day>div:hover { - /* color-gray */ - background-color: #4D5461; -} -.metricsCalendar .otherMonth * { - /* color-mildLight */ - color: #9098A0; -} - -.metricsCalendar .afterPresent * { - /* color-mildLightDarker */ - color: #6D717F; -} -.metricsCalendar .afterPresent>div:hover { - background-color: transparent; - cursor: default; -} -.metricsCalendar .currentDay * { - /* color-primary */ - color: #7F7AFF !important; - position: relative; -} - -.metricsCalendar .currentDay .dot { - /* color-primary */ - background-color: #7F7AFF; - height: 4px; - width: 4px; - position: absolute; - left: 50%; - margin-left: -2px; - top: 30px; - border-radius: 100%; -} -.metricsCalendar .currentDay.endsRange .dot, .metricsCalendar .currentDay.startRange .dot, .metricsCalendar .currentDay.inRange .dot { - /* color-primary */ - background-color: #EDEEF0; -} - -.mcToolTip{ - position: absolute; - visibility: hidden; - z-index: 50; - border-radius: 8px; - border: 1px solid #6D717F; - pointer-events: none; - - - /* shadow-darkbox01 */ - box-shadow: 0px 27px 8px 0px rgba(0, 0, 0, 0.00), 0px 17px 7px 0px rgba(0, 0, 0, 0.01), 0px 10px 6px 0px rgba(0, 0, 0, 0.05), 0px 4px 4px 0px rgba(0, 0, 0, 0.09), 0px 1px 2px 0px rgba(0, 0, 0, 0.10), 0px 0px 0px 0px rgba(0, 0, 0, 0.10); -} -.mcToolTip header{ - display: flex; - padding: 8px 12px; - align-items: flex-start; - gap: 10px; - align-self: stretch; - border-radius: 8px 8px 0px 0px; - - border-bottom: 1px solid #6D717F; - background: #4D5461; - - color: #EDEEF0; - font-size: 12px; - font-family: 'Inter', sans-serif; - font-weight: 500; - line-height: 16px; -} -.mcToolTip main{ - display: flex; - padding: 12px; - flex-direction: column; - align-items: flex-start; - gap: 8px; - background: #394150; - border-radius: 0px 0px 8px 8px ; -} -.mcToolTip main>div{ - display: flex; - align-items: center; - gap: 4px; -} -.mcToolTip main>div .dot{ - width: 12px; - height: 12px; - border-radius: 12px; - background: #E6527F; -} -.mcToolTip main>div .title, .mcToolTip .title{ - color: #FFF; - font-size: 14px; - font-family: 'Inter', sans-serif; - font-weight: 500; - line-height: 16px; - white-space: nowrap; -} -.mcToolTip main>div label{ - color: #A2A7B8; - font-size: 14px; - font-family: 'Inter', sans-serif; - font-weight: 500; - line-height: 16px; - text-transform: none; -} -.mcToolTip main>div .value{ - color: #A2A7B8; - font-size: 14px; - font-family: 'Inter', sans-serif; - font-weight: 500; - line-height: 16px; - text-transform: none; -} - -.applyButton{ - display: flex; - height: 32px; - padding: 12px; - justify-content: center; - align-items: center; - - border-radius: 4px; - border: 1px solid var(--color-primary-light, #AAA7FF); - background: var(--color-primary, #7F7AFF); - - color: var(--color-bright-light, #EDEEF0); - text-align: center; - font-size: 14px; - font-family: "Inter"; - font-weight: 600; - width: 100%; - white-space: nowrap; - box-sizing: border-box; - cursor: pointer; -} -.metricsCalendar .header .yearSelector{ - display: flex; -} -.calMonth{ - display: flex; - flex:1; - width: 96px; - height: 41px; - padding: 10px; - justify-content: center; - // justify-content: space-between; - align-items: center; - box-sizing: border-box; -} -.calYear{ - display: flex; - flex:1; - width: 96px; - height: 41px; - padding: 10px; - justify-content: center; - // justify-content: space-between; - align-items: center; - box-sizing: border-box; -} -.timePickerCanvas{ - display: flex; - flex:1; - padding:10px; - margin-left:10px; - border-left: 1px solid #4D5461; - flex-direction: column; - justify-content: space-between; - .block{ - display: flex; - flex-direction: column; - gap:5px; - padding: 12px; - } - .label{ - color: var(--color-mild-light, #9098A0); - font-size: 12px; - font-family: "Inter"; - font-weight: 500; - line-height: 150%; - } - .monthAndYear{ - color: var(--color-bright-light, #EDEEF0); - font-family: "Inter"; - font-weight: 500; - display: flex; - gap: 5px; - align-items: baseline; - .day{ - font-size: 20px; - line-height: 30px; - } - .month{ - font-size: 14px; - line-height: 21px; - } - .year{ - font-size: 16px; - line-height: 24px; - } - } - .pickers{ - display: flex; - gap:5px; - align-items: center; - .dots{ - color: var(--color-bright-light, #EDEEF0); - text-align: center; - font-size: 16px; - font-family: "Roboto"; - font-weight: 500; - line-height: 100%; - } - select{ - display: flex; - outline: none; - width: 62px; - height: 28px; - padding: 0px 8px 0px 12px; - justify-content: space-between; - align-items: center; - border-radius: 4px; - border: 1px solid var(--color-gray, #4D5461); - background: var(--color-ghost-light, #363A41); - color: var(--color-bright-light, #EDEEF0); - text-align: center; - font-size: 16px; - font-family: "Inter"; - font-weight: 500; - line-height: 100%; - } - } -} diff --git a/dashboard/packages/ui/components/Calendar/index.ts b/dashboard/packages/ui/components/Calendar/index.ts deleted file mode 100644 index af5c3fd35..000000000 --- a/dashboard/packages/ui/components/Calendar/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { Calendar } from './Calendar' -export { CalendarB } from './CalendarB' diff --git a/dashboard/packages/ui/components/Container.tsx b/dashboard/packages/ui/components/Container.tsx deleted file mode 100644 index 72b11a347..000000000 --- a/dashboard/packages/ui/components/Container.tsx +++ /dev/null @@ -1,5 +0,0 @@ -export function Container({ children }:any) { - return
- {children} -
-} diff --git a/dashboard/packages/ui/components/Drawer/DrawerHeader.tsx b/dashboard/packages/ui/components/Drawer/DrawerHeader.tsx deleted file mode 100644 index cb2c96046..000000000 --- a/dashboard/packages/ui/components/Drawer/DrawerHeader.tsx +++ /dev/null @@ -1,15 +0,0 @@ -'use client' -interface DrawerHeaderProps { - title?:string - image?:string - name?:string -} -export function DrawerHeader({ name, image, title }:DrawerHeaderProps) { - return
- {image} -
-

{title}

-

{name?.split('-').slice(0,-1).join('-')}

-
-
-} diff --git a/dashboard/packages/ui/components/Drawer/DrawerLink.tsx b/dashboard/packages/ui/components/Drawer/DrawerLink.tsx deleted file mode 100644 index b4525fb36..000000000 --- a/dashboard/packages/ui/components/Drawer/DrawerLink.tsx +++ /dev/null @@ -1,13 +0,0 @@ -interface DrawerLinkProps { - name?:string -} -export function DrawerLink({ name }:DrawerLinkProps) { - return
- link - {/* {"link"} */} -

- {/* {data?.name?.split("-").slice(1, -1).join("-") || ""} */} - {name} -

-
-} diff --git a/dashboard/packages/ui/components/Drawer/DrawerSection.tsx b/dashboard/packages/ui/components/Drawer/DrawerSection.tsx deleted file mode 100644 index 2fbdfbb39..000000000 --- a/dashboard/packages/ui/components/Drawer/DrawerSection.tsx +++ /dev/null @@ -1,11 +0,0 @@ -'use client' -interface DrawerSectionProps { - title:string - children?: React.ReactNode | React.ReactNode[] -} -export function DrawerSection({ title, children }:DrawerSectionProps) { - return
-
{title}
- {children} -
-} diff --git a/dashboard/packages/ui/components/Drawer/DrawerThreadSpecLink.tsx b/dashboard/packages/ui/components/Drawer/DrawerThreadSpecLink.tsx deleted file mode 100644 index ce4963c2d..000000000 --- a/dashboard/packages/ui/components/Drawer/DrawerThreadSpecLink.tsx +++ /dev/null @@ -1,11 +0,0 @@ -interface DrawerThreadSpecLinkProps { - name:string - onClick: (thread:string) => void - label: string | undefined -} -export function DrawerThreadSpecLink({ name, onClick, label }:DrawerThreadSpecLinkProps) { - return
{ onClick(name) }}> - link -

{label}

-
-} diff --git a/dashboard/packages/ui/components/Drawer/index.ts b/dashboard/packages/ui/components/Drawer/index.ts deleted file mode 100644 index f5fd80e3a..000000000 --- a/dashboard/packages/ui/components/Drawer/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { DrawerSection } from './DrawerSection' -export { DrawerHeader } from './DrawerHeader' -export { DrawerLink } from './DrawerLink' -export { DrawerThreadSpecLink } from './DrawerThreadSpecLink' diff --git a/dashboard/packages/ui/components/HeaderBar.tsx b/dashboard/packages/ui/components/HeaderBar.tsx deleted file mode 100644 index 4f8299dbf..000000000 --- a/dashboard/packages/ui/components/HeaderBar.tsx +++ /dev/null @@ -1,9 +0,0 @@ -'use client' -interface HeaderBarProps { - children: React.ReactNode | React.ReactNode[] -} -export function HeaderBar({ children }:HeaderBarProps) { - return
- {children} -
-} diff --git a/dashboard/packages/ui/components/Input/Input.tsx b/dashboard/packages/ui/components/Input/Input.tsx deleted file mode 100644 index 970e1be56..000000000 --- a/dashboard/packages/ui/components/Input/Input.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export interface InputProps extends React.InputHTMLAttributes { - icon:string -} - -export function Input(props: InputProps) { - return
{props.icon} - -
-} diff --git a/dashboard/packages/ui/components/Input/_input.scss b/dashboard/packages/ui/components/Input/_input.scss deleted file mode 100644 index ad445f0f5..000000000 --- a/dashboard/packages/ui/components/Input/_input.scss +++ /dev/null @@ -1,38 +0,0 @@ -.input-canvas{ - position: relative; - width: 100%; - img{ - position: absolute; - top: 8px; - left: 10px; - } - .input{ - display: flex; - min-width: 311px; - width: 100%; - height: 32px; - padding: 10px; - align-items: center; - gap: 10px; - flex-shrink: 0; - - border-radius: 4px; - border: 1px solid #4B5058; - background: #363A41; - box-sizing: border-box; - outline: none; - - color: #EDEEF0; - text-align: left; - font-size: 14px; - font-family: "Inter"; - - &::placeholder{ - color: #BDBDBD; - } - - &.icon{ - padding-left: 40px; - } - } -} diff --git a/dashboard/packages/ui/components/Label/Label.tsx b/dashboard/packages/ui/components/Label/Label.tsx deleted file mode 100644 index f8fa003f0..000000000 --- a/dashboard/packages/ui/components/Label/Label.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export interface LabelProps { - children:React.ReactNode -} - -export function Label({ children }: LabelProps) { - return
- {children} -
-} diff --git a/dashboard/packages/ui/components/Label/_label.scss b/dashboard/packages/ui/components/Label/_label.scss deleted file mode 100644 index c66fd1f5e..000000000 --- a/dashboard/packages/ui/components/Label/_label.scss +++ /dev/null @@ -1,10 +0,0 @@ -.label-canvas{ - - margin-left: 24px; - color: #FFF; - text-align: center; - font-size: 12px; - font-family: "Inter"; - display: flex; - align-items: center; -} diff --git a/dashboard/packages/ui/components/LoadMoreButton/LoadMoreButton.tsx b/dashboard/packages/ui/components/LoadMoreButton/LoadMoreButton.tsx deleted file mode 100644 index 2e7b122e9..000000000 --- a/dashboard/packages/ui/components/LoadMoreButton/LoadMoreButton.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import * as React from 'react' - - -interface ButtonProps extends React.ButtonHTMLAttributes { - loading?: boolean; - disabled?: boolean; - children: React.ReactNode; -} - -const LoadMoreButton: React.ForwardRefRenderFunction< -HTMLButtonElement, -ButtonProps -/* - eslint-disable-next-line react/function-component-definition - */ -> = ({ loading, disabled, children, ...props }: ButtonProps) => { - // return ; - return ( - - ) -} - -LoadMoreButton.displayName = 'LoadMoreButton' - -export default LoadMoreButton diff --git a/dashboard/packages/ui/components/LoadMoreButton/_load_more_button.scss b/dashboard/packages/ui/components/LoadMoreButton/_load_more_button.scss deleted file mode 100644 index 648beeb7e..000000000 --- a/dashboard/packages/ui/components/LoadMoreButton/_load_more_button.scss +++ /dev/null @@ -1,50 +0,0 @@ -.load_more_btn{ - display: inline-flex; -height: 32px; -padding: 16px; -align-items: center; -gap: 4px; -flex-shrink: 0; - -border-radius: 4px; -border: 1px solid var(--color-primary, #7F7AFF); - -color: var(--color-primary, #7F7AFF); -text-align: center; -font-size: 14px; -font-family: Inter; -font-weight: 600; -background: transparent; -cursor: pointer; - - &:disabled, &.disabled, &.disabled:hover{ - cursor: default; - border-radius: 4px ; - border: 1px solid var(--color-gray, #4D5461) !important; - background: transparent !important; - color: var(--color-gray, #4D5461) !important; - text-align: center; - font-size: 14px; - font-family: "Inter"; - font-weight: 600; - img{ - filter: grayscale(100%) opacity(50%) !important; - } - } -&:hover{ - border-radius: 4px; - border: 1px solid var(--color-primary-light, #AAA7FF); - background: var(--color-primary, #7F7AFF); - - color: var(--color-bright-light, #EDEEF0); - text-align: center; - font-size: 14px; - font-family: Inter; - font-weight: 600; - - img{ - filter: brightness(5) ; - } - -} -} diff --git a/dashboard/packages/ui/components/LoadMoreButton/index.tsx b/dashboard/packages/ui/components/LoadMoreButton/index.tsx deleted file mode 100644 index fcd3a42be..000000000 --- a/dashboard/packages/ui/components/LoadMoreButton/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default as LoadMoreButton } from './LoadMoreButton' diff --git a/dashboard/packages/ui/components/Loader.tsx b/dashboard/packages/ui/components/Loader.tsx deleted file mode 100644 index b6fa16a50..000000000 --- a/dashboard/packages/ui/components/Loader.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export function Loader() { - return ( -
- Loading... -
- ); -} diff --git a/dashboard/packages/ui/components/Loading.tsx b/dashboard/packages/ui/components/Loading.tsx deleted file mode 100644 index 5d3561d81..000000000 --- a/dashboard/packages/ui/components/Loading.tsx +++ /dev/null @@ -1,19 +0,0 @@ -interface LoadingProps { - className?: string; - style?: any; -} - -export function Loading({ - style -}: LoadingProps) { - return
Loading ...
- // return (
- //
- // Loading - // - // {/* Loading... */} - //
- //
); -} - -export default Loading diff --git a/dashboard/packages/ui/components/PerPage/PerPage.tsx b/dashboard/packages/ui/components/PerPage/PerPage.tsx deleted file mode 100644 index e49578b5a..000000000 --- a/dashboard/packages/ui/components/PerPage/PerPage.tsx +++ /dev/null @@ -1,35 +0,0 @@ -'use client' - -import { useState, useRef } from 'react' -import { useOutsideClick } from '../../utils' - -export interface PerPageProps { - icon:string - values:number[] - value:number - onChange: (v:number) => void -} - -export function PerPage(props: PerPageProps) { - const [ open, setOpen ] = useState(false) - - const setValue = (v:number) => { - props.onChange(v) - setOpen(false) - } - - const handleOutsideClick = () => { - setOpen(false) - } - - const ancestorRef = useRef(null) - const ref = useOutsideClick(handleOutsideClick, ancestorRef) - - return
- {props.icon} - { setOpen(prev => !prev) }} readOnly value={props.value} /> - {open ?
- {props.values.map( v =>
{ setValue(v) }} >{v}
)} -
: undefined} -
-} diff --git a/dashboard/packages/ui/components/PerPage/_per_page.scss b/dashboard/packages/ui/components/PerPage/_per_page.scss deleted file mode 100644 index 3e720f6b8..000000000 --- a/dashboard/packages/ui/components/PerPage/_per_page.scss +++ /dev/null @@ -1,62 +0,0 @@ -.perpage-canvas{ - position: relative; - img{ - position: absolute; - top: 13px; - right: 10px; - user-select: none; - pointer-events: none; - } - .input{ - user-select: none; - cursor: pointer; - display: flex; - width: 67px; - height: 32px; - padding: 10px; - align-items: center; - gap: 10px; - flex-shrink: 0; - - border-radius: 4px; - border: 1px solid #4B5058; - background: #363A41; - box-sizing: border-box; - outline: none; - - color: #EDEEF0; - text-align: left; - font-size: 14px; - font-family: "Inter"; - - &::placeholder{ - color: #BDBDBD; - } - - &.icon{ - padding-right: 30px; - } - - } - .options{ - min-width: 100px; - position: absolute; - border-radius: 4px; - background: var(--color-gray-blue, #394150); - top:-163px; - background: var(--color-gray-blue, #394150); - overflow: hidden; - div{ - cursor: pointer; - color: #FFF; - font-size: 14px; - font-family: "Inter"; - font-weight: 500; - line-height: 16px; - padding: 8px 12px; - &:hover{ - background: var(--color-gray, #4D5461); - } - } - } -} diff --git a/dashboard/packages/ui/components/Titles/H1/H1.tsx b/dashboard/packages/ui/components/Titles/H1/H1.tsx deleted file mode 100644 index 9b3363994..000000000 --- a/dashboard/packages/ui/components/Titles/H1/H1.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' - -export type Props = React.HTMLAttributes - -function H1({ children, ...props }: Props) { - return

{children}

-} - -export default H1 diff --git a/dashboard/packages/ui/components/Titles/H1/index.tsx b/dashboard/packages/ui/components/Titles/H1/index.tsx deleted file mode 100644 index 52b3ef1c3..000000000 --- a/dashboard/packages/ui/components/Titles/H1/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default as H1, type Props as H1Props } from './H1' diff --git a/dashboard/packages/ui/components/Titles/H2/H2.tsx b/dashboard/packages/ui/components/Titles/H2/H2.tsx deleted file mode 100644 index 2b1319a82..000000000 --- a/dashboard/packages/ui/components/Titles/H2/H2.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' - -export type Props = React.HTMLAttributes - -function H2({ children, ...props }: Props) { - return

{children}

-} - -export default H2 diff --git a/dashboard/packages/ui/components/Titles/H2/index.tsx b/dashboard/packages/ui/components/Titles/H2/index.tsx deleted file mode 100644 index 8483bcf45..000000000 --- a/dashboard/packages/ui/components/Titles/H2/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default as H2, type Props as H2Props } from './H2' diff --git a/dashboard/packages/ui/components/Titles/H3/H3.tsx b/dashboard/packages/ui/components/Titles/H3/H3.tsx deleted file mode 100644 index 421c7ad99..000000000 --- a/dashboard/packages/ui/components/Titles/H3/H3.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' - -export type Props = React.HTMLAttributes - -function H3({ children, ...props }: Props) { - return

{children}

-} - -export default H3 diff --git a/dashboard/packages/ui/components/Titles/H3/index.tsx b/dashboard/packages/ui/components/Titles/H3/index.tsx deleted file mode 100644 index 9fb033b81..000000000 --- a/dashboard/packages/ui/components/Titles/H3/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default as H3, type Props as H3Props } from './H3' diff --git a/dashboard/packages/ui/components/Titles/H4/H4.tsx b/dashboard/packages/ui/components/Titles/H4/H4.tsx deleted file mode 100644 index 073103dfd..000000000 --- a/dashboard/packages/ui/components/Titles/H4/H4.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' - -export type Props = React.HTMLAttributes - -function H4({ children, ...props }: Props) { - return

{children}

-} - -export default H4 diff --git a/dashboard/packages/ui/components/Titles/H4/index.tsx b/dashboard/packages/ui/components/Titles/H4/index.tsx deleted file mode 100644 index 56ba45470..000000000 --- a/dashboard/packages/ui/components/Titles/H4/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default as H4, type Props as H4Props } from './H4' diff --git a/dashboard/packages/ui/components/Titles/H5/H5.tsx b/dashboard/packages/ui/components/Titles/H5/H5.tsx deleted file mode 100644 index 06ea01d41..000000000 --- a/dashboard/packages/ui/components/Titles/H5/H5.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' - -export type Props = React.HTMLAttributes - -function H5({ children, ...props }: Props) { - return
{children}
-} - -export default H5 diff --git a/dashboard/packages/ui/components/Titles/H5/index.tsx b/dashboard/packages/ui/components/Titles/H5/index.tsx deleted file mode 100644 index 106c4e67e..000000000 --- a/dashboard/packages/ui/components/Titles/H5/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default as H5, type Props as H5Props } from './H5' diff --git a/dashboard/packages/ui/components/Titles/index.ts b/dashboard/packages/ui/components/Titles/index.ts deleted file mode 100644 index 73a4cc980..000000000 --- a/dashboard/packages/ui/components/Titles/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { H1, type H1Props } from './H1' -export { H2, type H2Props } from './H2' -export { H3, type H3Props } from './H3' -export { H4, type H4Props } from './H4' -export { H5, type H5Props } from './H5' diff --git a/dashboard/packages/ui/index.tsx b/dashboard/packages/ui/index.tsx deleted file mode 100644 index b33b77a4e..000000000 --- a/dashboard/packages/ui/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -// component exports -export * from './Header' - -export { Button, type ButtonProps } from './components/Button' -export { Input } from './components/Input/Input' -export { Label } from './components/Label/Label' -export { PerPage } from './components/PerPage/PerPage' -export { LoadMoreButton } from './components/LoadMoreButton' -export { - H1, type H1Props, - H2, type H2Props, - H3, type H3Props, - H4, type H4Props, - H5, type H5Props -} from './components/Titles' - -export * from './components/Container' -export * from './components/Loader' -export * from './components/Loading' -export * from './components/HeaderBar' -export * from './components/Calendar' -export * from './components/Drawer' - - -export { useOutsideClick } from './utils/useOutsideClick' diff --git a/dashboard/packages/ui/package.json b/dashboard/packages/ui/package.json deleted file mode 100644 index b51bcacdd..000000000 --- a/dashboard/packages/ui/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "ui", - "version": "0.0.0", - "main": "./index.tsx", - "types": "./index.tsx", - "license": "MIT", - "scripts": { - "lint": "eslint \"**/*.ts*\"", - "generate:component": "turbo gen react-component" - }, - "devDependencies": { - "@types/react": "^18.2.0", - "@types/react-dom": "^18.2.0", - "eslint": "^8.53.0", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-config-custom": "workspace:*", - "react": "^17.0.2", - "tsconfig": "workspace:*", - "typescript": "^4.5.2" - }, - "dependencies": { - "moment": "^2.29.4", - "@turbo/gen": "^1.10.16" - } -} diff --git a/dashboard/packages/ui/styles.scss b/dashboard/packages/ui/styles.scss deleted file mode 100644 index 3d907cff6..000000000 --- a/dashboard/packages/ui/styles.scss +++ /dev/null @@ -1,308 +0,0 @@ -@import "./styles/variables"; -@import "./styles/login"; -@import "./styles/components"; -@import "./styles/table_scrollbar"; -@import "./styles/table_cell"; -@import "./styles/wf_extra_information"; -@import "./styles/react_flow_custom"; - - -$color-primary: #7F7AFF; - -html,body { - padding: 0px; - margin: 0px; - height: 100vh; - background: #242529; -} -h1{ - display: flex; - padding: 8px 16px; - gap: 10px; - width: 100%; - flex: 1; - - color: var(--color-bright-light, #EDEEF0); - font-size: 24px; - font-family: "Inter"; - font-weight: 700; - margin-bottom: 16px; - .line{ - font-weight: 600; - color: #9098A0 - } - .lighter{ - font-weight: 400; - } -} -h2{ - color: #EDEEF0; - font-size: 24px; - font-family: "Inter"; - font-weight: 600; - margin: 0; - padding: 0; - line-height: 24px; -} -h3{ - color: var(--color-bright-light, #EDEEF0); - font-size: 16px; - font-family: "Inter"; - font-weight: 700; - margin: 0px; -} -h4{ - color: var(--color-bright-light, #EDEEF0); - font-size: 14px; - font-family: "Inter"; - font-weight: normal; - margin: 0px; -} -.mt10{ - margin-top: 10px; -} -section{ - display: flex; - padding: 16px; - flex-direction: column; - gap: 16px; - align-self: stretch; - border-radius: 16px; - border: 1px solid var(--color-shadow-light, #3D4149); - background: var(--color-bg-linear-gradient, linear-gradient(180deg, #282B30 0%, #24272B 53.65%, #232529 100%)); - /* shadow-darkbox01 */ - box-shadow: 0px 27px 8px 0px rgba(0, 0, 0, 0.00), 0px 17px 7px 0px rgba(0, 0, 0, 0.01), 0px 10px 6px 0px rgba(0, 0, 0, 0.05), 0px 4px 4px 0px rgba(0, 0, 0, 0.09), 0px 1px 2px 0px rgba(0, 0, 0, 0.10), 0px 0px 0px 0px rgba(0, 0, 0, 0.10); - -} -article{ - display: flex; - padding: 16px; - flex-direction: column; - gap: 24px; - - border-radius: 8px; - border: 1px solid var(--color-shadow-light, #3D4149); - background: var(--color-bg-linear-gradient, linear-gradient(180deg, #282B30 0%, #24272B 53.65%, #232529 100%)); - - /* shadow-darkbox01 */ - box-shadow: 0px 27px 8px 0px rgba(0, 0, 0, 0.00), 0px 17px 7px 0px rgba(0, 0, 0, 0.01), 0px 10px 6px 0px rgba(0, 0, 0, 0.05), 0px 4px 4px 0px rgba(0, 0, 0, 0.09), 0px 1px 2px 0px rgba(0, 0, 0, 0.10), 0px 0px 0px 0px rgba(0, 0, 0, 0.10); - header{ - display: flex; - justify-content: space-between; - .article-title{ - flex-direction: column; - align-items: flex-start; - } - } - -} -.display-block{ - display: block; -} -.color-primary{ - color: $color-primary; -} -.mb-40{ - margin-bottom: 40px; -} -.between{ - display: flex; - flex: 1; - width: 100%; - justify-content: space-between; - align-items: center; -} -.end{ - display: flex; - flex: 1; - width: 100%; - justify-content: flex-end; - align-items: center; -} - -.flex{ - display: flex; -} -.flex-1{ - flex: 1 1 0%; -} -.items-center{ - align-items: center; -} -.justify-center{ - justify-content: center; -} -.text-center { - text-align: center !important; -} -.w-full { - width: 100% -} - -.color-mild-light{ - color: #9098A0; -} -.text-white{ - color: #fff; -} -.w-10 { - width: 2.5rem/* 40px */; -} -.h-10 { - height: 2.5rem/* 40px */; -} -.align-middle { - vertical-align: middle; -} -.capitalize { - text-transform: capitalize; -} - -.spinner{ - animation: spin 1s linear infinite; -} -@keyframes spin { - 0% { - transform: rotate(0deg); - } - - 100% { - transform: rotate(360deg); - } - } - -.table{ - - border: 1px solid var(--color-gray-blue, #394150); - border-radius: 9px; - background: linear-gradient(180deg, #282B30 0%, #24272B 53.65%, #232529 100%); - table{ - border-collapse: collapse; - width: 100%; - - } - /* shadow-darkbox01 */ - box-shadow: 0px 27px 8px 0px rgba(0, 0, 0, 0.00), 0px 17px 7px 0px rgba(0, 0, 0, 0.01), 0px 10px 6px 0px rgba(0, 0, 0, 0.05), 0px 4px 4px 0px rgba(0, 0, 0, 0.09), 0px 1px 2px 0px rgba(0, 0, 0, 0.10), 0px 0px 0px 0px rgba(0, 0, 0, 0.10); - thead{ - overflow: hidden; - } - caption{ - display: flex; - padding: 16px 12px; - justify-content: center; - align-items: center; - gap: 12px; - flex: 1 0 0; - align-self: stretch; - background: var(--color-shadow-light-3, #2D2F36); - } - th{ - padding: 16px; - color: #EDEEF0; - text-align: left; - font-size: 12px; - font-family: "Inter"; - font-weight: 600; - background: #363A41; - } - tbody{ - // height: 500px; - - display: flex; - flex-direction: column; - width: 100%; - - &.scrollbar { - overflow-y: scroll; - } - tr{ - border-bottom: 1px solid var(--color-gray-blue, #394150); - } - tr:hover{ - background: #373554; - } - } - td{ - color: var(--color-bright-light, #EDEEF0); - font-size: 16px; - font-family: "Inter"; - padding: 16px 12px; - height: 51px; - box-sizing: border-box; - width: 100%; - a{ - color: var(--color-primary, #7F7AFF); - text-decoration: none; - } - } - td:first-child, th:first-child{ - padding-left: 28px; - } - td:last-child, th:last-child{ - padding-right: 28px; - } -} -.breadcrumb{ - font-family: "Inter"; - font-size: 14px; - font-weight: 400; - line-height: 17px; - letter-spacing: 0em; - text-align: left; - margin-top: -35px; - margin-bottom: 16px; - padding: 0px 16px; - .link, a{ - color: var(--color-primary, #7F7AFF); - text-decoration: none; - } - -} - - -.version_select{ - position: relative; - select{ - cursor: pointer; - display: flex; - min-width: 60px; - height: 32px; - padding-left: 15px; - padding-right: 35px; - justify-content: center; - align-items: center; - text-align: center; - appearance: none; - border-radius: 4px; - border: 1px solid var(--color-gray, #4D5461); - background: var(--color-bg-dark, #242529); - color: #FFF; - text-align: center; - font-size: 14px; - font-family: "Inter"; - } - img{ - position: absolute; - top:12px; - right: 10px; - } - -} - -.bcrumb{ - display: flex; - gap:5px; - color:"#EDEEF0"; - font-family: "Inter"; - font-size: 14px; - font-style: normal; - font-weight: 400; - line-height: normal; - .kind{ - text-transform: capitalize; - } - a{ - color: var(--color-primary, #7F7AFF); - text-decoration: none; - } -} diff --git a/dashboard/packages/ui/styles/_components.scss b/dashboard/packages/ui/styles/_components.scss deleted file mode 100644 index 9f15dd010..000000000 --- a/dashboard/packages/ui/styles/_components.scss +++ /dev/null @@ -1,107 +0,0 @@ -@import "../components/Calendar/calendar"; -@import "../components/Button/button"; -@import "../components/LoadMoreButton/load_more_button"; -@import "./scrollbar"; -@import "./visualizer"; -@import "./drawer"; -@import "../components/Input/input"; -@import "../components/PerPage/per_page"; -@import "../components/Label/label"; - -.container{ - min-width: 1200px; //TMP - margin: auto; - color: var(--color-bright-light, #EDEEF0); - font-family: "Inter"; - width: 1440px; // TMP - padding: 24px 36px; - flex-direction: column; - // align-items: center; - gap: 24px; - display: flex; -} - -.header-bar{ - width: 1440px; //TMP - min-width: 1200px; //TMP - margin-left: auto; - margin-right: auto; - display: flex; - padding: 0px 36px; - height: 56px; - justify-content: space-between; - align-items: center; - align-self: stretch; - border-bottom: 1px solid var(--color-shadow-light, #3D4149); - .login-dropdown{ - position: relative; - .login-dropdown__btn{ - cursor: pointer; - height: 40px; - display: flex; - padding: 0px 12px; - align-items: center; - gap: 12px; - border-radius: 4px; - color: var(--color-bright-light, #EDEEF0); - font-size: 14px; - font-family: "Inter"; - font-weight: 500; - border: 1px solid transparent; - .avatar{ - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; - color: #FFF; - font-size: 10px; - font-family: "Inter"; - font-weight: 700; - text-transform: uppercase; - border-radius: 100%; - border-radius: 24px; - background: var(--color-primary, #7F7AFF); - width: 24px; - height: 24px; - img{ - width: 24px; - height: 24px; - } - } - - &.active{ - border-radius: 4px; - border: 1px solid var(--color-gray, #4D5461); - background: var(--color-ghost-light, #363A41); - } - } - .login-dropdown__dd{ - position: absolute; - background: var(--color-gray-blue, #394150); - top:45px; - height: 40px; - right: 0; - display: flex; - align-items: center; - - button{ - text-align: left; - padding: 8px 12px; - width: 146px; - height: 32px; - border: none; - color: #FFF; - font-size: 14px; - font-family: Inter; - font-weight: 500; - line-height: 16px; - cursor: pointer; - background: var(--color-gray-blue, #394150); - &:hover{ - background: lighten(#394150,5); - } - } - } - } - -} diff --git a/dashboard/packages/ui/styles/_drawer.scss b/dashboard/packages/ui/styles/_drawer.scss deleted file mode 100644 index c7e0c9228..000000000 --- a/dashboard/packages/ui/styles/_drawer.scss +++ /dev/null @@ -1,770 +0,0 @@ -.drawer { - width: 408px; - height: 953px; - padding: 16px 8px 16px 16px; - align-items: flex-start; - display: flex; - flex-direction: column; - gap: 12px; - align-self: stretch; - - .simpleValue__container{ - padding: 12px 0px; - } - .simpleValue{ - color: #FFF; - text-align: center; - font-family: "Inter"; - font-size: 12px; - font-style: normal; - font-weight: 400; - line-height: normal; - } - - - &__header { - display: flex; - align-items: center; - margin-left: 0.5rem; - gap: 0.5rem; - - &__button { - margin: 0; - background: none; - color: inherit; - border: none; - padding: 0; - font: inherit; - cursor: pointer; - outline: inherit; - } - } - - p { - margin: 0; - } - &__threadData{ - font-family: "Inter"; - font-size: 14px; - font-weight: 600; - line-height: 17px; - letter-spacing: 0em; - text-align: left; - color: white; - - border: 1px solid #4b5058; - border-radius: 4px; - width: 100%; - padding: 12px; - background: #4b5058; - - } - &__threadSelector { - &__container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - gap: 24px; - - &__select { - font-family: "Inter"; - font-size: 14px; - font-weight: 600; - line-height: 17px; - letter-spacing: 0em; - text-align: left; - color: white; - - border: 1px solid #4b5058; - border-radius: 4px; - width: 100%; - padding: 12px; - - -moz-appearance: none; - -webkit-appearance: none; - appearance: none; - background: #4b5058 - url("data:image/svg+xml;utf8,") - no-repeat; - background-position: right 5px top 50%; - } - } - } - - .drawer-component { - width: 100%; - display: flex; - flex-direction: column; - gap: 0.75rem; - border-radius: 8px; - } - - .component-header { - margin: auto; - display: flex; - padding: 0.625rem; - gap: 0.625rem; - align-items: center; - font-size: 14px; - - &__subheader { - color: #9098a0; - font-weight: 400; - height: 15px; - font-size: 12px; - } - } - - &__threadSelector { - display: flex; - flex-direction: column; - padding: 1rem; - gap: 0.75rem; - border: 1px solid #363a41; - border-radius: 8px; - - &__header { - font-family: Inter; - font-size: 10px; - font-weight: 400; - line-height: 12px; - letter-spacing: 0em; - text-align: left; - } - - &__selector { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - gap: 24px; - - &__label { - font-style: normal; - font-weight: 400; - font-size: 12px; - line-height: 15px; - text-align: center; - color: #edeef0; - } - } - } - - &__mainTable { - border: 1px solid #363a41; - border-radius: 8px; - - &__header { - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - text-align: center; - padding: 0.75rem; - border-top-left-radius: 7px; - border-top-right-radius: 7px; - font-size: 14px; - //line-height: 17px; - - &__subheaders { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - align-items: center; - background: #2d2f36; - color: #9098a0; - font-size: 10px; - } - &__subheaders-three-columns { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - align-items: center; - background: #2d2f36; - font-size: 10px; - color: #9098a0; - } - } - &__clickable { - color: #7f7aff; - gap: 0.75rem; - cursor: pointer; - } - .json-text-collapsed { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - } - - .grid-2 { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - align-items: center; - font-size: 12px; - } - - .grid-3 { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - font-size: 12px; - } - - .grid-4 { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - align-items: center; - font-size: 12px; - } - - &__task { - &__table { - display: flex; - flex-direction: column; - border: 1px solid #363a41; - border-radius: 8px; - - &__header { - text-align: center; - padding: 0.75rem; - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - font-size: 14px; - - &__subheaders { - background: #2d2f36; - color: #9098a0; - font-size: 10px; - } - &__bodytable { - background: #2d2f36; - font-size: 10px; - } - } - } - - &__wfrun-inputs { - display: flex; - flex-direction: column; - border: 1px solid #363a41; - border-radius: 8px; - - &__label { - padding: 0.75rem; - text-align: center; - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - } - - &__header { - background: #2d2f36; - align-items: center; - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - align-items: center; - } - } - - - &__wfrun-outputs { - display: flex; - flex-direction: column; - border: 1px solid #363a41; - border-radius: 8px; - font-size: 14px; - - &__label { - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - text-align: center; - padding: 0.75rem; - } - - &__header { - align-items: center; - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - background: #2d2f36; - color: #9098a0; - font-size: 10px; - - &__one-column { - grid-template-columns: repeat(1, minmax(0, 1fr)); - } - } - - &__log-message { - word-break: break-all; - } - } - - &__link { - border: 1px solid #363a41; - border-radius: 8px; - display: flex; - flex-direction: column; - - &__no-border { - border: none; - } - - &__title { - display: flex; - justify-content: center; - border-top-left-radius: 7px; - border-top-right-radius: 7px; - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - text-align: center; - padding: 0.75rem; - font-size: 14px; - } - - &__container { - margin: auto; - - &__clickable { - display: flex; - align-items: center; - gap: 0.75rem; - cursor: pointer; - padding: 0.75rem; - - &__text { - color: #7f7aff; - font-size: 14px; - } - - &__text:hover { - color: #7f7aff; - } - - &__text:visited { - color: #7f7aff; - } - } - } - } - } - - &__nodeData { - border: 1px solid #363a41; - border-radius: 8px; - display: flex; - flex-direction: column; - - &__label { - padding: 0.75rem; - text-align: center; - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - font-size: 14px; - } - - &__header { - background-color: #2d2f36; - border-bottom: 1px solid #3d4149; - text-align: center; - padding: 0.75rem; - color: #9098a0; - font-size: 10px; - } - - &__headerSimple { - background-color: #2d2f36; - text-align: center; - padding: 0.75rem; - color: #9098a0; - } - - &__data { - grid-column: span 2 / span 2; - border-bottom: 1px solid #3d4149; - text-align: center; - padding: 0.75rem; - display: flex; - justify-content: center; - align-items: center; - font-size: 12px; - } - - &__dataSimple { - grid-column: span 2 / span 2; - text-align: center; - padding: 0.75rem; - } - } - - &__externalEvent { - &__table { - display: flex; - flex-direction: column; - border: 1px solid #363a41; - border-radius: 8px; - - &__header { - text-align: center; - padding: 0.75rem; - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - font-size: 14px; - - &__subheaders { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - align-items: center; - background: #2d2f36; - color: #9098a0; - font-size: 10px; - } - } - } - } - - &__nop { - &__table { - display: flex; - flex-direction: column; - border: 1px solid #363a41; - border-radius: 8px; - - &__header { - text-align: center; - padding: 0.75rem; - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - font-size: 14px; - - &__subheaders { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - align-items: center; - background: #2d2f36; - color: #9098a0; - font-size: 10px; - } - } - } - } - - &__startThread { - &__wfrun { - &__table { - border: 1px solid #363a41; - border-radius: 8px; - display: flex; - flex-direction: column; - - &__header { - text-align: center; - padding: 0.75rem; - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - font-size: 14px; - - &__subheaders { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - align-items: center; - background: #2d2f36; - } - } - - &__link { - color: #7f7aff; - } - - &__link:hover { - color: #7f7aff; - } - - &__link:visited { - color: #7f7aff; - } - } - } - - &__link { - border: 1px solid #363a41; - border-radius: 8px; - display: flex; - flex-direction: column; - - &__title { - text-align: center; - padding: 0.75rem; - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - font-size: 14px; - } - - &__container { - margin: auto; - - &__clickable { - display: flex; - align-items: center; - gap: 0.75rem; - cursor: pointer; - padding: 0.75rem; - - &__text { - color: #7f7aff; - font-size: 14px; - } - - &__text:hover { - color: #7f7aff; - } - - &__text:visited { - color: #7f7aff; - } - } - } - } - } - - &__waitChild { - &__wfrun { - background-color: red; - - &__link { - border: 1px solid #363a41; - border-radius: 8px; - display: flex; - flex-direction: column; - - &__title { - text-align: center; - padding: 0.75rem; - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - } - - &__container { - grid-column: span 2 / span 2; - display: flex; - align-items: center; - justify-content: center; - - &__text { - text-align: center; - cursor: pointer; - color: #7f7aff; - } - - &__text:hover { - color: #7f7aff; - } - - &__text:visited { - color: #7f7aff; - } - } - } - } - - &__link { - border: 1px solid #363a41; - border-radius: 8px; - display: flex; - flex-direction: column; - - &__title { - text-align: center; - padding: 0.75rem; - background: linear-gradient(0deg, #373554, #373554), - linear-gradient(0deg, #3d4149, #3d4149); - font-family: Inter, sans-serif; - font-weight: 600; - } - - &__container { - margin: auto; - - &__clickable { - display: flex; - align-items: center; - gap: 0.75rem; - cursor: pointer; - padding: 0.75rem; - - &__text { - color: #7f7aff; - } - - &__text:hover { - color: #7f7aff; - } - - &__text:visited { - color: #7f7aff; - } - } - } - } - } - - .center { - word-break: break-all; - text-align: center; - padding: 0.75rem; - display: flex; - align-items: center; - justify-content: center; - } -} - -.task_attempts{ - display: flex; - padding: 8px; - flex-direction: column; - align-items: flex-start; - gap: 12px; - align-self: stretch; - border-radius: 8px; - border: 1px solid #3D4149; - margin-bottom: 16px; - .title{ - display: flex; - padding: 4px 0px; - align-items: flex-start; - color: #EDEEF0; - font-family: "Inter"; - font-size: 10px; - font-style: normal; - font-weight: 400; - line-height: normal; - text-transform: uppercase; - } - .selector{ - gap:4px; - display: flex; - width: 100%; - .icon{ - display: flex; - padding: 4px 8px; - align-items: center; - border-radius: 4px; - border: 1px solid #4B5058; - background: #363A41; - } - .version_select{ - flex:1; - border-radius: 4px; - border: 1px solid #4B5058; - background: #363A41; - display: flex; - select{ - height: 32px; - flex: auto; - text-align: left; - background: #4b5058 - url("data:image/svg+xml;utf8,") - no-repeat; - background-position: right 5px top 50%; - } - img{ - position: absolute; - } - } - } -} -.drawer-section{ - border-radius: 8px; - border: 1px solid #3D4149; - margin-bottom: 16px; - overflow: hidden; - &>.title{ - display: flex; - padding: 12px; - justify-content: center; - align-items: center; - align-self: stretch; - border: 1px solid #3D4149; - background: #373554; - color: var(--color-brightLight, #EDEEF0); - font-family: "Inter"; - font-size: 14px; - font-style: normal; - font-weight: 600; - line-height: normal; - } - .drawer-link{ - color: var(--color-primary, #7F7AFF); - font-family: "Inter"; - font-size: 14px; - font-style: normal; - font-weight: 600; - line-height: normal; - text-decoration: none; - display: flex; - gap: 12px; - padding: 12px; - justify-content: center; - align-items: center; - cursor: pointer; - border-bottom: 1px solid #3D4149; - &:last-child{ - border-bottom: none - } - - - } - table{ - border-collapse: collapse; - width: 100%; - thead{ - background: var(--color-shadowLight3, #2D2F36); - th{ - padding: 12px; - color: var(--color-mildLight, #9098A0); - text-align: center; - font-family: "Inter"; - font-size: 10px; - font-style: normal; - font-weight: 400; - line-height: normal; - text-transform: uppercase; - } - } - tbody{ - td{ - color: var(--color-brightLight, #EDEEF0); - font-family: "Inter"; - font-size: 12px; - font-style: normal; - font-weight: 400; - line-height: normal; - padding: 12px; - border-bottom: 1px solid #3D4149; - text-align: center; - } - tr:last-child{ - td{ - border-bottom: none; - } - } - } - } -} diff --git a/dashboard/packages/ui/styles/_login.scss b/dashboard/packages/ui/styles/_login.scss deleted file mode 100644 index d79236685..000000000 --- a/dashboard/packages/ui/styles/_login.scss +++ /dev/null @@ -1,77 +0,0 @@ -.login{ - width: 100vw; - height: 100vh; - overflow: hidden; - display: flex; -} -.login_horse{ - background-image: url('/handsome-horse.png'); - background-position: center center; - background-size: cover; - width: 50vw; -} -.login_form{ - width: 50vw; - min-width: 300px; - overflow: auto; - padding: 53px; - margin-left: auto; - margin-right: auto; - display: flex; - flex-direction: column; - justify-content: space-between; - img{ - width: 218px; - margin-right: 0; - margin-left: auto; - } - form{ - // margin-right: 141px; - // margin-left: 141px; - margin-right: auto; - margin-left: auto; - color: white; - min-width: 300px; - width: 100%; - max-width: 400px; - .title{ - color: #EDEEF0; - text-shadow: 0px 0px 6px 0px rgba(127, 122, 255, 0.25); - font-size: 48px; - font-family: 'Inter', sans-serif; - font-weight: 700; - } - .login-button{ - border: none; - cursor: pointer; - height: 64px; - padding: 16px 24px 16px 16px; - align-items: center; - justify-content: center; - width: 100%; - border-radius: 8px; - background: var(--color-primary, #7F7AFF); - display: flex; - gap:17px; - color: #FFF; - font-size: 20px; - font-family: 'Inter', sans-serif; - font-weight: 500; - margin-bottom: 20px; - - img{ - width: 22px; - height: 12px; - } - } - } - .legals{ - color: #EDEEF0; - text-align: center; - font-size: 16px; - font-family: 'Inter', sans-serif; - margin-bottom: -21px; - - } - -} diff --git a/dashboard/packages/ui/styles/_react_flow_custom.scss b/dashboard/packages/ui/styles/_react_flow_custom.scss deleted file mode 100644 index 2dd25a100..000000000 --- a/dashboard/packages/ui/styles/_react_flow_custom.scss +++ /dev/null @@ -1,7 +0,0 @@ -.react-flow__handle { - opacity: 0; - } - -.react__edge-label { - min-width: 200px; -} diff --git a/dashboard/packages/ui/styles/_scrollbar.scss b/dashboard/packages/ui/styles/_scrollbar.scss deleted file mode 100644 index 722fe7493..000000000 --- a/dashboard/packages/ui/styles/_scrollbar.scss +++ /dev/null @@ -1,26 +0,0 @@ -.scrollBar{ - padding: 4px; - border-radius: 32px; - background: var(--color-ghost-light, #363A41); -} -.scrollBar__Canvas{ - position:relative; - height: 10px; - -} -.scrollBar__Track{ - position:absolute; - min-width: 20px; - height: 20px; - top:-4px; - left: 0; - right: 0; -} -.scrollBar__Thumb{ - position:absolute; - min-width: 20px; - height: 10px; - - border-radius: 16px; - background: var(--color-primary, #7F7AFF); -} diff --git a/dashboard/packages/ui/styles/_table_cell.scss b/dashboard/packages/ui/styles/_table_cell.scss deleted file mode 100644 index 7968d584e..000000000 --- a/dashboard/packages/ui/styles/_table_cell.scss +++ /dev/null @@ -1,28 +0,0 @@ -table tbody tr td { - &.th { - color: var(--color-mild-light, #9098A0); - font-size: 10px; - font-family: "Inter"; - font-weight: 500; - text-align: center; - background: #363A41; - height: auto; - } - - &.message { - white-space: pre-line; - height: auto; - } - - button { - border: none; - background-color: transparent; - font-family: Inter; - font-size: 12px; - font-weight: 700; - line-height: 15px; - letter-spacing: 0em; - text-align: center; - } - -} diff --git a/dashboard/packages/ui/styles/_table_scrollbar.scss b/dashboard/packages/ui/styles/_table_scrollbar.scss deleted file mode 100644 index e57fce3af..000000000 --- a/dashboard/packages/ui/styles/_table_scrollbar.scss +++ /dev/null @@ -1,30 +0,0 @@ -.scrollbar { - &:not(tbody) { - overflow-y: scroll; - } - - &::-webkit-scrollbar { - width: 16px; - } - - &::-webkit-scrollbar-track { - background-color: transparent; - border-radius: 9999px; - margin: 16px; - } - - &::-webkit-scrollbar-thumb { - background: var(--color-gray, #4d5461); - border-radius: 9999px; - border: 4px solid transparent; - background-clip: content-box; - } - - &::-webkit-scrollbar-corner { - background: transparent; - } -} - -.no-scrollbar { - overflow-y: hidden; -} diff --git a/dashboard/packages/ui/styles/_variables.scss b/dashboard/packages/ui/styles/_variables.scss deleted file mode 100644 index a93f5b9aa..000000000 --- a/dashboard/packages/ui/styles/_variables.scss +++ /dev/null @@ -1,7 +0,0 @@ -:root{ - --color-shadow-light: #3D4149; - --color-bright-light: #EDEEF0; - --color-primary: #7F7AFF; - --color-ghost-light: #363A41; - --color-gray: #4D5461; -} diff --git a/dashboard/packages/ui/styles/_visualizer.scss b/dashboard/packages/ui/styles/_visualizer.scss deleted file mode 100644 index 17e7eb4d6..000000000 --- a/dashboard/packages/ui/styles/_visualizer.scss +++ /dev/null @@ -1,127 +0,0 @@ -.visualizer { - display: flex; - overflow: hidden; - border-radius: 16px; - border: 1px solid #363a41; - background: linear-gradient(180deg, #282b30 0%, #24272b 53.65%, #232529 100%); - - /* shadow-darkbox01 */ - box-shadow: 0px 27px 8px 0px rgba(0, 0, 0, 0), - 0px 17px 7px 0px rgba(0, 0, 0, 0.01), 0px 10px 6px 0px rgba(0, 0, 0, 0.05), - 0px 4px 4px 0px rgba(0, 0, 0, 0.09), 0px 1px 2px 0px rgba(0, 0, 0, 0.1), - 0px 0px 0px 0px rgba(0, 0, 0, 0.1); - .canvas { - background: #1d1e26; - overflow: auto; - flex: 1 0 0; - align-self: stretch; - width: 633px; - height: 953px; - } - - .viznode-canvas { - // background: #1d1e26; - // width: 200px; - // border: 1px solid #3D4149; - display: flex; - align-items: flex-start; - justify-content: center; - flex: 1; - .ring { - background: #1d1e26; - padding: 5px; - padding-top: 0px; - } - .opacity50{ - opacity: .35; - } - .node { - cursor: pointer; - display: inline-flex; - padding: 12px; - justify-content: center; - align-items: center; - gap: 8px; - flex-shrink: 0; - border-radius: 8px; - border: 1px solid var(--color-shadow-light, #3d4149); - background: var(--color-ghost-light, #363a41); - // background: var(--color-ghost-light, #363A41); - // &:hover{ - // box-shadow: 0px 0px 10px 0px rgba(118, 118, 118, 0.50), 0px 0px 20px 0px rgba(255, 255, 255, 0.25); - // } - - color: var(--color-bright-light, #edeef0); - font-family: "Inter"; - font-size: 14px; - font-style: normal; - font-weight: 600; - line-height: normal; - - transition: all ease-in 0.1s; - - &.selected-node { - border: 1px solid var(--color-bright-light, #edeef0); - box-shadow: 0px 0px 10px 0px rgba(118, 118, 118, 0.5), - 0px 0px 20px 0px rgba(255, 255, 255, 0.25); - } - - // START: If you change the values here, the values on _visualizer.scss should be adjusted as well. - &.tENTRYPOINT { - border-radius: 64px; - border: 1px solid var(--color-information, #007aff); - background: rgba(0, 122, 255, 0.2); - } - - &.tTASK{ - width: 250px; - } - - &.tEXIT { - width: 200px; - border-radius: 64px; - border: 1px solid var(--color-success, #34c759); - background: rgba(52, 199, 89, 0.2); - } - - &.tNOP { - width: 200px; - flex-direction: column; - gap: 0px; - } - - &.tSTART_THREAD { - width: 200px; - } - - &.tWAIT_FOR_THREADS { - width: 84px; - } - - &.tEXTERNAL_EVENT { - width: 200px; - } - - &.tSLEEP { - width: 200px; - } - - &.tSTART_MULTIPLE_THREADS { - width: 200px; - } - - &.tUSER_TASK { - width: 250px; - } - - // END - - } - } -} - -.custom-smart-edge { - &__label { - max-width: 200px; - } -} diff --git a/dashboard/packages/ui/styles/_wf_extra_information.scss b/dashboard/packages/ui/styles/_wf_extra_information.scss deleted file mode 100644 index a466c2a19..000000000 --- a/dashboard/packages/ui/styles/_wf_extra_information.scss +++ /dev/null @@ -1,20 +0,0 @@ -.pop-up-wfrun-information { - - display: flex; - flex-direction: column; - padding: 16px; - gap: 16px; - - .header { - display: inline-flex; - align-items: center; - gap: 20px; - padding: 8px 0; - } - - .snippet { - pre { - margin: 0; - } - } -} diff --git a/dashboard/packages/ui/tsconfig.json b/dashboard/packages/ui/tsconfig.json deleted file mode 100644 index cd6c94d6e..000000000 --- a/dashboard/packages/ui/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "tsconfig/react-library.json", - "include": ["."], - "exclude": ["dist", "build", "node_modules"] -} diff --git a/dashboard/packages/ui/turbo/generators/config.ts b/dashboard/packages/ui/turbo/generators/config.ts deleted file mode 100644 index 299a86172..000000000 --- a/dashboard/packages/ui/turbo/generators/config.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { PlopTypes } from '@turbo/gen' - -// Learn more about Turborepo Generators at https://turbo.build/repo/docs/core-concepts/monorepos/code-generation - -export default function generator(plop: PlopTypes.NodePlopAPI): void { - // A simple generator to add a new React component to the internal UI library - plop.setGenerator('react-component', { - description: 'Adds a new react component', - prompts: [ - { - type: 'input', - name: 'name', - message: 'What is the name of the component?', - }, - ], - actions: [ - { - type: 'add', - path: '{{pascalCase name}}.tsx', - templateFile: 'templates/component.hbs', - }, - { - type: 'append', - path: 'index.tsx', - pattern: /(\/\/ component exports)/g, - template: 'export * from "./{{pascalCase name}}";', - }, - ], - }) -} diff --git a/dashboard/packages/ui/turbo/generators/templates/component.hbs b/dashboard/packages/ui/turbo/generators/templates/component.hbs deleted file mode 100644 index cf7b6369c..000000000 --- a/dashboard/packages/ui/turbo/generators/templates/component.hbs +++ /dev/null @@ -1,14 +0,0 @@ -import * as React from "react"; - -interface Props { - children?: React.ReactNode; -} - -export const {{ pascalCase name }} = ({ children }: Props) => { - return ( -
-

{{ name }}

- {children} -
- ); -}; diff --git a/dashboard/packages/ui/utils/calendarUtils.tsx b/dashboard/packages/ui/utils/calendarUtils.tsx deleted file mode 100644 index b573f3b66..000000000 --- a/dashboard/packages/ui/utils/calendarUtils.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import moment from 'moment' - -export const getFirstDate = (date:Date, type:string, windows:number) => { - const dt = moment(date) - if (type==='DAYS_1') {return dt.subtract(windows,'days').toDate()} - if (type==='HOURS_2') {return dt.subtract(windows*2,'hours').toDate()} - if (type==='MINUTES_5') {return dt.subtract(windows*5,'minutes').toDate()} - return date -} diff --git a/dashboard/packages/ui/utils/index.ts b/dashboard/packages/ui/utils/index.ts deleted file mode 100644 index d9444511a..000000000 --- a/dashboard/packages/ui/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { useOutsideClick } from './useOutsideClick' -export { getFirstDate } from './calendarUtils' diff --git a/dashboard/packages/ui/utils/useOutsideClick.tsx b/dashboard/packages/ui/utils/useOutsideClick.tsx deleted file mode 100644 index cb81c4544..000000000 --- a/dashboard/packages/ui/utils/useOutsideClick.tsx +++ /dev/null @@ -1,35 +0,0 @@ -'use client' - -import { useEffect, useRef } from 'react' - -// this hook sets an alement with its ancenstor as an anchor to trigger a handler when the user clicks outside of it. -// the ancestor ref was created to avoid any loop if the component already has a handler. - -export const useOutsideClick = ( - callback: () => void, - ancestorRef: React.RefObject | null -): React.RefObject => { - const ref = useRef(null) - - const handleClick = (event: MouseEvent) => { - if ( - ref.current && - !ref.current.contains(event.target as Node) && - ancestorRef?.current && - !ancestorRef.current.contains(event.target as Node) - ) { - callback() - } - } - - useEffect(() => { - document.addEventListener('mousedown', handleClick) - return () => { - document.removeEventListener('mousedown', handleClick) - } - }, []) - - return ref -} - -export default useOutsideClick diff --git a/dashboard/pnpm-lock.yaml b/dashboard/pnpm-lock.yaml deleted file mode 100644 index 14dcd679d..000000000 --- a/dashboard/pnpm-lock.yaml +++ /dev/null @@ -1,7154 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - material-icons: - specifier: ^1.13.12 - version: 1.13.12 - devDependencies: - '@next/eslint-plugin-next': - specifier: ^12.3.4 - version: 12.3.4 - '@stylistic/eslint-plugin': - specifier: ^1.0.1 - version: 1.0.1(eslint@8.53.0)(typescript@4.9.5) - '@turbo/gen': - specifier: ^1.10.16 - version: 1.10.16(@types/node@17.0.45)(typescript@4.9.5) - '@types/jest': - specifier: 29.5.5 - version: 29.5.5 - '@typescript-eslint/eslint-plugin': - specifier: ^6.10.0 - version: 6.10.0(@typescript-eslint/parser@6.9.0)(eslint@8.53.0)(typescript@4.9.5) - '@vercel/style-guide': - specifier: ^5.0.1 - version: 5.0.1(@next/eslint-plugin-next@12.3.4)(eslint@8.53.0)(jest@29.7.0)(typescript@4.9.5) - eslint: - specifier: ^8.53.0 - version: 8.53.0 - eslint-config-custom: - specifier: '*' - version: link:packages/eslint-config-custom - eslint-plugin-import: - specifier: ^2.29.0 - version: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) - eslint-plugin-jsx-a11y: - specifier: ^6.8.0 - version: 6.8.0(eslint@8.53.0) - eslint-plugin-react: - specifier: ^7.33.2 - version: 7.33.2(eslint@8.53.0) - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@8.53.0) - eslint-plugin-tsdoc: - specifier: ^0.2.17 - version: 0.2.17 - jest: - specifier: 29.7.0 - version: 29.7.0(@types/node@17.0.45) - node-mocks-http: - specifier: ^1.13.0 - version: 1.13.0 - ts-jest: - specifier: 29.1.1 - version: 29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@4.9.5) - turbo: - specifier: ^1.10.16 - version: 1.10.16 - - apps/web: - dependencies: - '@tisoap/react-flow-smart-edge': - specifier: ^3.0.0 - version: 3.0.0(react-dom@18.2.0)(react@18.2.0)(reactflow@11.9.3)(typescript@4.9.5) - d3: - specifier: ^7.8.5 - version: 7.8.5 - elkjs: - specifier: ^0.8.2 - version: 0.8.2 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - long: - specifier: ^5.2.3 - version: 5.2.3 - material-icons: - specifier: ^1.13.12 - version: 1.13.12 - moment: - specifier: ^2.29.4 - version: 2.29.4 - next: - specifier: ^13.5.5 - version: 13.5.5(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.63.6) - next-auth: - specifier: ^4.24.5 - version: 4.24.5(next@13.5.5)(react-dom@18.2.0)(react@18.2.0) - nice-grpc: - specifier: ^2.1.5 - version: 2.1.5 - nice-grpc-common: - specifier: ^2.0.2 - version: 2.0.2 - protobufjs: - specifier: ^7.2.5 - version: 7.2.5 - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - react-syntax-highlighter: - specifier: ^15.5.0 - version: 15.5.0(react@18.2.0) - reactflow: - specifier: ^11.9.3 - version: 11.9.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - sass: - specifier: ^1.63.6 - version: 1.63.6 - ui: - specifier: workspace:* - version: link:../../packages/ui - devDependencies: - '@faker-js/faker': - specifier: ^8.2.0 - version: 8.2.0 - '@types/jest': - specifier: ^29.5.8 - version: 29.5.8 - '@types/lodash': - specifier: ^4.14.197 - version: 4.14.197 - '@types/node': - specifier: ^17.0.12 - version: 17.0.45 - '@types/react': - specifier: ^18.0.22 - version: 18.2.5 - '@types/react-dom': - specifier: ^18.0.7 - version: 18.2.3 - '@types/react-syntax-highlighter': - specifier: ^15.5.7 - version: 15.5.7 - eslint-config-custom: - specifier: workspace:* - version: link:../../packages/eslint-config-custom - eslint-plugin-import: - specifier: ^2.29.0 - version: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) - eslint-plugin-jsx-a11y: - specifier: ^6.8.0 - version: 6.8.0(eslint@8.53.0) - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@8.53.0) - jest: - specifier: 29.7.0 - version: 29.7.0(@types/node@17.0.45) - ts-jest: - specifier: 29.1.1 - version: 29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@4.9.5) - tsconfig: - specifier: workspace:* - version: link:../../packages/tsconfig - typescript: - specifier: ^4.5.3 - version: 4.9.5 - - packages/eslint-config-custom: {} - - packages/tsconfig: {} - - packages/ui: - dependencies: - '@turbo/gen': - specifier: ^1.10.16 - version: 1.10.16(@types/node@17.0.45)(typescript@4.9.5) - moment: - specifier: ^2.29.4 - version: 2.29.4 - devDependencies: - '@types/react': - specifier: ^18.2.0 - version: 18.2.5 - '@types/react-dom': - specifier: ^18.2.0 - version: 18.2.3 - eslint: - specifier: ^8.53.0 - version: 8.53.0 - eslint-config-custom: - specifier: workspace:* - version: link:../eslint-config-custom - eslint-plugin-import: - specifier: ^2.29.0 - version: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) - eslint-plugin-jsx-a11y: - specifier: ^6.8.0 - version: 6.8.0(eslint@8.53.0) - react: - specifier: ^17.0.2 - version: 17.0.2 - tsconfig: - specifier: workspace:* - version: link:../tsconfig - typescript: - specifier: ^4.5.2 - version: 4.9.5 - -packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - - /@babel/code-frame@7.12.11: - resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} - dependencies: - '@babel/highlight': 7.18.6 - dev: true - - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 - - /@babel/compat-data@7.23.2: - resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} - engines: {node: '>=6.9.0'} - - /@babel/core@7.23.2: - resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) - '@babel/helpers': 7.23.2 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - /@babel/eslint-parser@7.22.15(@babel/core@7.23.2)(eslint@8.53.0): - resolution: {integrity: sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 - dependencies: - '@babel/core': 7.23.2 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.53.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - dev: true - - /@babel/generator@7.23.0: - resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - jsesc: 2.5.2 - - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 - lru-cache: 5.1.1 - semver: 6.3.1 - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} - engines: {node: '>=6.9.0'} - - /@babel/helpers@7.23.2: - resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 - transitivePeerDependencies: - - supports-color - - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - - /@babel/parser@7.23.0: - resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.0 - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/runtime-corejs3@7.21.5: - resolution: {integrity: sha512-FRqFlFKNazWYykft5zvzuEl1YyTDGsIRrjV9rvxvYkUC7W/ueBng1X68Xd6uRMzAaJ0xMKn08/wem5YS1lpX8w==} - engines: {node: '>=6.9.0'} - dependencies: - core-js-pure: 3.30.2 - regenerator-runtime: 0.13.11 - - /@babel/runtime@7.21.5: - resolution: {integrity: sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - dev: false - - /@babel/runtime@7.23.2: - resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - - /@babel/traverse@7.23.2: - resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - /@babel/types@7.23.0: - resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.53.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.3: - resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.53.0: - resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@faker-js/faker@8.2.0: - resolution: {integrity: sha512-VacmzZqVxdWdf9y64lDOMZNDMM/FQdtM9IsaOPKOm2suYwEatb8VkdHqOzXcDnZbk7YDE2BmsJmy/2Hmkn563g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} - dev: true - - /@grpc/grpc-js@1.9.5: - resolution: {integrity: sha512-iouYNlPxRAwZ2XboDT+OfRKHuaKHiqjB5VFYZ0NFrHkbEF+AV3muIUY9olQsp8uxU4VvRCMiRk9ftzFDGb61aw==} - engines: {node: ^8.13.0 || >=10.10.0} - dependencies: - '@grpc/proto-loader': 0.7.10 - '@types/node': 17.0.45 - dev: false - - /@grpc/proto-loader@0.7.10: - resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - lodash.camelcase: 4.3.0 - long: 5.2.3 - protobufjs: 7.2.5 - yargs: 17.7.2 - dev: false - - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - dev: true - - /@jest/core@29.7.0: - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@17.0.45) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - jest-mock: 29.7.0 - dev: true - - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - dev: true - - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 17.0.45 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 - '@types/node': 17.0.45 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.19 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.2 - dev: true - - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - dev: true - - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.23.2 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.2 - '@types/node': 17.0.45 - '@types/yargs': 17.0.28 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - /@microsoft/tsdoc-config@0.16.2: - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - dev: true - - /@microsoft/tsdoc@0.14.2: - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: true - - /@next/env@13.5.5: - resolution: {integrity: sha512-agvIhYWp+ilbScg81s/sLueZo8CNEYLjNOqhISxheLmD/AQI4/VxV7bV76i/KzxH4iHy/va0YS9z0AOwGnw4Fg==} - dev: false - - /@next/eslint-plugin-next@12.3.4: - resolution: {integrity: sha512-BFwj8ykJY+zc1/jWANsDprDIu2MgwPOIKxNVnrKvPs+f5TPegrVnem8uScND+1veT4B7F6VeqgaNLFW1Hzl9Og==} - dependencies: - glob: 7.1.7 - dev: true - - /@next/swc-darwin-arm64@13.5.5: - resolution: {integrity: sha512-FvTdcJdTA7H1FGY8dKPPbf/O0oDC041/znHZwXA7liiGUhgw5hOQ+9z8tWvuz0M5a/SDjY/IRPBAb5FIFogYww==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@next/swc-darwin-x64@13.5.5: - resolution: {integrity: sha512-mTqNIecaojmyia7appVO2QggBe1Z2fdzxgn6jb3x9qlAk8yY2sy4MAcsj71kC9RlenCqDmr9vtC/ESFf110TPA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm64-gnu@13.5.5: - resolution: {integrity: sha512-U9e+kNkfvwh/T8yo+xcslvNXgyMzPPX1IbwCwnHHFmX5ckb1Uc3XZSInNjFQEQR5xhJpB5sFdal+IiBIiLYkZA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm64-musl@13.5.5: - resolution: {integrity: sha512-h7b58eIoNCSmKVC5fr167U0HWZ/yGLbkKD9wIller0nGdyl5zfTji0SsPKJvrG8jvKPFt2xOkVBmXlFOtuKynw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-gnu@13.5.5: - resolution: {integrity: sha512-6U4y21T1J6FfcpM9uqzBJicxycpB5gJKLyQ3g6KOfBzT8H1sMwfHTRrvHKB09GIn1BCRy5YJHrA1G26DzqR46w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-musl@13.5.5: - resolution: {integrity: sha512-OuqWSAQHJQM2EsapPFTSU/FLQ0wKm7UeRNatiR/jLeCe1V02aB9xmzuWYo2Neaxxag4rss3S8fj+lvMLzwDaFA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-arm64-msvc@13.5.5: - resolution: {integrity: sha512-+yLrOZIIZDY4uGn9bLOc0wTgs+M8RuOUFSUK3BhmcLav9e+tcAj0jyBHD4aXv2qWhppUeuYMsyBo1I58/eE6Dg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-ia32-msvc@13.5.5: - resolution: {integrity: sha512-SyMxXyJtf9ScMH0Dh87THJMXNFvfkRAk841xyW9SeOX3KxM1buXX3hN7vof4kMGk0Yg996OGsX+7C9ueS8ugsw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-x64-msvc@13.5.5: - resolution: {integrity: sha512-n5KVf2Ok0BbLwofAaHiiKf+BQCj1M8WmTujiER4/qzYAVngnsNSjqEWvJ03raeN9eURqxDO+yL5VRoDrR33H9A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - dependencies: - eslint-scope: 5.1.1 - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@panva/hkdf@1.1.1: - resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} - dev: false - - /@pkgr/utils@2.4.0: - resolution: {integrity: sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - fast-glob: 3.2.12 - is-glob: 4.0.3 - open: 9.1.0 - picocolors: 1.0.0 - tslib: 2.5.0 - dev: true - - /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - dev: false - - /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - dev: false - - /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - dev: false - - /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - dev: false - - /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - dev: false - - /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - dev: false - - /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - dev: false - - /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - dev: false - - /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - dev: false - - /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - dev: false - - /@reactflow/background@11.3.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-m3MR25ufbrDkZI2Yi7pHX5uewVpiaaVM5px35pk2v3qdG68adqHOgJjncUOpGiJpc3rDwt4mqmW1V7RjBqNv6Q==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.9.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.5)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@reactflow/controls@11.2.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-UTsfHE+PhgWrCZN4GUOTRU/3l8dGSyR2KslmgqV7mVNsh6EuS2cxboRczjpcIc8lF0EH+7QxLGeXSH42GWCcOQ==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.9.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.5)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@reactflow/core@11.9.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-45o8X1sjF48wSWALHybbLoWF6yo9SARgJpMKm96J8ZL8mrNhqSjll77sLRJg6zQ+VKdDwotEN30jp5eY6i28tw==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@types/d3': 7.4.1 - '@types/d3-drag': 3.0.4 - '@types/d3-selection': 3.0.7 - '@types/d3-zoom': 3.0.5 - classcat: 5.0.4 - d3-drag: 3.0.0 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.5)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@reactflow/minimap@11.7.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-u620uYwjmA5tJ/4p+F/0kyjNojvV0axTMSw87d/CCDij96m+2/drwqMW+BE8XHEqjG0c1HyplrkXQ3WhGu6ZaA==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.9.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@types/d3-selection': 3.0.7 - '@types/d3-zoom': 3.0.5 - classcat: 5.0.4 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.5)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@reactflow/node-resizer@2.2.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-x1TXN4YZhBI1LxNegVsE51emUg1rf4rBgvNL8Tzj0xsKkD/av4DOzRizQ3xAGgk0joPrsOTiGiP511m/PWjsew==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.9.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - d3-drag: 3.0.0 - d3-selection: 3.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.5)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@reactflow/node-toolbar@1.3.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-juNFBLZgC+KOYpVaQFTkSQTDf4hYK7WAagiQQ4Dw0IUcLaMY3TA31OLP6X6gMG73YGKFmkgrDwi0ZDB0jpMqdA==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.9.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.3(@types/react@18.2.5)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@rushstack/eslint-patch@1.5.1: - resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==} - dev: true - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.0 - dev: true - - /@stylistic/eslint-plugin-js@1.0.1(eslint@8.53.0): - resolution: {integrity: sha512-SfJlEnmBowaWx9GyN/7vQ/7jQP2wVQe5CcaoVL6V5nmCWl9Q+VSeJPSBOjB7XOYSYL1HoEQsvA+8Hy7Zt2XrnA==} - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - acorn: 8.11.2 - escape-string-regexp: 4.0.0 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esutils: 2.0.3 - graphemer: 1.4.0 - transitivePeerDependencies: - - eslint - dev: true - - /@stylistic/eslint-plugin-jsx@1.0.1(eslint@8.53.0): - resolution: {integrity: sha512-qWtZcjWhbJ2roeI0tIPPtI9kWq/aCPsm/OTnMMRN6MtcufYm5oUjuU9cnAFW1pbCcmNWAcTkzbquyYavTAHcDg==} - dependencies: - '@stylistic/eslint-plugin-js': 1.0.1(eslint@8.53.0) - estraverse: 5.3.0 - transitivePeerDependencies: - - eslint - dev: true - - /@stylistic/eslint-plugin-ts@1.0.1(eslint@8.53.0)(typescript@4.9.5): - resolution: {integrity: sha512-7ps/+DAlo9CdjjMB3u0aPyFTDI+QiR6DRK61nkmAO7BZ4xQfsJn2425trFyfIerAoHV61mP00bdpzmMk586IOg==} - peerDependencies: - eslint: '*' - dependencies: - '@stylistic/eslint-plugin-js': 1.0.1(eslint@8.53.0) - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@4.9.5) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@4.9.5) - eslint: 8.53.0 - graphemer: 1.4.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@stylistic/eslint-plugin@1.0.1(eslint@8.53.0)(typescript@4.9.5): - resolution: {integrity: sha512-nV4SbWg4yoiS/2ZrQ8dgFRHo7B4hvEwR5prAZ24ZcdIrodFPemd7pkNahClpaXTfXoQuLXB37aRhPRl/ez5Vsw==} - peerDependencies: - eslint: '*' - dependencies: - '@stylistic/eslint-plugin-js': 1.0.1(eslint@8.53.0) - '@stylistic/eslint-plugin-jsx': 1.0.1(eslint@8.53.0) - '@stylistic/eslint-plugin-ts': 1.0.1(eslint@8.53.0)(typescript@4.9.5) - eslint: 8.53.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@swc/helpers@0.5.2: - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} - dependencies: - tslib: 2.5.0 - dev: false - - /@tisoap/react-flow-smart-edge@3.0.0(react-dom@18.2.0)(react@18.2.0)(reactflow@11.9.3)(typescript@4.9.5): - resolution: {integrity: sha512-XtEQT0IrOqPwJvCzgEoj3Y16/EK4SOcjZO7FmOPU+qJWmgYjeTyv7J35CGm6dFeJYdZ2gHDrvQ1zwaXuo23/8g==} - engines: {node: '>=16', npm: ^8.0.0} - peerDependencies: - react: '>=17' - react-dom: '>=17' - reactflow: '>=11' - typescript: '>=4.6' - dependencies: - pathfinding: 0.4.18 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - reactflow: 11.9.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - typescript: 4.9.5 - dev: false - - /@tootallnate/quickjs-emscripten@0.23.0: - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - /@turbo/gen@1.10.16(@types/node@17.0.45)(typescript@4.9.5): - resolution: {integrity: sha512-PzyluADjVuy5OcIi+/aRcD70OElQpRVRDdfZ9fH8G5Fv75lQcNrjd1bBGKmhjSw+g+eTEkXMGnY7s6gsCYjYTQ==} - hasBin: true - dependencies: - '@turbo/workspaces': 1.10.16 - chalk: 2.4.2 - commander: 10.0.1 - fs-extra: 10.1.0 - inquirer: 8.2.5 - minimatch: 9.0.0 - node-plop: 0.26.3 - proxy-agent: 6.3.1 - ts-node: 10.9.1(@types/node@17.0.45)(typescript@4.9.5) - update-check: 1.5.4 - validate-npm-package-name: 5.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - supports-color - - typescript - - /@turbo/workspaces@1.10.16: - resolution: {integrity: sha512-WKpMyWC4fKCji9DFSaL6uUnTakOmL769LfiNOGk2v5jONMKpjvOB1o1nXkWNbU/PTPqxwV4Cf5qzNSWIgnanYg==} - hasBin: true - dependencies: - chalk: 2.4.2 - commander: 10.0.1 - execa: 5.1.1 - fast-glob: 3.3.1 - fs-extra: 10.1.0 - gradient-string: 2.0.2 - inquirer: 8.2.5 - js-yaml: 4.1.0 - ora: 4.1.1 - rimraf: 3.0.2 - semver: 7.5.4 - update-check: 1.5.4 - - /@types/babel__core@7.20.2: - resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==} - dependencies: - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - '@types/babel__generator': 7.6.5 - '@types/babel__template': 7.4.2 - '@types/babel__traverse': 7.20.2 - dev: true - - /@types/babel__generator@7.6.5: - resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@types/babel__template@7.4.2: - resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==} - dependencies: - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - dev: true - - /@types/babel__traverse@7.20.2: - resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@types/d3-array@3.0.8: - resolution: {integrity: sha512-2xAVyAUgaXHX9fubjcCbGAUOqYfRJN1em1EKR2HfzWBpObZhwfnZKvofTN4TplMqJdFQao61I+NVSai/vnBvDQ==} - dev: false - - /@types/d3-axis@3.0.4: - resolution: {integrity: sha512-ySnjI/7qm+J602VjcejXcqs1hEuu5UBbGaJGp+Cn/yKVc1iS3JueLVpToGdQsS2sqta7tqA/kG4ore/+LH90UA==} - dependencies: - '@types/d3-selection': 3.0.7 - dev: false - - /@types/d3-brush@3.0.4: - resolution: {integrity: sha512-Kg5uIsdJNMCs5lTqeZFsTKqj9lBvpiFRDkYN3j2CDlPhonNDg9/gXVpv1E/MKh3tEqArryIj9o6RBGE/MQe+6Q==} - dependencies: - '@types/d3-selection': 3.0.7 - dev: false - - /@types/d3-chord@3.0.4: - resolution: {integrity: sha512-p4PvN1N+7GL3Y/NI9Ug1TKwowUV6h664kmxL79ctp1HRYCk1mhP0+SXhjRsoWXCdnJfbLLLmpV99rt8dMrHrzg==} - dev: false - - /@types/d3-color@3.1.1: - resolution: {integrity: sha512-CSAVrHAtM9wfuLJ2tpvvwCU/F22sm7rMHNN+yh9D6O6hyAms3+O0cgMpC1pm6UEUMOntuZC8bMt74PteiDUdCg==} - dev: false - - /@types/d3-contour@3.0.4: - resolution: {integrity: sha512-B0aeX8Xg3MNUglULxqDvlgY1SVXuN2xtEleYSAY0iMhl/SMVT7snzgAveejjwM3KaWuNXIoXEJ7dmXE8oPq/jA==} - dependencies: - '@types/d3-array': 3.0.8 - '@types/geojson': 7946.0.11 - dev: false - - /@types/d3-delaunay@6.0.2: - resolution: {integrity: sha512-WplUJ/OHU7eITneDqNnzK+2pgR+WDzUHG6XAUVo+oWHPQq74VcgUdw8a4ODweaZzF56OVYK+x9GxCyuq6hSu1A==} - dev: false - - /@types/d3-dispatch@3.0.4: - resolution: {integrity: sha512-NApHpGHRNxUy7e2Lfzl/cwOucmn4Xdx6FdmXzAoomo8T81LyGmlBjjko/vP0TVzawlvEFLDq8OCRLulW6DDzKw==} - dev: false - - /@types/d3-drag@3.0.4: - resolution: {integrity: sha512-/t53K1erTuUbP7WIX9SE0hlmytpTYRbIthlhbGkBHzCV5vPO++7yrk8OlisWPyIJO5TGowTmqCtGH2tokY5T/g==} - dependencies: - '@types/d3-selection': 3.0.7 - dev: false - - /@types/d3-dsv@3.0.4: - resolution: {integrity: sha512-YxfUVJ55HxR8oq88136w09mBMPNhgH7PZjteq72onWXWOohGif/cLQnQv8V4A5lEGjXF04LhwSTpmzpY9wyVyA==} - dev: false - - /@types/d3-ease@3.0.0: - resolution: {integrity: sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==} - dev: false - - /@types/d3-fetch@3.0.4: - resolution: {integrity: sha512-RleYajubALkGjrvatxWhlygfvB1KNF0Uzz9guRUeeA+M/2B7l8rxObYdktaX9zU1st04lMCHjZWe4vbl+msH2Q==} - dependencies: - '@types/d3-dsv': 3.0.4 - dev: false - - /@types/d3-force@3.0.6: - resolution: {integrity: sha512-G9wbOvCxkNlLrppoHLZ6oFpbm3z7ibfkXwLD8g5/4Aa7iTEV0Z7TQ0OL8UxAtvdOhCa2VZcSuqn1NQqyCEqmiw==} - dev: false - - /@types/d3-format@3.0.2: - resolution: {integrity: sha512-9oQWvKk2qVBo49FQq8yD/et8Lx0W5Ac2FdGSOUecqOFKqh0wkpyHqf9Qc7A06ftTR+Lz13Pi3jHIQis0aCueOA==} - dev: false - - /@types/d3-geo@3.0.5: - resolution: {integrity: sha512-ysEEU93Wv9p2UZBxTK3kUP7veHgyhTA0qYtI7bxK5EMXb3JxGv0D4IH54PxprAF26n+uHci24McVmzwIdLgvgQ==} - dependencies: - '@types/geojson': 7946.0.11 - dev: false - - /@types/d3-hierarchy@3.1.4: - resolution: {integrity: sha512-wrvjpRFdmEu6yAqgjGy8MSud9ggxJj+I9XLuztLeSf/E0j0j6RQYtxH2J8U0Cfbgiw9ZDHyhpmaVuWhxscYaAQ==} - dev: false - - /@types/d3-interpolate@3.0.2: - resolution: {integrity: sha512-zAbCj9lTqW9J9PlF4FwnvEjXZUy75NQqPm7DMHZXuxCFTpuTrdK2NMYGQekf4hlasL78fCYOLu4EE3/tXElwow==} - dependencies: - '@types/d3-color': 3.1.1 - dev: false - - /@types/d3-path@3.0.0: - resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} - dev: false - - /@types/d3-polygon@3.0.0: - resolution: {integrity: sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==} - dev: false - - /@types/d3-quadtree@3.0.3: - resolution: {integrity: sha512-GDWaR+rGEk4ToLQSGugYnoh9AYYblsg/8kmdpa1KAJMwcdZ0v8rwgnldURxI5UrzxPlCPzF7by/Tjmv+Jn21Dg==} - dev: false - - /@types/d3-random@3.0.1: - resolution: {integrity: sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==} - dev: false - - /@types/d3-scale-chromatic@3.0.0: - resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} - dev: false - - /@types/d3-scale@4.0.5: - resolution: {integrity: sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA==} - dependencies: - '@types/d3-time': 3.0.1 - dev: false - - /@types/d3-selection@3.0.7: - resolution: {integrity: sha512-qoj2O7KjfqCobmtFOth8FMvjwMVPUAAmn6xiUbLl1ld7vQCPgffvyV5BBcEFfqWdilAUm+3zciU/3P3vZrUMlg==} - dev: false - - /@types/d3-shape@3.1.3: - resolution: {integrity: sha512-cHMdIq+rhF5IVwAV7t61pcEXfEHsEsrbBUPkFGBwTXuxtTAkBBrnrNA8++6OWm3jwVsXoZYQM8NEekg6CPJ3zw==} - dependencies: - '@types/d3-path': 3.0.0 - dev: false - - /@types/d3-time-format@4.0.1: - resolution: {integrity: sha512-Br6EFeu9B1Zrem7KaYbr800xCmEDyq8uE60kEU8rWhC/XpFYX6ocGMZuRJDQfFCq6SyakQxNHFqIfJbFLf4x6Q==} - dev: false - - /@types/d3-time@3.0.1: - resolution: {integrity: sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA==} - dev: false - - /@types/d3-timer@3.0.0: - resolution: {integrity: sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==} - dev: false - - /@types/d3-transition@3.0.5: - resolution: {integrity: sha512-dcfjP6prFxj3ziFOJrnt4W2P0oXNj/sGxsJXH8286sHtVZ4qWGbjuZj+RRCYx4YZ4C0izpeE8OqXVCtoWEtzYg==} - dependencies: - '@types/d3-selection': 3.0.7 - dev: false - - /@types/d3-zoom@3.0.5: - resolution: {integrity: sha512-mIefdTLtxuWUWTbBupCUXPAXVPmi8/Uwrq41gQpRh0rD25GMU1ku+oTELqNY2NuuiI0F3wXC5e1liBQi7YS7XQ==} - dependencies: - '@types/d3-interpolate': 3.0.2 - '@types/d3-selection': 3.0.7 - dev: false - - /@types/d3@7.4.1: - resolution: {integrity: sha512-lBpYmbHTCtFKO1DB1R7E9dXp9/g1F3JXSGOF7iKPZ+wRmYg/Q6tCRHODGOc5Qk25fJRe2PI60EDRf2HLPUncMA==} - dependencies: - '@types/d3-array': 3.0.8 - '@types/d3-axis': 3.0.4 - '@types/d3-brush': 3.0.4 - '@types/d3-chord': 3.0.4 - '@types/d3-color': 3.1.1 - '@types/d3-contour': 3.0.4 - '@types/d3-delaunay': 6.0.2 - '@types/d3-dispatch': 3.0.4 - '@types/d3-drag': 3.0.4 - '@types/d3-dsv': 3.0.4 - '@types/d3-ease': 3.0.0 - '@types/d3-fetch': 3.0.4 - '@types/d3-force': 3.0.6 - '@types/d3-format': 3.0.2 - '@types/d3-geo': 3.0.5 - '@types/d3-hierarchy': 3.1.4 - '@types/d3-interpolate': 3.0.2 - '@types/d3-path': 3.0.0 - '@types/d3-polygon': 3.0.0 - '@types/d3-quadtree': 3.0.3 - '@types/d3-random': 3.0.1 - '@types/d3-scale': 4.0.5 - '@types/d3-scale-chromatic': 3.0.0 - '@types/d3-selection': 3.0.7 - '@types/d3-shape': 3.1.3 - '@types/d3-time': 3.0.1 - '@types/d3-time-format': 4.0.1 - '@types/d3-timer': 3.0.0 - '@types/d3-transition': 3.0.5 - '@types/d3-zoom': 3.0.5 - dev: false - - /@types/geojson@7946.0.11: - resolution: {integrity: sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg==} - dev: false - - /@types/glob@7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 17.0.45 - - /@types/graceful-fs@4.1.7: - resolution: {integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==} - dependencies: - '@types/node': 17.0.45 - dev: true - - /@types/hast@2.3.5: - resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} - dependencies: - '@types/unist': 2.0.7 - dev: false - - /@types/inquirer@6.5.0: - resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==} - dependencies: - '@types/through': 0.0.30 - rxjs: 6.6.7 - - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - - /@types/istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true - - /@types/istanbul-reports@3.0.2: - resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} - dependencies: - '@types/istanbul-lib-report': 3.0.1 - dev: true - - /@types/jest@29.5.5: - resolution: {integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==} - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - dev: true - - /@types/jest@29.5.8: - resolution: {integrity: sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==} - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - dev: true - - /@types/json-schema@7.0.14: - resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} - dev: true - - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - - /@types/lodash@4.14.197: - resolution: {integrity: sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==} - dev: true - - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - - /@types/node@17.0.45: - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - - /@types/normalize-package-data@2.4.3: - resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==} - dev: true - - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - - /@types/react-dom@18.2.3: - resolution: {integrity: sha512-hxXEXWxFJXbY0LMj/T69mznqOZJXNtQMqVxIiirVAZnnpeYiD4zt+lPsgcr/cfWg2VLsxZ1y26vigG03prYB+Q==} - dependencies: - '@types/react': 18.2.5 - dev: true - - /@types/react-syntax-highlighter@15.5.7: - resolution: {integrity: sha512-bo5fEO5toQeyCp0zVHBeggclqf5SQ/Z5blfFmjwO5dkMVGPgmiwZsJh9nu/Bo5L7IHTuGWrja6LxJVE2uB5ZrQ==} - dependencies: - '@types/react': 18.2.5 - dev: true - - /@types/react@18.2.5: - resolution: {integrity: sha512-RuoMedzJ5AOh23Dvws13LU9jpZHIc/k90AgmK7CecAYeWmSr3553L4u5rk4sWAPBuQosfT7HmTfG4Rg5o4nGEA==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 - csstype: 3.1.2 - - /@types/scheduler@0.16.3: - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - - /@types/semver@7.5.4: - resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} - dev: true - - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true - - /@types/through@0.0.30: - resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} - dependencies: - '@types/node': 17.0.45 - - /@types/tinycolor2@1.4.5: - resolution: {integrity: sha512-uLJijDHN5E6j5n1qefF9oaeplgszXglWXWTviMoFr/YxgvbyrkFil20yDT7ljhCiTQ/BfCYtxfJS81LdTro5DQ==} - - /@types/unist@2.0.7: - resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} - dev: false - - /@types/yargs-parser@21.0.1: - resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} - dev: true - - /@types/yargs@17.0.28: - resolution: {integrity: sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==} - dependencies: - '@types/yargs-parser': 21.0.1 - dev: true - - /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.9.0)(eslint@8.53.0)(typescript@4.9.5): - resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.9.0(eslint@8.53.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@4.9.5) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 6.10.0 - debug: 4.3.4 - eslint: 8.53.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.9.0(eslint@8.53.0)(typescript@4.9.5): - resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.9.0 - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/typescript-estree': 6.9.0(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 6.9.0 - debug: 4.3.4 - eslint: 8.53.0 - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - - /@typescript-eslint/scope-manager@6.10.0: - resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/visitor-keys': 6.10.0 - dev: true - - /@typescript-eslint/scope-manager@6.9.0: - resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/visitor-keys': 6.9.0 - dev: true - - /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@4.9.5): - resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.10.0(typescript@4.9.5) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@4.9.5) - debug: 4.3.4 - eslint: 8.53.0 - ts-api-utils: 1.0.3(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/types@6.10.0: - resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - - /@typescript-eslint/types@6.9.0: - resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - - /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - 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.5.4 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree@6.10.0(typescript@4.9.5): - resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/visitor-keys': 6.10.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree@6.9.0(typescript@4.9.5): - resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/visitor-keys': 6.9.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@5.62.0(eslint@8.53.0)(typescript@4.9.5): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - '@types/json-schema': 7.0.14 - '@types/semver': 7.5.4 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.53.0 - eslint-scope: 5.1.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@4.9.5): - resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - '@types/json-schema': 7.0.14 - '@types/semver': 7.5.4 - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@4.9.5) - eslint: 8.53.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@typescript-eslint/visitor-keys@6.10.0: - resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.10.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@typescript-eslint/visitor-keys@6.9.0: - resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.9.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - - /@vercel/style-guide@5.0.1(@next/eslint-plugin-next@12.3.4)(eslint@8.53.0)(jest@29.7.0)(typescript@4.9.5): - resolution: {integrity: sha512-3J/5xpwJ2Wk+cKB3EGY2KCdVQycaThLKhjBmgXPfIKb+E74lPpXVIDfaQE0D2JoAyIzGsqdH7Lbmr+DojwofxQ==} - engines: {node: '>=16'} - peerDependencies: - '@next/eslint-plugin-next': '>=12.3.0 <14' - eslint: '>=8.48.0 <9' - prettier: '>=3.0.0 <4' - typescript: '>=4.8.0 <6' - peerDependenciesMeta: - '@next/eslint-plugin-next': - optional: true - eslint: - optional: true - prettier: - optional: true - typescript: - optional: true - dependencies: - '@babel/core': 7.23.2 - '@babel/eslint-parser': 7.22.15(@babel/core@7.23.2)(eslint@8.53.0) - '@next/eslint-plugin-next': 12.3.4 - '@rushstack/eslint-patch': 1.5.1 - '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.9.0)(eslint@8.53.0)(typescript@4.9.5) - '@typescript-eslint/parser': 6.9.0(eslint@8.53.0)(typescript@4.9.5) - eslint: 8.53.0 - eslint-config-prettier: 9.0.0(eslint@8.53.0) - eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.0) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.9.0)(eslint-plugin-import@2.29.0)(eslint@8.53.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.53.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.10.0)(eslint@8.53.0)(jest@29.7.0)(typescript@4.9.5) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.53.0) - eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.6.0)(eslint@8.53.0) - eslint-plugin-react: 7.33.2(eslint@8.53.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.53.0) - eslint-plugin-testing-library: 6.1.0(eslint@8.53.0)(typescript@4.9.5) - eslint-plugin-tsdoc: 0.2.17 - eslint-plugin-unicorn: 48.0.1(eslint@8.53.0) - prettier-plugin-packagejson: 2.4.6 - typescript: 4.9.5 - transitivePeerDependencies: - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - jest - - supports-color - dev: true - - /abort-controller-x@0.4.3: - resolution: {integrity: sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==} - dev: false - - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.2 - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} - engines: {node: '>=0.4.0'} - hasBin: true - - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - dependencies: - dequal: 2.0.3 - dev: true - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - dev: true - - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 - is-string: 1.0.7 - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - /array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 - dev: true - - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.tosorted@1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 - dev: true - - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - dev: true - - /ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - dev: true - - /ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - dependencies: - tslib: 2.5.0 - - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - dependencies: - has-symbols: 1.0.3 - dev: true - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /axe-core@4.7.0: - resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} - engines: {node: '>=4'} - dev: true - - /axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} - dependencies: - dequal: 2.0.3 - dev: true - - /babel-jest@29.7.0(@babel/core@7.23.2): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.23.2 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.2 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.2) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - '@types/babel__core': 7.20.2 - '@types/babel__traverse': 7.20.2 - dev: true - - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.2): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.23.2): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /basic-ftp@5.0.3: - resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} - engines: {node: '>=10.0.0'} - - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: false - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - dependencies: - big-integer: 1.6.51 - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001547 - electron-to-chromium: 1.4.552 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true - - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - dependencies: - semver: 7.5.4 - - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} - dependencies: - run-applescript: 5.0.0 - dev: true - - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: false - - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.1 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-lite@1.0.30001547: - resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /change-case@3.1.0: - resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} - dependencies: - camel-case: 3.0.0 - constant-case: 2.0.0 - dot-case: 2.1.1 - header-case: 1.0.1 - is-lower-case: 1.1.3 - is-upper-case: 1.1.2 - lower-case: 1.1.4 - lower-case-first: 1.0.2 - no-case: 2.3.2 - param-case: 2.1.1 - pascal-case: 2.0.1 - path-case: 2.1.1 - sentence-case: 2.1.1 - snake-case: 2.1.0 - swap-case: 1.1.2 - title-case: 2.1.1 - upper-case: 1.1.3 - upper-case-first: 1.1.2 - - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true - - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: false - - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: false - - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - dev: false - - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: false - - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true - - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - dev: true - - /classcat@5.0.4: - resolution: {integrity: sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==} - dev: false - - /clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - - /cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} - engines: {node: '>=6'} - - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /comma-separated-tokens@1.0.8: - resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - dev: false - - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: false - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /constant-case@2.0.0: - resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} - dependencies: - snake-case: 2.1.0 - upper-case: 1.1.3 - - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: false - - /core-js-pure@3.30.2: - resolution: {integrity: sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==} - requiresBuild: true - - /create-jest@29.7.0(@types/node@17.0.45): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@17.0.45) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - dependencies: - internmap: 2.0.3 - dev: false - - /d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - dev: false - - /d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - - /d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} - dependencies: - d3-path: 3.1.0 - dev: false - - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false - - /d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - dev: false - - /d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} - dependencies: - delaunator: 5.0.0 - dev: false - - /d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - dev: false - - /d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-selection: 3.0.0 - dev: false - - /d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true - dependencies: - commander: 7.2.0 - iconv-lite: 0.6.3 - rw: 1.3.3 - dev: false - - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false - - /d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} - dependencies: - d3-dsv: 3.0.1 - dev: false - - /d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-quadtree: 3.0.1 - d3-timer: 3.0.1 - dev: false - - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false - - /d3-geo@3.1.0: - resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - dev: false - - /d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - dev: false - - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - dependencies: - d3-color: 3.1.0 - dev: false - - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false - - /d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - dev: false - - /d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - dev: false - - /d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - dev: false - - /d3-scale-chromatic@3.0.0: - resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} - engines: {node: '>=12'} - dependencies: - d3-color: 3.1.0 - d3-interpolate: 3.0.1 - dev: false - - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.0 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - dev: false - - /d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - dev: false - - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - dependencies: - d3-path: 3.1.0 - dev: false - - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - dependencies: - d3-time: 3.1.0 - dev: false - - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - dev: false - - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false - - /d3-transition@3.0.1(d3-selection@3.0.0): - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 - dependencies: - d3-color: 3.1.0 - d3-dispatch: 3.0.1 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-timer: 3.0.1 - dev: false - - /d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - - /d3@7.8.5: - resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - d3-axis: 3.0.0 - d3-brush: 3.0.0 - d3-chord: 3.0.1 - d3-color: 3.1.0 - d3-contour: 4.0.2 - d3-delaunay: 6.0.4 - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-dsv: 3.0.1 - d3-ease: 3.0.1 - d3-fetch: 3.0.1 - d3-force: 3.0.0 - d3-format: 3.1.0 - d3-geo: 3.1.0 - d3-hierarchy: 3.1.2 - d3-interpolate: 3.0.1 - d3-path: 3.1.0 - d3-polygon: 3.0.1 - d3-quadtree: 3.0.1 - d3-random: 3.0.1 - d3-scale: 4.0.2 - d3-scale-chromatic: 3.0.0 - d3-selection: 3.0.0 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - d3-timer: 3.0.1 - d3-transition: 3.0.1(d3-selection@3.0.0) - d3-zoom: 3.0.0 - dev: false - - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: true - - /data-uri-to-buffer@6.0.1: - resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==} - engines: {node: '>= 14'} - - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true - - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - dev: true - - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.1.1 - titleize: 3.0.0 - dev: true - - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - gopd: 1.0.1 - has-property-descriptors: 1.0.0 - dev: true - - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - dev: true - - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - dev: true - - /degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - - /del@5.1.0: - resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} - engines: {node: '>=8'} - dependencies: - globby: 10.0.2 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 3.0.0 - rimraf: 3.0.2 - slash: 3.0.0 - - /delaunator@5.0.0: - resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} - dependencies: - robust-predicates: 3.0.2 - dev: false - - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: true - - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true - - /detect-indent@7.0.1: - resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} - engines: {node: '>=12.20'} - dev: true - - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - - /detect-newline@4.0.1: - resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dot-case@2.1.1: - resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} - dependencies: - no-case: 2.3.2 - - /electron-to-chromium@1.4.552: - resolution: {integrity: sha512-qMPzA5TEuOAbLFmbpNvO4qkBRe2B5dAxl6H4KxqRNy9cvBeHT2EyzecX0bumBfRhHN8cQJrx6NPd0AAoCCPKQw==} - - /elkjs@0.8.2: - resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} - dev: false - - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /enhanced-resolve@5.13.0: - resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /es-abstract@1.22.2: - resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - 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.6 - 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.12 - 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.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 - dev: true - - /es-iterator-helpers@1.0.15: - resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} - dependencies: - asynciterator.prototype: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-set-tostringtag: 2.0.1 - function-bind: 1.1.2 - get-intrinsic: 1.2.1 - globalthis: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - iterator.prototype: 1.1.2 - safe-array-concat: 1.0.1 - dev: true - - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - has-tostringtag: 1.0.0 - dev: true - - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - dependencies: - has: 1.0.3 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - /eslint-config-prettier@9.0.0(eslint@8.53.0): - resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.53.0 - dev: true - - /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.0): - resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} - engines: {node: '>= 4'} - peerDependencies: - eslint-plugin-import: '>=1.4.0' - dependencies: - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) - dev: true - - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.9.0)(eslint-plugin-import@2.29.0)(eslint@8.53.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: 4.3.4 - enhanced-resolve: 5.13.0 - eslint: 8.53.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) - fast-glob: 3.3.1 - get-tsconfig: 4.5.0 - is-core-module: 2.13.0 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 6.9.0(eslint@8.53.0)(typescript@4.9.5) - debug: 3.2.7 - eslint: 8.53.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.9.0)(eslint-plugin-import@2.29.0)(eslint@8.53.0) - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-eslint-comments@3.2.0(eslint@8.53.0): - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - escape-string-regexp: 1.0.5 - eslint: 8.53.0 - ignore: 5.2.4 - dev: true - - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0): - resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 6.9.0(eslint@8.53.0)(typescript@4.9.5) - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.3 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.53.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.53.0) - hasown: 2.0.0 - is-core-module: 2.13.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.1 - object.values: 1.1.7 - semver: 6.3.1 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.10.0)(eslint@8.53.0)(jest@29.7.0)(typescript@4.9.5): - resolution: {integrity: sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.9.0)(eslint@8.53.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@4.9.5) - eslint: 8.53.0 - jest: 29.7.0(@types/node@17.0.45) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /eslint-plugin-jsx-a11y@6.8.0(eslint@8.53.0): - resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - '@babel/runtime': 7.23.2 - aria-query: 5.3.0 - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.8 - axe-core: 4.7.0 - axobject-query: 3.2.1 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.15 - eslint: 8.53.0 - hasown: 2.0.0 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - dev: true - - /eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.6.0)(eslint@8.53.0): - resolution: {integrity: sha512-DcHpF0SLbNeh9MT4pMzUGuUSnJ7q5MWbP8sSEFIMS6j7Ggnduq8ghNlfhURgty4c1YFny7Ge9xYTO1FSAoV2Vw==} - peerDependencies: - eslint: '>=7' - eslint-plugin-jest: '>=25' - peerDependenciesMeta: - eslint-plugin-jest: - optional: true - dependencies: - eslint: 8.53.0 - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.10.0)(eslint@8.53.0)(jest@29.7.0)(typescript@4.9.5) - dev: true - - /eslint-plugin-react-hooks@4.6.0(eslint@8.53.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.53.0 - dev: true - - /eslint-plugin-react@7.33.2(eslint@8.53.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.1 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.15 - eslint: 8.53.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.2 - object.values: 1.1.7 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.1 - string.prototype.matchall: 4.0.8 - dev: true - - /eslint-plugin-testing-library@6.1.0(eslint@8.53.0)(typescript@4.9.5): - resolution: {integrity: sha512-r7kE+az3tbp8vyRwfyAGZ6V/xw+XvdWFPicIo6jbOPZoossOFDeHizARqPGV6gEkyF8hyCFhhH3mlQOGS3N5Sg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} - peerDependencies: - eslint: ^7.5.0 || ^8.0.0 - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@4.9.5) - eslint: 8.53.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /eslint-plugin-tsdoc@0.2.17: - resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - dev: true - - /eslint-plugin-unicorn@48.0.1(eslint@8.53.0): - resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} - engines: {node: '>=16'} - peerDependencies: - eslint: '>=8.44.0' - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - ci-info: 3.9.0 - clean-regexp: 1.0.0 - eslint: 8.53.0 - esquery: 1.5.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.0.2 - lodash: 4.17.21 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.5.4 - strip-indent: 3.0.0 - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.53.0: - resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.3 - '@eslint/js': 8.53.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - 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 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) - eslint-visitor-keys: 3.4.3 - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - /execa@7.1.1: - resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.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 - dev: true - - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true - - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - dev: true - - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /fault@1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - dependencies: - format: 0.2.2 - dev: false - - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true - - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.0.4 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - dev: true - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - dev: false - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true - - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - functions-have-names: 1.2.3 - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - dependencies: - function-bind: 1.1.2 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - dev: true - - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - - /get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - dev: true - - /get-tsconfig@4.5.0: - resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} - dev: true - - /get-uri@6.0.2: - resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==} - engines: {node: '>= 14'} - dependencies: - basic-ftp: 5.0.3 - data-uri-to-buffer: 6.0.1 - debug: 4.3.4 - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color - - /git-hooks-list@3.1.0: - resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: false - - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - dev: true - - /globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} - dependencies: - '@types/glob': 7.2.0 - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - glob: 7.2.3 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - /gradient-string@2.0.2: - resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - tinygradient: 1.1.5 - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /handlebars@4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.2 - dev: true - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - - /hast-util-parse-selector@2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - dev: false - - /hastscript@6.0.0: - resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} - dependencies: - '@types/hast': 2.3.5 - comma-separated-tokens: 1.0.8 - hast-util-parse-selector: 2.2.5 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 - dev: false - - /header-case@1.0.1: - resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - - /heap@0.2.5: - resolution: {integrity: sha512-G7HLD+WKcrOyJP5VQwYZNC3Z6FcQ7YYjEFiFoIj8PfEr73mu421o8B1N5DKUcc8K37EsJ2XXWA8DtrDz/2dReg==} - dev: false - - /highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - dev: false - - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - - /http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - /immutable@4.3.0: - resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} - dev: false - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - /inquirer@7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - - /inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 - dev: true - - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false - - /ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: false - - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - dev: false - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.12 - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: false - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - dependencies: - builtin-modules: 3.3.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} - dependencies: - has: 1.0.3 - dev: true - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: false - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: false - - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - dependencies: - is-docker: 3.0.0 - dev: true - - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - /is-lower-case@1.1.3: - resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} - dependencies: - lower-case: 1.1.4 - - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: true - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.11 - dev: true - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - /is-upper-case@1.1.2: - resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} - dependencies: - upper-case: 1.1.3 - - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - - /isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.23.2 - '@babel/parser': 7.23.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.23.2 - '@babel/parser': 7.23.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.4 - set-function-name: 2.0.1 - dev: true - - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 - dev: true - - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.1 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.0.4 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - /jest-cli@29.7.0(@types/node@17.0.45): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@17.0.45) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@17.0.45) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /jest-config@29.7.0(@types/node@17.0.45): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.23.2 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - babel-jest: 29.7.0(@babel/core@7.23.2) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 - dev: true - - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.7 - '@types/node': 17.0.45 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.13 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - jest-util: 29.7.0 - dev: true - - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.7.0 - dev: true - - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 - slash: 3.0.0 - dev: true - - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.23.2 - '@babel/generator': 7.23.0 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) - '@babel/types': 7.23.0 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 - dev: true - - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 17.0.45 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 - dev: true - - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 17.0.45 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest@29.7.0(@types/node@17.0.45): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0 - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@17.0.45) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true - - /jose@4.14.4: - resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} - dev: false - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - dependencies: - array-includes: 3.1.7 - array.prototype.flat: 1.3.2 - object.assign: 4.1.4 - object.values: 1.1.7 - dev: true - - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - - /language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: true - - /language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - dependencies: - language-subtag-registry: 0.3.22 - dev: true - - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false - - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - /log-symbols@3.0.0: - resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} - engines: {node: '>=8'} - dependencies: - chalk: 2.4.2 - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - - /lower-case-first@1.0.2: - resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} - dependencies: - lower-case: 1.1.4 - - /lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - - /lowlight@1.20.0: - resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} - dependencies: - fault: 1.0.4 - highlight.js: 10.7.3 - dev: false - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - - /material-icons@1.13.12: - resolution: {integrity: sha512-/2YoaB79IjUK2B2JB+vIXXYGtBfHb/XG66LvoKVM5ykHW7yfrV5SP6d7KLX6iijY6/G9GqwgtPQ/sbhFnOURVA==} - dev: false - - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true - - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minimatch@9.0.0: - resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - - /moment@2.29.4: - resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - /netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - - /next-auth@4.24.5(next@13.5.5)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og==} - peerDependencies: - next: ^12.2.5 || ^13 || ^14 - nodemailer: ^6.6.5 - react: ^17.0.2 || ^18 - react-dom: ^17.0.2 || ^18 - peerDependenciesMeta: - nodemailer: - optional: true - dependencies: - '@babel/runtime': 7.23.2 - '@panva/hkdf': 1.1.1 - cookie: 0.5.0 - jose: 4.14.4 - next: 13.5.5(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.63.6) - oauth: 0.9.15 - openid-client: 5.4.2 - preact: 10.15.1 - preact-render-to-string: 5.2.6(preact@10.15.1) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - uuid: 8.3.2 - dev: false - - /next@13.5.5(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.63.6): - resolution: {integrity: sha512-LddFJjpfrtrMMw8Q9VLhIURuSidiCNcMQjRqcPtrKd+Fx07MsG7hYndJb/f2d3I+mTbTotsTJfCnn0eZ/YPk8w==} - engines: {node: '>=16.14.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - sass: - optional: true - dependencies: - '@next/env': 13.5.5 - '@swc/helpers': 0.5.2 - busboy: 1.6.0 - caniuse-lite: 1.0.30001547 - postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - sass: 1.63.6 - styled-jsx: 5.1.1(@babel/core@7.23.2)(react@18.2.0) - watchpack: 2.4.0 - optionalDependencies: - '@next/swc-darwin-arm64': 13.5.5 - '@next/swc-darwin-x64': 13.5.5 - '@next/swc-linux-arm64-gnu': 13.5.5 - '@next/swc-linux-arm64-musl': 13.5.5 - '@next/swc-linux-x64-gnu': 13.5.5 - '@next/swc-linux-x64-musl': 13.5.5 - '@next/swc-win32-arm64-msvc': 13.5.5 - '@next/swc-win32-ia32-msvc': 13.5.5 - '@next/swc-win32-x64-msvc': 13.5.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - dev: false - - /nice-grpc-common@2.0.2: - resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==} - dependencies: - ts-error: 1.0.6 - dev: false - - /nice-grpc@2.1.5: - resolution: {integrity: sha512-xqtgW+9VpKD+J3G3sl9+ggR//DmYGrNgjfuEznTU3eL/zRLhn/SwSzl2Elw7TiPknEQ54hDtaOP6VQ8ktv+6fA==} - dependencies: - '@grpc/grpc-js': 1.9.5 - abort-controller-x: 0.4.3 - nice-grpc-common: 2.0.2 - dev: false - - /no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} - dependencies: - lower-case: 1.1.4 - - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - - /node-mocks-http@1.13.0: - resolution: {integrity: sha512-lArD6sJMPJ53WF50GX0nJ89B1nkV1TdMvNwq8WXXFrUXF80ujSyye1T30mgiHh4h2It0/svpF3C4kZ2OAONVlg==} - engines: {node: '>=14'} - dependencies: - accepts: 1.3.8 - content-disposition: 0.5.4 - depd: 1.1.2 - fresh: 0.5.2 - merge-descriptors: 1.0.1 - methods: 1.1.2 - mime: 1.6.0 - parseurl: 1.3.3 - range-parser: 1.2.1 - type-is: 1.6.18 - dev: true - - /node-plop@0.26.3: - resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} - engines: {node: '>=8.9.4'} - dependencies: - '@babel/runtime-corejs3': 7.21.5 - '@types/inquirer': 6.5.0 - change-case: 3.1.0 - del: 5.1.0 - globby: 10.0.2 - handlebars: 4.7.7 - inquirer: 7.3.3 - isbinaryfile: 4.0.10 - lodash.get: 4.4.2 - mkdirp: 0.5.6 - resolve: 1.22.2 - - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - - /oauth@0.9.15: - resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} - dev: false - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /object-hash@2.2.0: - resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} - engines: {node: '>= 6'} - dev: false - - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 - dev: true - - /object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} - dependencies: - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /oidc-token-hash@5.0.3: - resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} - engines: {node: ^10.13.0 || >=12.0.0} - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} - dependencies: - default-browser: 4.0.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 2.2.0 - dev: true - - /openid-client@5.4.2: - resolution: {integrity: sha512-lIhsdPvJ2RneBm3nGBBhQchpe3Uka//xf7WPHTIglery8gnckvW7Bd9IaQzekzXJvWthCMyi/xVEyGW0RFPytw==} - dependencies: - jose: 4.14.4 - lru-cache: 6.0.0 - object-hash: 2.2.0 - oidc-token-hash: 5.0.3 - dev: false - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /ora@4.1.1: - resolution: {integrity: sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==} - engines: {node: '>=8'} - dependencies: - chalk: 3.0.0 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - log-symbols: 3.0.0 - mute-stream: 0.0.8 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} - dependencies: - aggregate-error: 3.1.0 - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} - engines: {node: '>= 14'} - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 - debug: 4.3.4 - get-uri: 6.0.2 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - pac-resolver: 7.0.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - - /pac-resolver@7.0.0: - resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} - engines: {node: '>= 14'} - dependencies: - degenerator: 5.0.1 - ip: 1.1.8 - netmask: 2.0.2 - - /param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} - dependencies: - no-case: 2.3.2 - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - dev: false - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.12.11 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true - - /pascal-case@2.0.1: - resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} - dependencies: - camel-case: 3.0.0 - upper-case-first: 1.1.2 - - /path-case@2.1.1: - resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} - dependencies: - no-case: 2.3.2 - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - /pathfinding@0.4.18: - resolution: {integrity: sha512-R0TGEQ9GRcFCDvAWlJAWC+KGJ9SLbW4c0nuZRcioVlXVTlw+F5RvXQ8SQgSqI9KXWC1ew95vgmIiyaWTlCe9Ag==} - dependencies: - heap: 0.2.5 - dev: false - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true - - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: false - - /preact-render-to-string@5.2.6(preact@10.15.1): - resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} - peerDependencies: - preact: '>=10' - dependencies: - preact: 10.15.1 - pretty-format: 3.8.0 - dev: false - - /preact@10.15.1: - resolution: {integrity: sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==} - dev: false - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier-plugin-packagejson@2.4.6: - resolution: {integrity: sha512-5JGfzkJRL0DLNyhwmiAV9mV0hZLHDwddFCs2lc9CNxOChpoWUQVe8K4qTMktmevmDlMpok2uT10nvHUyU59sNw==} - peerDependencies: - prettier: '>= 1.16.0' - peerDependenciesMeta: - prettier: - optional: true - dependencies: - sort-package-json: 2.6.0 - synckit: 0.8.5 - dev: true - - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /pretty-format@3.8.0: - resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - dev: false - - /prismjs@1.27.0: - resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} - engines: {node: '>=6'} - dev: false - - /prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - dev: false - - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - dev: true - - /property-information@5.6.0: - resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - dependencies: - xtend: 4.0.2 - dev: false - - /protobufjs@7.2.5: - resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} - engines: {node: '>=12.0.0'} - requiresBuild: true - 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/node': 17.0.45 - long: 5.2.3 - dev: false - - /proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: false - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: true - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - - /react-syntax-highlighter@15.5.0(react@18.2.0): - resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} - peerDependencies: - react: '>= 0.14.0' - dependencies: - '@babel/runtime': 7.21.5 - highlight.js: 10.7.3 - lowlight: 1.20.0 - prismjs: 1.29.0 - react: 18.2.0 - refractor: 3.6.0 - dev: false - - /react@17.0.2: - resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - dev: true - - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: false - - /reactflow@11.9.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-GiIo20Vgy1U4h1NlLyQChWYgsl2OQkEgKHjokyQsdmm1nidywTr0n94O6w97ixLljKzJynTMjDdWP0p8xkq6NQ==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/background': 11.3.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/controls': 11.2.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/core': 11.9.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/minimap': 11.7.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-resizer': 2.2.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-toolbar': 1.3.3(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.3 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: false - - /reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 - globalthis: 1.0.3 - which-builtin-type: 1.1.3 - dev: true - - /refractor@3.6.0: - resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} - dependencies: - hastscript: 6.0.0 - parse-entities: 2.0.0 - prismjs: 1.27.0 - dev: false - - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true - - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - set-function-name: 2.0.1 - dev: true - - /registry-auth-token@3.3.2: - resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} - dependencies: - rc: 1.2.8 - safe-buffer: 5.2.1 - - /registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} - dependencies: - rc: 1.2.8 - - /regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - dev: true - - /resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - dev: true - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - dev: false - - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} - dependencies: - execa: 5.1.1 - dev: true - - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false - - /rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - dependencies: - tslib: 1.14.1 - - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.5.0 - - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-regex: 1.1.4 - dev: true - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - /sass@1.63.6: - resolution: {integrity: sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - chokidar: 3.5.3 - immutable: 4.3.0 - source-map-js: 1.0.2 - dev: false - - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /sentence-case@2.1.1: - resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} - dependencies: - no-case: 2.3.2 - upper-case-first: 1.1.2 - - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.0 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - /snake-case@2.1.0: - resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} - dependencies: - no-case: 2.3.2 - - /socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} - dependencies: - ip: 2.0.0 - smart-buffer: 4.2.0 - - /sort-object-keys@1.1.3: - resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - dev: true - - /sort-package-json@2.6.0: - resolution: {integrity: sha512-XSQ+lY9bAYA8ZsoChcEoPlgcSMaheziEp1beox1JVxy1SV4F2jSq9+h2rJ+3mC/Dhu9Ius1DLnInD5AWcsDXZw==} - hasBin: true - dependencies: - detect-indent: 7.0.1 - detect-newline: 4.0.1 - get-stdin: 9.0.0 - git-hooks-list: 3.1.0 - globby: 13.1.4 - is-plain-obj: 4.1.0 - sort-object-keys: 1.1.3 - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - /space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - dev: false - - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 - dev: true - - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 - dev: true - - /spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} - dev: true - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false - - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - /string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - regexp.prototype.flags: 1.5.1 - side-channel: 1.0.4 - dev: true - - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /styled-jsx@5.1.1(@babel/core@7.23.2)(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - dependencies: - '@babel/core': 7.23.2 - client-only: 0.0.1 - react: 18.2.0 - dev: false - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - /swap-case@1.1.2: - resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} - dependencies: - lower-case: 1.1.4 - upper-case: 1.1.3 - - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/utils': 2.4.0 - tslib: 2.5.0 - dev: true - - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - - /tinygradient@1.1.5: - resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} - dependencies: - '@types/tinycolor2': 1.4.5 - tinycolor2: 1.6.0 - - /title-case@2.1.1: - resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - dev: true - - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /ts-api-utils@1.0.3(typescript@4.9.5): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 4.9.5 - dev: true - - /ts-error@1.0.6: - resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} - dev: false - - /ts-jest@29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@4.9.5): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.23.2 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@17.0.45) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 4.9.5 - yargs-parser: 21.1.1 - dev: true - - /ts-node@10.9.1(@types/node@17.0.45)(typescript@4.9.5): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - 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 - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 17.0.45 - acorn: 8.11.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.9.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - - /tsutils@3.21.0(typescript@4.9.5): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - 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' - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - dev: true - - /turbo-darwin-64@1.10.16: - resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /turbo-darwin-arm64@1.10.16: - resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /turbo-linux-64@1.10.16: - resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /turbo-linux-arm64@1.10.16: - resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /turbo-windows-64@1.10.16: - resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /turbo-windows-arm64@1.10.16: - resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /turbo@1.10.16: - resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} - hasBin: true - optionalDependencies: - turbo-darwin-64: 1.10.16 - turbo-darwin-arm64: 1.10.16 - turbo-linux-64: 1.10.16 - turbo-linux-arm64: 1.10.16 - turbo-windows-64: 1.10.16 - turbo-windows-arm64: 1.10.16 - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: true - - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - 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.12 - dev: true - - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.12 - dev: true - - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - optional: true - - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 - - /update-check@1.5.4: - resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} - dependencies: - registry-auth-token: 3.3.2 - registry-url: 3.1.0 - - /upper-case-first@1.1.2: - resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} - dependencies: - upper-case: 1.1.3 - - /upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: true - - /use-sync-external-store@1.2.0(react@18.2.0): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: false - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - /v8-to-istanbul@9.1.3: - resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.19 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 2.0.0 - dev: true - - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - - /validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - builtins: 5.0.1 - - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: false - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.0 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.11 - dev: true - - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} - engines: {node: '>= 0.4'} - 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 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: false - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - 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.8 - yargs-parser: 21.1.1 - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - - /zustand@4.4.3(@types/react@18.2.5)(react@18.2.0): - resolution: {integrity: sha512-oRy+X3ZazZvLfmv6viIaQmtLOMeij1noakIsK/Y47PWYhT8glfXzQ4j0YcP5i0P0qI1A4rIB//SGROGyZhx91A==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - dependencies: - '@types/react': 18.2.5 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - dev: false diff --git a/dashboard/pnpm-workspace.yaml b/dashboard/pnpm-workspace.yaml deleted file mode 100644 index 3ff5faaaf..000000000 --- a/dashboard/pnpm-workspace.yaml +++ /dev/null @@ -1,3 +0,0 @@ -packages: - - "apps/*" - - "packages/*" diff --git a/dashboard/postcss.config.js b/dashboard/postcss.config.js new file mode 100644 index 000000000..33ad091d2 --- /dev/null +++ b/dashboard/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/Diagram.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/Diagram.tsx new file mode 100644 index 000000000..709d5eaaf --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/Diagram.tsx @@ -0,0 +1,76 @@ +'use client' +import { ThreadRunWithNodeRuns } from '@/app/(authenticated)/(diagram)/wfRun/[...ids]/getWfRun' +import { NodeRun } from 'littlehorse-client/dist/proto/node_run' +import { WfRun } from 'littlehorse-client/dist/proto/wf_run' +import { WfSpec } from 'littlehorse-client/dist/proto/wf_spec' +import { FC, useCallback, useEffect, useMemo, useState } from 'react' +import ReactFlow, { Controls, useEdgesState, useNodesState } from 'reactflow' +import 'reactflow/dist/base.css' +import { ThreadProvider, ThreadType } from '../context' +import { edgeTypes } from './EdgeTypes' +import { extractEdges } from './EdgeTypes/extractEdges' +import { Layouter } from './Layouter' +import nodeTypes from './NodeTypes' +import { extractNodes } from './NodeTypes/extractNodes' +import { ThreadPanel } from './ThreadPanel' + +type Props = { + wfRun?: WfRun & { threadRuns: ThreadRunWithNodeRuns[] } + nodeRuns?: NodeRun[] + spec: WfSpec +} + +export const Diagram: FC = ({ spec, wfRun }) => { + const currentThread = wfRun + ? wfRun.threadRuns[wfRun.greatestThreadrunNumber].threadSpecName + : spec.entrypointThreadName + const [thread, setThread] = useState({ name: currentThread, number: wfRun?.greatestThreadrunNumber || 0 }) + + const threadSpec = useMemo(() => { + if (thread === undefined) return spec.threadSpecs[spec.entrypointThreadName] + return spec.threadSpecs[thread.name] + }, [spec, thread]) + + const [edges, setEdges] = useEdgesState(extractEdges(threadSpec)) + const [nodes, setNodes] = useNodesState(extractNodes(threadSpec)) + + const threadNodeRuns = useMemo(() => { + if (!wfRun) return + return wfRun.threadRuns[thread.number].nodeRuns + }, [thread, wfRun]) + + const updateGraph = useCallback(() => { + const { name } = thread + const threadSpec = spec.threadSpecs[name] + const nodes = extractNodes(threadSpec) + const edges = extractEdges(threadSpec) + setNodes(nodes) + setEdges(edges) + }, [spec.threadSpecs, thread, setNodes, setEdges]) + + useEffect(() => { + updateGraph() + }, [updateGraph]) + + return ( + + +
+ + + + +
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/Default.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/Default.tsx new file mode 100644 index 000000000..3ed9e55e9 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/Default.tsx @@ -0,0 +1,48 @@ +import { FC, memo } from 'react' +import { BaseEdge, EdgeLabelRenderer, Position, SmoothStepEdgeProps, getSmoothStepPath } from 'reactflow' + +const Default: FC = ({ + id, + sourceX, + sourceY, + targetX, + targetY, + label, + pathOptions, + style, + data, + sourcePosition = Position.Bottom, + targetPosition = Position.Top, + ...rest +}) => { + const [path, labelX, labelY] = getSmoothStepPath({ + sourceX, + sourceY, + sourcePosition, + targetX, + targetY, + targetPosition, + borderRadius: pathOptions?.borderRadius, + offset: pathOptions?.offset, + }) + + return ( + <> + + +
+ {label} +
+
+ + ) +} + +export const DefaultEdge = memo(Default) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/EdgeDetails.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/EdgeDetails.tsx new file mode 100644 index 000000000..5d80114cd --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/EdgeDetails.tsx @@ -0,0 +1,22 @@ +import React, { CSSProperties, FC, PropsWithChildren } from 'react' + +export const EdgeDetails: FC> = ({ + children, + labelX, + labelY, + id, +}) => { + const wrapperStyle: CSSProperties = { + position: 'absolute', + transform: `translate(${labelX}px, ${labelY}px) translate(-50%, 0%)`, + zIndex: 9999, + } + return ( +
+ {children} +
+
+
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/extractEdges.ts b/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/extractEdges.ts new file mode 100644 index 000000000..a22807068 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/extractEdges.ts @@ -0,0 +1,59 @@ +import { getVariable } from '@/app/utils' +import { Comparator } from 'littlehorse-client/dist/proto/common_wfspec' +import { Edge as EdgeProto, ThreadSpec } from 'littlehorse-client/dist/proto/wf_spec' +import { Edge, MarkerType } from 'reactflow' + +export const extractEdges = (spec: ThreadSpec): Edge[] => { + const targetMap = new Map() + const sourceMap = new Map() + return Object.entries(spec.nodes).flatMap(([source, node]) => { + return node.outgoingEdges.map(edge => { + const sourceIndex = sourceMap.get(source) ?? 0 + let targetIndex = targetMap.get(edge.sinkNodeName) ?? 0 + const sourceTarget = sourceMap.get(edge.sinkNodeName) ?? 0 + + if (sourceTarget > 0 && targetIndex !== 0) targetIndex++ + const edgeId = `${source}-${edge.sinkNodeName}` + const id = sourceIndex === 0 && targetIndex === 0 ? edgeId : `${edgeId}-${sourceIndex}-${targetIndex}` + targetMap.set(edge.sinkNodeName, targetIndex + 1) + sourceMap.set(source, sourceIndex + 1) + + const label = extractEdgeLabel(edge) + return { + id, + source, + type: 'default', + target: edge.sinkNodeName, + label, + data: edge, + targetHandle: `target-${targetIndex}`, + sourceHandle: `source-${sourceIndex}`, + markerEnd: { + type: MarkerType.ArrowClosed, + }, + animated: true, + arrowHeadType: 'arrowclosed', + } + }) + }) +} + +const extractEdgeLabel = ({ condition }: EdgeProto) => { + if (!condition) return + + const { left, right, comparator } = condition + return `${getVariable(left)} ${getComparator(comparator)} ${getVariable(right)}` +} + +const getComparator = (comparator: Comparator) => Conditions[comparator] +export const Conditions: Record = { + [Comparator.LESS_THAN]: '<', + [Comparator.GREATER_THAN]: '>', + [Comparator.LESS_THAN_EQ]: '<=', + [Comparator.GREATER_THAN_EQ]: '>=', + [Comparator.EQUALS]: '=', + [Comparator.NOT_EQUALS]: '!=', + [Comparator.IN]: 'IN', + [Comparator.NOT_IN]: 'NOT IN', + [Comparator.UNRECOGNIZED]: '', +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/index.ts b/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/index.ts new file mode 100644 index 000000000..be68c61b4 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/EdgeTypes/index.ts @@ -0,0 +1,6 @@ +import { EdgeTypes } from 'reactflow' +import { DefaultEdge } from './Default' + +export const edgeTypes: EdgeTypes = { + default: DefaultEdge, +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/Layouter.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/Layouter.tsx new file mode 100644 index 000000000..1c72dfa61 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/Layouter.tsx @@ -0,0 +1,57 @@ +import dagre from 'dagre' +import { NodeRun } from 'littlehorse-client/dist/proto/node_run' +import { FC, useCallback, useEffect } from 'react' +import { Edge, Node, useReactFlow, useStore } from 'reactflow' + +export const Layouter: FC<{ nodeRuns?: NodeRun[] }> = ({ nodeRuns }) => { + const nodes = useStore(store => store.getNodes()) + const edges = useStore(store => store.edges) + const setNodes = useStore(store => store.setNodes) + const { fitView } = useReactFlow() + + const onLoad = useCallback( + (nodes: Node[], edges: Edge[]) => { + const dagreGraph = new dagre.graphlib.Graph() + dagreGraph.setDefaultEdgeLabel(() => ({})) + dagreGraph.setGraph({ rankdir: 'LR', align: 'UL', ranksep: 100 }) + nodes.forEach(node => { + dagreGraph.setNode(node.id, { width: node.width, height: node.height }) + }) + + edges.forEach(edge => { + dagreGraph.setEdge(edge.source, edge.target, { width: edge.label ? 200 : undefined }) + }) + + dagre.layout(dagreGraph) + + const layoutedNodes = nodes.map(node => { + const nodeWithPosition = dagreGraph.node(node.id) + const nodeRun = nodeRuns?.find(nodeRun => { + return nodeRun.nodeName === node.id + }) + const fade = nodeRuns !== undefined && nodeRun === undefined + return { + ...node, + data: { ...node.data, nodeRun, fade }, + position: { x: nodeWithPosition.x - node.width! / 2, y: nodeWithPosition.y - node.height! / 2 }, + layouted: true, + } + }) + + setNodes(layoutedNodes) + fitView() + }, + [fitView, nodeRuns, setNodes] + ) + + useEffect(() => { + if ( + nodes.some( + (node: Node & { layouted?: boolean }) => node.width !== undefined && node.height !== undefined && !node.layouted + ) + ) { + onLoad(nodes, edges) + } + }, [nodes, edges, onLoad]) + return <> +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/Modals/Modals.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/Modals/Modals.tsx new file mode 100644 index 000000000..cbb372d24 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/Modals/Modals.tsx @@ -0,0 +1,10 @@ +import { FC } from 'react' +import { ModalComponents } from '.' +import { useModal } from '../../hooks/useModal' + +export const Modals: FC = () => { + const { modal } = useModal() + if (!modal) return null + const Component = ModalComponents[modal.type] + return +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/Modals/TaskRun.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/Modals/TaskRun.tsx new file mode 100644 index 000000000..9794ec2c3 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/Modals/TaskRun.tsx @@ -0,0 +1,69 @@ +import { getVariableValue } from '@/app/utils' +import { Dialog } from '@headlessui/react' +import { ClipboardDocumentIcon } from '@heroicons/react/24/outline' +import { FC, useMemo, useState } from 'react' +import { Modal } from '../../context' +import { useModal } from '../../hooks/useModal' + +export const TaskRun: FC = ({ data }) => { + const { showModal, setShowModal } = useModal() + const [attemptIndex, setAttemptIndex] = useState(data.attempts.length - 1) + const attempt = useMemo(() => data.attempts[attemptIndex], [attemptIndex, data.attempts]) + return ( + setShowModal(false)}> + + ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/Modals/index.ts b/dashboard/src/app/(authenticated)/(diagram)/components/Modals/index.ts new file mode 100644 index 000000000..6fe97e6e2 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/Modals/index.ts @@ -0,0 +1,13 @@ +import { FC } from 'react' +import { Modal } from '../../context' +import { TaskRun } from './TaskRun' + +export * from './Modals' + +export type ModalComponent = FC + +export const ModalComponents = { + taskRun: TaskRun, +} as const + +export type ModalType = keyof typeof ModalComponents diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Entrypoint.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Entrypoint.tsx new file mode 100644 index 000000000..73f73b23a --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Entrypoint.tsx @@ -0,0 +1,12 @@ +import { FC, memo } from 'react' +import { Handle, Position } from 'reactflow' + +const EntrypointNode: FC = ({}) => { + return ( +
+ +
+ ) +} + +export const Entrypoint = memo(EntrypointNode) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Exit.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Exit.tsx new file mode 100644 index 000000000..74df62e37 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Exit.tsx @@ -0,0 +1,36 @@ +import { FC, memo } from 'react' +import { Handle, Position } from 'reactflow' + +import { LHStatus } from 'littlehorse-client/dist/proto/common_enums' +import { NodeProps } from '.' +import { Fade } from './Fade' +import { NodeDetails } from './NodeDetails' + +const ExitNode: FC = ({ data }) => { + const { fade } = data + const failureDef = data.exit?.failureDef + return ( + + {failureDef && ( + +
+

FailureDef

+ {failureDef.failureName} +
+
+
+              {failureDef.message}
+            
+
+
+ )} +
+ +
+
+ ) +} + +export const Exit = memo(ExitNode) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/ExternalEvent.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/ExternalEvent.tsx new file mode 100644 index 000000000..da6a042e1 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/ExternalEvent.tsx @@ -0,0 +1,51 @@ +import { EnvelopeOpenIcon } from '@heroicons/react/24/outline' +import { Node as NodeProto } from 'littlehorse-client/dist/proto/wf_spec' +import { FC, memo } from 'react' +import { Handle, Position } from 'reactflow' +import { NodeProps } from '.' +import { Fade } from './Fade' +import { NodeDetails } from './NodeDetails' +import Link from 'next/link' +import { ArrowTopRightOnSquareIcon } from '@heroicons/react/24/solid' + +const Node: FC> = ({ data }) => { + if (!data.externalEvent) return null + const { fade, externalEvent } = data + + return ( + <> + +
+
+

ExternalEventDef

+ + {externalEvent.externalEventDefId?.name} + +
+
+
+ +
+
+
+ +
+
+ + +
+
{data.externalEvent?.externalEventDefId?.name}
+
+
+
+ + ) +} + +export const ExternalEvent = memo(Node) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Fade.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Fade.tsx new file mode 100644 index 000000000..c9e777e41 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Fade.tsx @@ -0,0 +1,13 @@ +import { LHStatus } from 'littlehorse-client/dist/proto/common_enums' +import { FC, PropsWithChildren } from 'react' +import { StatusPin } from './StatusPin' + +type Props = PropsWithChildren<{ fade?: boolean; status?: LHStatus }> +export const Fade: FC = ({ fade, status, children }) => { + return ( +
+ +
{children}
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/NodeDetails.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/NodeDetails.tsx new file mode 100644 index 000000000..bc0104d27 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/NodeDetails.tsx @@ -0,0 +1,49 @@ +import { CSSProperties, FC, PropsWithChildren, useEffect, useMemo } from 'react' +import { internalsSymbol, useNodeId, useStore } from 'reactflow' + +type Props = PropsWithChildren<{}> + +export const NodeDetails: FC = ({ children }) => { + const contextNodeId = useNodeId() + const nodes = useStore(state => state.getNodes()) + const setNodes = useStore(state => state.setNodes) + const selectedNode = useMemo( + () => nodes.find(node => node.selected && node.id === contextNodeId), + [contextNodeId, nodes] + ) + + useEffect(() => { + if (selectedNode && selectedNode.zIndex !== 9999) { + setNodes( + nodes.map(node => { + if (node.selected) { + return { ...node, zIndex: 9999 } + } else { + return { ...node, zIndex: 1 } + } + }) + ) + } + }, [nodes, selectedNode, setNodes]) + + const zIndex: number = Math.max(...nodes.map(node => (node[internalsSymbol]?.z || 1) + 10)) + if (!selectedNode) { + return null + } + + const wrapperStyle: CSSProperties = { + position: 'absolute', + bottom: selectedNode.height!, + transform: `translate(${selectedNode.width! / 2}px, 0px) translate(-50%, 0%)`, + zIndex, + } + + return ( +
+
{children}
+
+
+
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Nop.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Nop.tsx new file mode 100644 index 000000000..d35abbd3a --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Nop.tsx @@ -0,0 +1,23 @@ +import { FC, memo } from 'react' +import { Handle, Position } from 'reactflow' +import { NodeProps } from '.' +import { Fade } from './Fade' + +const NopNode: FC = ({ data }) => { + const { fade } = data + return ( + +
+
+ + + + + + +
+
+ ) +} + +export const Nop = memo(NopNode) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Sleep.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Sleep.tsx new file mode 100644 index 000000000..ea3140648 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Sleep.tsx @@ -0,0 +1,23 @@ +import { ClockIcon } from '@heroicons/react/24/outline' +import { FC, memo } from 'react' +import { Handle, Position } from 'reactflow' +import { NodeProps } from '.' +import { Fade } from './Fade' + +const Node: FC = ({ data }) => { + const { fade } = data + return ( + +
+
+ +
+ + + +
+
+ ) +} + +export const Sleep = memo(Node) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StartMultipleThreads.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StartMultipleThreads.tsx new file mode 100644 index 000000000..4a5e4aa69 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StartMultipleThreads.tsx @@ -0,0 +1,79 @@ +import { getVariable } from '@/app/utils' +import { PlusIcon } from '@heroicons/react/16/solid' +import { FC, memo } from 'react' +import { Handle, Position } from 'reactflow' +import { NodeProps } from '.' +import { useThread } from '../../hooks/useThread' +import { Fade } from './Fade' +import { NodeDetails } from './NodeDetails' + +const Node: FC = ({ data }) => { + const { fade } = data + const { setThread } = useThread() + if (data.startMultipleThreads === undefined) return + const variables = Object.entries(data.startMultipleThreads.variables) + return ( + <> + +
+

StartMultipleThread

+ {data.nodeRun === undefined ? ( + + ) : ( +
{data.startMultipleThreads?.threadSpecName}
+ )} +
+
+ Iterable: {getVariable(data.startMultipleThreads.iterable)} +
+ {variables.length > 0 && ( +
+

Variables

+
    + {variables.map(([name, value]) => ( +
  • + {`{${name}}`} {getVariable(value)} +
  • + ))} +
+
+ )} + + {data.nodeRun && ( +
+

Thread Runs

+
    + {data.nodeRun.startMultipleThreads?.childThreadIds.map(number => ( +
  • { + setThread({ name: data.startMultipleThreads?.threadSpecName || '', number }) + }} + key={number} + > + {data.nodeRun?.startMultipleThreads?.threadSpecName}-{number} +
  • + ))} +
+
+ )} +
+ +
+
+ +
+
+ + +
+ + ) +} + +export const StartMultipleThreads = memo(Node) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StartThread.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StartThread.tsx new file mode 100644 index 000000000..15566c780 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StartThread.tsx @@ -0,0 +1,53 @@ +import { getVariable } from '@/app/utils' +import { PlusIcon } from '@heroicons/react/16/solid' +import { FC, memo } from 'react' +import { Handle, Position } from 'reactflow' +import { NodeProps } from '.' +import { useThread } from '../../hooks/useThread' +import { Fade } from './Fade' +import { NodeDetails } from './NodeDetails' + +const Node: FC = ({ data }) => { + const { fade } = data + const { setThread } = useThread() + if (data.startThread === undefined) return + const variables = Object.entries(data.startThread.variables) + return ( + <> + +
+

StartThread

+ +
+ {variables.length > 0 && ( +
+

Variables

+
    + {variables.map(([name, value]) => ( +
  • + {`{${name}}`} = {getVariable(value)} +
  • + ))} +
+
+ )} +
+ +
+
+ +
+
+ + +
+ + ) +} + +export const StartThread = memo(Node) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StatusPin.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StatusPin.tsx new file mode 100644 index 000000000..7e2a92cf7 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/StatusPin.tsx @@ -0,0 +1,66 @@ +import { + ExclamationTriangleIcon, + XCircleIcon, + BugAntIcon, + CheckIcon, + EllipsisHorizontalIcon, + PlayIcon, + PlayPauseIcon, + StopIcon, +} from '@heroicons/react/24/outline' +import { LHStatus } from 'littlehorse-client/dist/proto/common_enums' +import React, { FC } from 'react' + +type Pin = { + color: string + Icon: React.ForwardRefExoticComponent< + React.PropsWithoutRef> & { + title?: string + titleId?: string + } & React.RefAttributes + > +} +const Status: Record = { + [LHStatus.STARTING]: { + color: 'blue', + Icon: EllipsisHorizontalIcon, + }, + [LHStatus.RUNNING]: { + color: 'green', + Icon: PlayIcon, + }, + [LHStatus.COMPLETED]: { + color: 'green', + Icon: CheckIcon, + }, + [LHStatus.HALTING]: { + color: 'gray', + Icon: PlayPauseIcon, + }, + [LHStatus.HALTED]: { + color: 'gray', + Icon: StopIcon, + }, + [LHStatus.ERROR]: { + color: 'red', + Icon: XCircleIcon, + }, + [LHStatus.EXCEPTION]: { + color: 'orange', + Icon: ExclamationTriangleIcon, + }, + [LHStatus.UNRECOGNIZED]: { + color: 'gray', + Icon: BugAntIcon, + }, +} + +export const StatusPin: FC<{ status?: LHStatus }> = ({ status }) => { + if (!status) return <> + const { color, Icon } = Status[status] + return ( +
+ +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/Task.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/Task.tsx new file mode 100644 index 000000000..a499501c6 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/Task.tsx @@ -0,0 +1,34 @@ +import { getVariable } from '@/app/utils' +import { Cog6ToothIcon } from '@heroicons/react/16/solid' +import { FC, memo } from 'react' +import { Handle, Position } from 'reactflow' +import { NodeProps } from '..' +import { Fade } from '../Fade' +import { TaskDetails } from './TaskDetails' + +const Node: FC = ({ selected, data }) => { + const { fade } = data + if (!data.task) return null + const { task } = data + return ( + <> + + +
+ + {task.taskDefId?.name} + {getVariable(task.dynamicTask)} + + +
+
+ + ) +} + +export const Task = memo(Node) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/TaskDetails.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/TaskDetails.tsx new file mode 100644 index 000000000..3340f6f12 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/TaskDetails.tsx @@ -0,0 +1,91 @@ +import { getVariable } from '@/app/utils' +import { ArrowTopRightOnSquareIcon, EyeIcon } from '@heroicons/react/24/solid' +import { useQuery } from '@tanstack/react-query' +import { TaskNode } from 'littlehorse-client/dist/proto/common_wfspec' +import { NodeRun } from 'littlehorse-client/dist/proto/node_run' +import Link from 'next/link' +import { FC, useCallback } from 'react' +import { useModal } from '../../../hooks/useModal' +import { NodeDetails } from '../NodeDetails' +import { getTaskRun } from './getTaskRun' + +export const TaskDetails: FC<{ task?: TaskNode; nodeRun?: NodeRun }> = ({ task, nodeRun }) => { + const { data } = useQuery({ + queryKey: ['taskRun', nodeRun], + queryFn: async () => { + if (nodeRun?.task?.taskRunId) return await getTaskRun(nodeRun.task.taskRunId) + }, + }) + + const { setModal, setShowModal } = useModal() + + const onClick = useCallback(() => { + if (data) { + setModal({ type: 'taskRun', data: data }) + setShowModal(true) + } + }, [data, setModal, setShowModal]) + + if (!task) return null + return ( + +
+
+

TaskDef

+ {nodeRun ? ( + + ) : ( + <> + {task.taskDefId && } + {task.dynamicTask && <>{getVariable(task.dynamicTask)}} + + )} +
+
+
Timeout: {task.timeoutSeconds}s
+
Retries: {task.retries}
+
+
+ {task.variables && task.variables.length > 0 && ( +
+

Inputs

+
    + {task.variables.map((variable, i) => ( +
  1. +
    arg{i}
    +
    =
    +
    {getVariable(variable)}
    +
  2. + ))} +
+
+ )} + {nodeRun && nodeRun.errorMessage && ( +
+

Error

+
{nodeRun.errorMessage}
+
+ )} + {nodeRun && ( +
+ +
+ )} +
+ ) +} + +const TaskLink: FC<{ taskName?: string }> = ({ taskName }) => { + return ( + + {taskName} + + ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/getTaskRun.ts b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/getTaskRun.ts new file mode 100644 index 000000000..567f6e7a7 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/getTaskRun.ts @@ -0,0 +1,10 @@ +'use server' +import { lhClient } from '@/app/lhClient' +import { WithTenant } from '@/types' +import { TaskRunId } from 'littlehorse-client/dist/proto/object_id' + +export type TaskRunRequestProps = TaskRunId & WithTenant +export const getTaskRun = async ({ tenantId, ...req }: TaskRunRequestProps) => { + const client = await lhClient({ tenantId }) + return client.getTaskRun(req) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/index.ts b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/index.ts new file mode 100644 index 000000000..2db9097d4 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/Task/index.ts @@ -0,0 +1 @@ +export * from './Task' diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/UserTask.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/UserTask.tsx new file mode 100644 index 000000000..c8e4edaad --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/UserTask.tsx @@ -0,0 +1,61 @@ +import { getVariable } from '@/app/utils' +import { UserIcon } from '@heroicons/react/16/solid' +import { ArrowTopRightOnSquareIcon } from '@heroicons/react/24/solid' +import Link from 'next/link' +import { FC, memo } from 'react' +import { Handle, Position } from 'reactflow' +import { NodeProps } from '.' +import { Fade } from './Fade' +import { NodeDetails } from './NodeDetails' + +const Node: FC = ({ data, selected }) => { + if (!data.userTask) return null + const { fade, userTask } = data + return ( + <> + +
+
+

UserTask

+ + {userTask.userTaskDefName} + +
+
+ {userTask.userGroup && ( +
Group: {getVariable(userTask.userGroup)}
+ )} + {userTask.userId && ( +
User: {getVariable(userTask.userId)}
+ )} +
+ {userTask.notes && ( +
+

Notes

+
{getVariable(userTask.notes)}
+
+ )} +
+
+ +
+ + {data.userTask?.userTaskDefName} + + +
+
+ + ) +} + +export const UserTask = memo(Node) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/WaitForThreads.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/WaitForThreads.tsx new file mode 100644 index 000000000..fa117db17 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/WaitForThreads.tsx @@ -0,0 +1,48 @@ +import { getVariable } from '@/app/utils' +import { PlusIcon } from '@heroicons/react/16/solid' +import { FC, memo } from 'react' +import { Handle, Position } from 'reactflow' +import { NodeProps } from '.' +import { Fade } from './Fade' +import { NodeDetails } from './NodeDetails' + +const Node: FC = ({ data }) => { + const { fade } = data + return ( + <> + +
+

WaitForThreads

+
+ {data.waitForThreads?.threadList && ( +
{getVariable(data.waitForThreads?.threadList)}
+ )} + {data.waitForThreads?.threads?.threads.map(thread => ( +
+ {getVariable(thread.threadRunNumber)} +
+ ))} + {data.nodeRun && data.nodeRun.errorMessage && ( +
+

Error

+
{data.nodeRun.errorMessage}
+
+ )} +
+ +
+
+ +
+ + +
+
+ + ) +} + +export const WaitForThreads = memo(Node) diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/extractNodes.ts b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/extractNodes.ts new file mode 100644 index 000000000..118a2d9e1 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/extractNodes.ts @@ -0,0 +1,71 @@ +import { Node as NodeProto, ThreadSpec } from 'littlehorse-client/dist/proto/wf_spec' +import { Node, NodeProps } from 'reactflow' + +export const extractNodes = (spec: ThreadSpec): Node[] => { + return Object.entries(spec.nodes).map(([id, node]) => { + const type = getNodeType(node) + return { + id, + type, + data: { ...node, ...extractData(type, node) }, + position: { x: 0, y: 0 }, + } + }) +} + +const extractData = (type: NodeType, node: NodeProto) => { + switch (type) { + case 'ENTRYPOINT': + return node.entrypoint + case 'EXIT': + return node.exit + case 'TASK': + return node.task + case 'EXTERNAL_EVENT': + return node.externalEvent + case 'START_THREAD': + return node.startThread + case 'WAIT_FOR_THREADS': + return node.waitForThreads + case 'NOP': + return node.nop + case 'SLEEP': + return node.sleep + case 'USER_TASK': + return node.userTask + case 'START_MULTIPLE_THREADS': + return node.startMultipleThreads + case 'THROW_EVENT': + return node.throwEvent + } +} + +export type NodeType = + | 'ENTRYPOINT' + | 'EXIT' + | 'TASK' + | 'EXTERNAL_EVENT' + | 'START_THREAD' + | 'WAIT_FOR_THREADS' + | 'NOP' + | 'SLEEP' + | 'USER_TASK' + | 'START_MULTIPLE_THREADS' + | 'THROW_EVENT' + | 'UNKNOWN_NODE_TYPE' +const getNodeType = (node: NodeProto): NodeType => { + if (node['exit'] !== undefined) return 'EXIT' + if (node['task'] !== undefined) return 'TASK' + if (node['externalEvent'] !== undefined) return 'EXTERNAL_EVENT' + if (node['startThread'] !== undefined) return 'START_THREAD' + if (node['waitForThreads'] !== undefined) return 'WAIT_FOR_THREADS' + if (node['nop'] !== undefined) return 'NOP' + if (node['sleep'] !== undefined) return 'SLEEP' + if (node['userTask'] !== undefined) return 'USER_TASK' + if (node['entrypoint'] !== undefined) return 'ENTRYPOINT' + if (node['startMultipleThreads'] !== undefined) return 'START_MULTIPLE_THREADS' + if (node['throwEvent'] !== undefined) return 'THROW_EVENT' + return 'UNKNOWN_NODE_TYPE' +} + +export type NodeData = NodeProps diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/index.ts b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/index.ts new file mode 100644 index 000000000..e52d6302d --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/NodeTypes/index.ts @@ -0,0 +1,33 @@ +import { NodeRun } from 'littlehorse-client/dist/proto/node_run' +import { Node } from 'littlehorse-client/dist/proto/wf_spec' +import { ComponentType } from 'react' +import { NodeProps as NodeFlow } from 'reactflow' +import { Entrypoint } from './Entrypoint' +import { Exit } from './Exit' +import { ExternalEvent } from './ExternalEvent' +import { Nop } from './Nop' +import { Sleep } from './Sleep' +import { StartMultipleThreads } from './StartMultipleThreads' +import { StartThread } from './StartThread' +import { Task } from './Task' +import { UserTask } from './UserTask' +import { WaitForThreads } from './WaitForThreads' +import { NodeType } from './extractNodes' + +const nodeTypes: Record> = { + ENTRYPOINT: Entrypoint, + TASK: Task, + NOP: Nop, + EXIT: Exit, + EXTERNAL_EVENT: ExternalEvent, + START_THREAD: StartThread, + WAIT_FOR_THREADS: WaitForThreads, + SLEEP: Sleep, + USER_TASK: UserTask, + START_MULTIPLE_THREADS: StartMultipleThreads, + THROW_EVENT: WaitForThreads, + UNKNOWN_NODE_TYPE: WaitForThreads, +} + +export type NodeProps = NodeFlow +export default nodeTypes diff --git a/dashboard/src/app/(authenticated)/(diagram)/components/ThreadPanel.tsx b/dashboard/src/app/(authenticated)/(diagram)/components/ThreadPanel.tsx new file mode 100644 index 000000000..88a36329a --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/components/ThreadPanel.tsx @@ -0,0 +1,71 @@ +import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/24/solid' +import { WfRun } from 'littlehorse-client/dist/proto/wf_run' +import { WfSpec } from 'littlehorse-client/dist/proto/wf_spec' +import { FC, useEffect, useMemo } from 'react' +import { useScrollbar } from '../hooks/useScrollbar' +import { useThread } from '../hooks/useThread' + +export const ThreadPanel: FC<{ spec: WfSpec; wfRun?: WfRun }> = ({ spec, wfRun }) => { + const { thread, setThread } = useThread() + const threads = useMemo(() => extractThreads(spec, wfRun), [spec, wfRun]) + const { scroll, itemsRef, containerRef, maxScroll, scrollLeft, scrollRight } = useScrollbar() + + return ( +
+
+ +
+
+
+ {threads.map(({ name, number }) => ( + + ))} +
+
+
= maxScroll ? 'hidden' : ''}`} + > + +
+
+ ) +} + +const extractThreads = (spec: WfSpec, wfRun?: WfRun): { name: string; number?: number }[] => { + if (wfRun) { + return wfRun.threadRuns.map(threadRun => ({ + name: threadRun.threadSpecName, + number: threadRun.number, + })) + } + return Object.keys(spec.threadSpecs).map(name => ({ name })) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/context/ModalContext.tsx b/dashboard/src/app/(authenticated)/(diagram)/context/ModalContext.tsx new file mode 100644 index 000000000..a47891b18 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/context/ModalContext.tsx @@ -0,0 +1,23 @@ +import { TaskRun } from 'littlehorse-client/dist/proto/task_run' +import { Dispatch, SetStateAction, createContext } from 'react' +import { ModalType } from '../components/Modals' + +export type Modal = { + type: ModalType + data: TaskRun +} + +type ModalContextType = { + modal: Modal | null + setModal: Dispatch> + showModal: boolean + setShowModal: Dispatch> +} +export const ModalContext = createContext({ + modal: null, + setModal: () => {}, + showModal: false, + setShowModal: () => {}, +}) + +export const ModalProvider = ModalContext.Provider diff --git a/dashboard/src/app/(authenticated)/(diagram)/context/ThreadContext.tsx b/dashboard/src/app/(authenticated)/(diagram)/context/ThreadContext.tsx new file mode 100644 index 000000000..95be9d549 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/context/ThreadContext.tsx @@ -0,0 +1,13 @@ +import { Dispatch, SetStateAction, createContext } from 'react' + +export type ThreadType = { + name: string + number: number +} +type ThreadContextType = { + thread: ThreadType + setThread: Dispatch> +} +export const ThreadContext = createContext({ thread: { name: '', number: 0 }, setThread: () => {} }) + +export const ThreadProvider = ThreadContext.Provider diff --git a/dashboard/src/app/(authenticated)/(diagram)/context/index.ts b/dashboard/src/app/(authenticated)/(diagram)/context/index.ts new file mode 100644 index 000000000..e7e696758 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/context/index.ts @@ -0,0 +1,2 @@ +export * from './ModalContext' +export * from './ThreadContext' diff --git a/dashboard/src/app/(authenticated)/(diagram)/hooks/useModal.tsx b/dashboard/src/app/(authenticated)/(diagram)/hooks/useModal.tsx new file mode 100644 index 000000000..20848d542 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/hooks/useModal.tsx @@ -0,0 +1,7 @@ +import { useContext } from 'react' +import { ModalContext } from '../context' + +export const useModal = () => { + const { modal, setModal, showModal, setShowModal } = useContext(ModalContext) + return { modal, setModal, showModal, setShowModal } +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/hooks/useScrollbar.tsx b/dashboard/src/app/(authenticated)/(diagram)/hooks/useScrollbar.tsx new file mode 100644 index 000000000..45288b944 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/hooks/useScrollbar.tsx @@ -0,0 +1,31 @@ +import { useState, useRef, useMemo, useCallback } from "react" + +const SCROLL_STEP = 450 + +export const useScrollbar = () => { + const [scroll, setScroll] = useState(0) + + const itemsRef = useRef(null) + const containerRef = useRef(null) + const maxScroll = useMemo(() => { + if (!itemsRef.current || !containerRef.current) return + return itemsRef.current.getBoundingClientRect().width - containerRef.current?.getBoundingClientRect().width + }, [itemsRef, containerRef]) + + const scrollRight = useCallback(() => { + setScroll(prev => { + if (maxScroll === undefined) return 0 + const newVal = prev - SCROLL_STEP + return newVal <= -maxScroll ? -maxScroll : newVal + }) + }, [maxScroll, setScroll]) + + const scrollLeft = useCallback(() => { + setScroll(prev => { + const newVal = prev + SCROLL_STEP + return newVal > 0 ? 0 : newVal + }) + }, [setScroll]) + + return { scroll, maxScroll, itemsRef, containerRef, scrollRight, scrollLeft } +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/hooks/useThread.tsx b/dashboard/src/app/(authenticated)/(diagram)/hooks/useThread.tsx new file mode 100644 index 000000000..e325d08b2 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/hooks/useThread.tsx @@ -0,0 +1,7 @@ +import { useContext } from 'react' +import { ThreadContext } from '../context' + +export const useThread = () => { + const { thread, setThread } = useContext(ThreadContext) + return { thread, setThread } +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/layout.tsx b/dashboard/src/app/(authenticated)/(diagram)/layout.tsx new file mode 100644 index 000000000..798095e7b --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/layout.tsx @@ -0,0 +1,18 @@ +'use client' +import { useState } from 'react' +import { ReactFlowProvider } from 'reactflow' +import { Modal, ModalProvider } from './context' + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + const [modal, setModal] = useState(null) + const [showModal, setShowModal] = useState(false) + return ( + + {children} + + ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/components/Details.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/components/Details.tsx new file mode 100644 index 000000000..b1781c6b9 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/components/Details.tsx @@ -0,0 +1,52 @@ +'use client' +import { concatWfRunIds, formatDate } from '@/app/utils' +import { WfRun } from 'littlehorse-client/dist/proto/wf_run' +import Link from 'next/link' +import { FC } from 'react' + +type DetailsProps = WfRun + +const statusColors: { [key in WfRun['status']]: string } = { + STARTING: 'bg-teal-200', + RUNNING: 'bg-blue-200', + COMPLETED: 'bg-green-200', + HALTING: 'bg-orange-200', + HALTED: 'bg-gray-200', + ERROR: 'bg-yellow-200', + EXCEPTION: 'bg-red-200', + UNRECOGNIZED: 'bg-gray-200', +} + +export const Details: FC = ({ id, status, wfSpecId, startTime }) => { + return ( +
+ WfRun +

{id?.id}

+ {id?.parentWfRunId && ( +
+ Parent WfRun: + + {id?.parentWfRunId?.id} + +
+ )} +
+
+ WfSpec: + + {`${wfSpecId?.name} ${wfSpecId?.majorVersion}.${wfSpecId?.revision}`} + +
+
+ Status: {`${status}`} +
+
+ Started: {`${formatDate(Date.parse(startTime || ''))}`} +
+
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/components/WfRun.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/components/WfRun.tsx new file mode 100644 index 000000000..d80dbfeca --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/components/WfRun.tsx @@ -0,0 +1,24 @@ +'use client' +import { Diagram } from '@/app/(authenticated)/(diagram)/components/Diagram' +import { Navigation } from '@/app/(authenticated)/components/Navigation' +import { FC } from 'react' +import { WfRunResponse } from '../getWfRun' +import { Details } from './Details' +import { useModal } from '../../../hooks/useModal' +import { Modals } from '../../../components/Modals' + +export const WfRun: FC = ({ wfRun, wfSpec, nodeRuns }) => { + const { modal, showModal } = useModal() + return ( + <> + +
+ + + + + ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/getWfRun.ts b/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/getWfRun.ts new file mode 100644 index 000000000..a2eaed678 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/getWfRun.ts @@ -0,0 +1,46 @@ +'use server' + +import { lhClient } from '@/app/lhClient' +import { NodeRun } from 'littlehorse-client/dist/proto/node_run' +import { WfRunId } from 'littlehorse-client/dist/proto/object_id' +import { ThreadRun, WfRun } from 'littlehorse-client/dist/proto/wf_run' +import { WfSpec } from 'littlehorse-client/dist/proto/wf_spec' +import { cookies } from 'next/headers' + +type Props = { + ids: string[] +} + +export type ThreadRunWithNodeRuns = ThreadRun & { nodeRuns: NodeRun[] } + +export type WfRunResponse = { + wfRun: WfRun & { threadRuns: ThreadRunWithNodeRuns[] } + wfSpec: WfSpec + nodeRuns: NodeRun[] +} +export const getWfRun = async ({ ids }: Props): Promise => { + const tenantId = cookies().get('tenantId')?.value + const client = await lhClient({ tenantId }) + const wfRunId = ids + .reverse() + .reduceRight((parentWfRunId, id) => ({ id, parentWfRunId }), undefined) + const wfRun = await client.getWfRun(wfRunId!) + const [wfSpec, { results: nodeRuns }] = await Promise.all([ + client.getWfSpec({ ...wfRun.wfSpecId }), + client.listNodeRuns({ + wfRunId, + }), + ]) + + const threadRuns = wfRun.threadRuns.map(threadRun => mergeThreadRunsWithNodeRuns(threadRun, nodeRuns)) + return { wfRun: { ...wfRun, threadRuns }, wfSpec, nodeRuns } +} + +const mergeThreadRunsWithNodeRuns = (threadRun: ThreadRun, nodeRuns: NodeRun[]): ThreadRunWithNodeRuns => { + return { + ...threadRun, + nodeRuns: nodeRuns.filter( + nodeRun => nodeRun.threadSpecName === threadRun.threadSpecName && nodeRun.id?.threadRunNumber === threadRun.number + ), + } +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/page.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/page.tsx new file mode 100644 index 000000000..461ad9b62 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfRun/[...ids]/page.tsx @@ -0,0 +1,23 @@ +import { Metadata } from 'next' +import { notFound } from 'next/navigation' +import { ClientError, Status } from 'nice-grpc-common' +import { WfRun } from './components/WfRun' +import { getWfRun } from './getWfRun' + +type Props = { params: { ids: string[] } } + +export default async function Page({ params: { ids } }: Props) { + try { + const { wfRun, wfSpec, nodeRuns } = await getWfRun({ ids }) + return + } catch (error) { + if (error instanceof ClientError && error.code === Status.NOT_FOUND) return notFound() + throw error + } +} + +export async function generateMetadata({ params: { ids } }: Props): Promise { + return { + title: `WfRun ${ids[ids.length - 1]} | Littlehorse`, + } +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/getVersions.ts b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/getVersions.ts new file mode 100644 index 000000000..780afc07f --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/getVersions.ts @@ -0,0 +1,29 @@ +'use server' +import { authOptions } from '@/app/api/auth/[...nextauth]/authOptions' +import { SEARCH_DEFAULT_LIMIT } from '@/app/constants' +import { getClient } from '@/lhConfig' +import { VersionList, WithBookmark, WithTenant } from '@/types' +import { getServerSession } from 'next-auth' + +type GetWfSpecProps = { + name: string +} & WithBookmark & + WithTenant + +export const getWfSpecVersions = async (props: GetWfSpecProps): Promise => { + const session = await getServerSession(authOptions) + const { tenantId, name } = props + const bookmark = props.bookmark ? Buffer.from(props.bookmark) : undefined + const client = getClient({ tenantId, accessToken: session?.accessToken }) + + const specs = await client.searchWfSpec({ name, bookmark, limit: SEARCH_DEFAULT_LIMIT }) + + const versions = specs.results.map(({ majorVersion, revision }) => { + return `${majorVersion}.${revision}` + }) + + return { + bookmark: specs.bookmark?.toString('base64'), + versions, + } +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/getWfSpec.ts b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/getWfSpec.ts new file mode 100644 index 000000000..0abba9cf9 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/getWfSpec.ts @@ -0,0 +1,20 @@ +'use server' +import { lhClient } from '@/app/lhClient' +import { WithTenant } from '@/types' +import { WfSpec } from 'littlehorse-client/dist/proto/wf_spec' + +type GetWfSpecProps = { + name: string + version: string +} & WithTenant + +export const getWfSpec = async ({ name, version, tenantId }: GetWfSpecProps): Promise => { + const client = await lhClient({ tenantId }) + + if (/[0-9]+\.[0-9]+/.test(version)) { + const [majorVersion, revision] = version.split('.') + return client.getWfSpec({ name, majorVersion: parseInt(majorVersion), revision: parseInt(revision) }) + } + + return client.getLatestWfSpec({ name }) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/searchWfRun.ts b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/searchWfRun.ts new file mode 100644 index 000000000..a97e0d4ec --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/actions/searchWfRun.ts @@ -0,0 +1,10 @@ +'use server' +import { lhClient } from '@/app/lhClient' +import { WithTenant } from '@/types' +import { SearchWfRunRequest } from 'littlehorse-client/dist/proto/service' + +export type WfRunSearchProps = SearchWfRunRequest & WithTenant +export const searchWfRun = async ({ tenantId, ...req }: WfRunSearchProps) => { + const client = await lhClient({ tenantId }) + return client.searchWfRun(req) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Details.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Details.tsx new file mode 100644 index 000000000..65a0e5cff --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Details.tsx @@ -0,0 +1,28 @@ +'use client' +import { WfSpec } from 'littlehorse-client/dist/proto/wf_spec' +import { FC } from 'react' +import { Versions } from './Versions' + +type DetailsProps = Pick + +const statusColors: { [key in WfSpec['status']]: string } = { + ARCHIVED: 'bg-gray-200', + ACTIVE: 'bg-blue-200', + TERMINATING: 'bg-yellow-200', + UNRECOGNIZED: 'bg-red-200', +} + +export const Details: FC = ({ id, status }) => { + return ( +
+ WfSpec +

{id?.name}

+
+ +
+ Status: {`${status}`} +
+
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Mutations.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Mutations.tsx new file mode 100644 index 000000000..5fd38ce51 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Mutations.tsx @@ -0,0 +1,57 @@ +import { VariableMutation } from 'littlehorse-client/dist/proto/common_wfspec' +import { VariableValue } from 'littlehorse-client/dist/proto/variable' +import { ThreadSpec } from 'littlehorse-client/dist/proto/wf_spec' +import { FC, useMemo } from 'react' + +type Props = Pick +export const Mutations: FC = ({ nodes }) => { + const mutations = useMemo(() => { + return Object.values(nodes).reduce((acc, node) => { + for (const mutation of node.outgoingEdges) { + acc = [...acc, ...mutation.variableMutations] + } + return acc + }, []) + }, [nodes]) + + if (mutations.length === 0) return <> + + return ( +
+

Mutations

+ {mutations.map(mutation => ( +
+ {mutation.lhsName} + {mutation.operation} + + +
+ ))} +
+ ) +} + +const NodeOutput: FC> = ({ nodeOutput }) => { + if (!nodeOutput) return <> + return ( + <> + Node Output + {nodeOutput.jsonpath && ( + {nodeOutput.jsonpath} + )} + + ) +} + +const LiteralValue: FC> = ({ literalValue }) => { + if (!literalValue) return <> + const type = Object.keys(literalValue)[0] as keyof VariableValue + return ( + <> + Literal Value + + {literalValue[type]?.toString()} + + + ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Thread.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Thread.tsx new file mode 100644 index 000000000..f37847b5b --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Thread.tsx @@ -0,0 +1,32 @@ +'use client' +import { Disclosure } from '@headlessui/react' +import { ChevronUpIcon } from '@heroicons/react/20/solid' +import { ThreadSpec } from 'littlehorse-client/dist/proto/wf_spec' +import { FC } from 'react' +import { Mutations } from './Mutations' +import { Variables } from './Variables' + +type Props = { + name: string + spec: ThreadSpec +} +export const Thread: FC = ({ name, spec }) => { + return ( +
+ + {({ open }) => ( + <> + +

Thread: {name}

+ +
+ + + + + + )} +
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Variables.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Variables.tsx new file mode 100644 index 000000000..7b3898464 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Variables.tsx @@ -0,0 +1,30 @@ +import { VARIABLE_TYPES } from '@/app/constants' +import { ThreadSpec, WfRunVariableAccessLevel } from 'littlehorse-client/dist/proto/wf_spec' +import { FC } from 'react' + +type VariablesProps = Pick + +const accessLevels: { [key in WfRunVariableAccessLevel]: string } = { + PUBLIC_VAR: 'Public', + INHERITED_VAR: 'Inherited', + PRIVATE_VAR: 'Private', + UNRECOGNIZED: '', +} + +export const Variables: FC = ({ variableDefs }) => { + if (variableDefs.length === 0) return <> + return ( +
+

Variables

+ {variableDefs.map(variable => ( +
+ {variable.varDef?.name} + {VARIABLE_TYPES[variable.varDef!.type]} + {variable.required && Required} + {variable.searchable && Searchable} + {accessLevels[variable.accessLevel]} +
+ ))} +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Versions.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Versions.tsx new file mode 100644 index 000000000..ce2d478ad --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/Versions.tsx @@ -0,0 +1,27 @@ +import { VersionSelector } from '@/app/(authenticated)/components/VersionSelector' +import { useWhoAmI } from '@/contexts/WhoAmIContext' +import { WfSpecId } from 'littlehorse-client/dist/proto/object_id' +import { useParams } from 'next/navigation' +import { FC, useCallback, useState } from 'react' +import { getWfSpecVersions } from '../actions/getVersions' + +export const Versions: FC<{ wfSpecId?: WfSpecId }> = ({ wfSpecId }) => { + const [versions, setVersions] = useState([]) + const { tenantId } = useWhoAmI() + const { name, majorVersion, revision } = wfSpecId! + const { props } = useParams() + + const loadVersions = useCallback(async () => { + const { versions } = await getWfSpecVersions({ name, tenantId }) + setVersions(versions) + }, [name, tenantId]) + + return ( + + ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfRuns.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfRuns.tsx new file mode 100644 index 000000000..109894271 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfRuns.tsx @@ -0,0 +1,85 @@ +'use client' +import { SearchFooter } from '@/app/(authenticated)/components/SearchFooter' +import { SEARCH_DEFAULT_LIMIT, TIME_RANGES, TimeRange } from '@/app/constants' +import { concatWfRunIds } from '@/app/utils' +import { useWhoAmI } from '@/contexts/WhoAmIContext' +import { ArrowPathIcon } from '@heroicons/react/16/solid' +import { useInfiniteQuery } from '@tanstack/react-query' +import { LHStatus, lHStatusFromJSON } from 'littlehorse-client/dist/proto/common_enums' +import { WfRunIdList } from 'littlehorse-client/dist/proto/service' +import { WfSpec } from 'littlehorse-client/dist/proto/wf_spec' +import Link from 'next/link' +import { useSearchParams } from 'next/navigation' +import { FC, Fragment, useMemo, useState } from 'react' +import { searchWfRun } from '../actions/searchWfRun' +import { WfRunsHeader } from './WfRunsHeader' + +type Props = Pick +export const WfRuns: FC = ({ id }) => { + const searchParams = useSearchParams() + const status = getStatus(searchParams.get('status')) || LHStatus.RUNNING + const [limit, setLimit] = useState(SEARCH_DEFAULT_LIMIT) + const [window, setWindow] = useState(TIME_RANGES[0]) + const { tenantId } = useWhoAmI() + + const startTime = useMemo(() => { + const now = new Date() + const latestStart = now.toISOString() + const earliestStart = new Date(now.getTime() - window * 6e4).toISOString() + + return { + latestStart, + earliestStart, + } + }, [window]) + + const { isPending, data, hasNextPage, fetchNextPage } = useInfiniteQuery({ + queryKey: ['wfRun', status, tenantId, limit, startTime], + initialPageParam: undefined, + getNextPageParam: (lastPage: WfRunIdList) => lastPage.bookmark?.toString('base64'), + queryFn: async ({ pageParam }) => { + return await searchWfRun({ + wfSpecName: id!.name, + wfSpecMajorVersion: id!.majorVersion, + wfSpecRevision: id!.revision, + variableFilters: [], + limit, + status, + tenantId, + bookmark: pageParam ? Buffer.from(pageParam, 'base64') : undefined, + ...startTime, + }) + }, + }) + + return ( +
+ + {isPending ? ( +
+ +
+ ) : ( +
+ {data?.pages.map((page, i) => ( + + {page.results.map(wfRunId => ( +
+ + {wfRunId.id} + +
+ ))} +
+ ))} +
+ )} + +
+ ) +} + +const getStatus = (status: string | null) => { + if (!status) return undefined + return lHStatusFromJSON(status) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfRunsHeader.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfRunsHeader.tsx new file mode 100644 index 000000000..11a665331 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfRunsHeader.tsx @@ -0,0 +1,58 @@ +import { TIME_RANGES, TIME_RANGES_NAMES, TimeRange, WF_RUN_STATUSES } from '@/app/constants' +import { Listbox } from '@headlessui/react' +import { ClockIcon } from '@heroicons/react/24/outline' +import { LHStatus } from 'littlehorse-client/dist/proto/common_enums' +import Link from 'next/link' +import { FC } from 'react' + +type Props = { + currentStatus: LHStatus + currentWindow: TimeRange + setWindow: (window: TimeRange) => void +} + +export const WfRunsHeader: FC = ({ currentStatus, currentWindow, setWindow }) => { + return ( +
+

WfRun Search

+
+ +
+ + + Last {TIME_RANGES_NAMES[currentWindow]} + + + {TIME_RANGES.map(time => ( + + `relative cursor-default select-none py-2 pl-2 pr-4 text-xs ${ + active ? 'bg-blue-500 text-white' : 'text-gray-900' + }` + } + > + Last {TIME_RANGES_NAMES[time]} + + ))} + +
+
+
+
+ {WF_RUN_STATUSES.map(status => ( + + {status} + + ))} +
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfSpec.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfSpec.tsx new file mode 100644 index 000000000..b59f60ca4 --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/components/WfSpec.tsx @@ -0,0 +1,27 @@ +'use client' +import { Navigation } from '@/app/(authenticated)/components/Navigation' +import { WfSpec as Spec } from 'littlehorse-client/dist/proto/wf_spec' +import { FC } from 'react' +import { Diagram } from '../../../components/Diagram' +import { Details } from './Details' +import { Thread } from './Thread' +import { WfRuns } from './WfRuns' + +type WfSpecProps = { + spec: Spec +} +export const WfSpec: FC = ({ spec }) => { + return ( + <> + +
+ + {Object.keys(spec.threadSpecs) + .reverse() + .map(name => ( + + ))} + + + ) +} diff --git a/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/page.tsx b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/page.tsx new file mode 100644 index 000000000..4f6d135fd --- /dev/null +++ b/dashboard/src/app/(authenticated)/(diagram)/wfSpec/[...props]/page.tsx @@ -0,0 +1,31 @@ +import { Metadata } from 'next' +import { cookies } from 'next/headers' +import { notFound } from 'next/navigation' +import { ClientError, Status } from 'nice-grpc-common' +import { getWfSpec } from './actions/getWfSpec' +import { WfSpec } from './components/WfSpec' + +type Props = { params: { props: string[] } } + +export const dynamic = 'force-dynamic' + +export default async function Page({ params: { props } }: Props) { + const name = props[0] + const version = props[1] + const tenantId = cookies().get('tenantId')?.value + try { + const wfSpec = await getWfSpec({ tenantId, name, version }) + return + } catch (error) { + if (error instanceof ClientError && error.code === Status.NOT_FOUND) return notFound() + throw error + } +} + +export async function generateMetadata({ params: { props } }: Props): Promise { + const name = props[0] + + return { + title: `WfSpec ${name} | Littlehorse`, + } +} diff --git a/dashboard/src/app/(authenticated)/components/Header.tsx b/dashboard/src/app/(authenticated)/components/Header.tsx new file mode 100644 index 000000000..0ea3e5e56 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/Header.tsx @@ -0,0 +1,27 @@ +'use client' + +import { FC } from 'react' +import LhLogo from '@/littlehorse.svg' + +import { Principal } from './Principal' +import { TenantSelector } from './TenantSelector' + +export const Header: FC = () => { + return ( + + ) +} diff --git a/dashboard/src/app/(authenticated)/components/Navigation.tsx b/dashboard/src/app/(authenticated)/components/Navigation.tsx new file mode 100644 index 000000000..72167f604 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/Navigation.tsx @@ -0,0 +1,20 @@ +'use client' +import { ChevronLeftIcon } from '@heroicons/react/16/solid' +import Link from 'next/link' +import { FC } from 'react' + +type Props = { + title: string + href: string +} + +export const Navigation: FC = ({ title, href }) => { + return ( +
+ + + {title} + +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/components/Principal.tsx b/dashboard/src/app/(authenticated)/components/Principal.tsx new file mode 100644 index 000000000..b47f5b20a --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/Principal.tsx @@ -0,0 +1,52 @@ +import { useWhoAmI } from '@/contexts/WhoAmIContext' +import { Menu, Transition } from '@headlessui/react' +import { signOut } from 'next-auth/react' +import { FC, Fragment } from 'react' +function classNames(...classes: Array) { + return classes.filter(Boolean).join(' ') +} + +export const Principal: FC = () => { + const { user } = useWhoAmI() + return ( + +
+ +
+ {user?.name?.at(0)} +
+
+
+ + + +
+ + {({ active }) => ( + + )} + +
+
+
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/components/QueryProvider.tsx b/dashboard/src/app/(authenticated)/components/QueryProvider.tsx new file mode 100644 index 000000000..a594ff638 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/QueryProvider.tsx @@ -0,0 +1,8 @@ +'use client' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import React, { FC, PropsWithChildren } from 'react' +const queryClient = new QueryClient() + +export const QueryProvider: FC = ({ children }) => { + return {children} +} diff --git a/dashboard/src/app/(authenticated)/components/Search.tsx b/dashboard/src/app/(authenticated)/components/Search.tsx new file mode 100644 index 000000000..5e5469217 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/Search.tsx @@ -0,0 +1,54 @@ +'use client' +import { SEARCH_DEFAULT_LIMIT, SEARCH_ENTITIES, SearchType } from '@/app/constants' +import { useWhoAmI } from '@/contexts/WhoAmIContext' +import { ArrowPathIcon } from '@heroicons/react/16/solid' +import { useInfiniteQuery } from '@tanstack/react-query' +import { useSearchParams } from 'next/navigation' +import { FC, useState } from 'react' +import { SearchFooter } from './SearchFooter' +import { SearchHeader } from './SearchHeader' +import { SearchResponse, search } from './searchAction' +import { ExternalEventDefTable, TaskDefTable, UserTaskDefTable, WfSpecTable } from './tables' + +export const Search: FC<{}> = () => { + const [prefix, setPrefix] = useState() + const searchParams = useSearchParams() + const type = getType(searchParams.get('type')) + const [limit, setLimit] = useState(SEARCH_DEFAULT_LIMIT) + // We use the tenantId from context to trigger render on change + const { tenantId } = useWhoAmI() + + const { isPending, data, hasNextPage, fetchNextPage } = useInfiniteQuery({ + queryKey: ['search', type, tenantId, limit, prefix], + initialPageParam: undefined, + getNextPageParam: (lastPage: SearchResponse) => lastPage.bookmark, + queryFn: async ({ pageParam: bookmark }) => { + return search({ type, limit, prefix, bookmark, tenantId }) + }, + }) + + return ( +
+ + {isPending ? ( +
+ +
+ ) : ( +
+ {type === 'WfSpec' && } + {type === 'TaskDef' && } + {type === 'UserTaskDef' && } + {type === 'ExternalEventDef' && } +
+ )} + +
+ ) +} + +const getType = (type: any | null): SearchType => { + if (!type) return 'WfSpec' + + return SEARCH_ENTITIES.includes(type) ? type : 'WfSpec' +} diff --git a/dashboard/src/app/(authenticated)/components/SearchFooter.tsx b/dashboard/src/app/(authenticated)/components/SearchFooter.tsx new file mode 100644 index 000000000..082e628f4 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/SearchFooter.tsx @@ -0,0 +1,36 @@ +import { SEARCH_LIMITS } from '@/app/constants' +import { FC } from 'react' + +type Props = { + currentLimit: number + setLimit: (limit: number) => void + hasNextPage: boolean + fetchNextPage: () => void +} +export const SearchFooter: FC = ({ hasNextPage, fetchNextPage, currentLimit, setLimit }) => { + return ( +
+
+ Items per load: + +
+ {hasNextPage && ( + + )} +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/components/SearchHeader.tsx b/dashboard/src/app/(authenticated)/components/SearchHeader.tsx new file mode 100644 index 000000000..beeabeaf7 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/SearchHeader.tsx @@ -0,0 +1,41 @@ +import { SEARCH_ENTITIES, SearchType } from '@/app/constants' +import { MagnifyingGlassIcon } from '@heroicons/react/16/solid' +import Link from 'next/link' +import { FC } from 'react' + +type Props = { + currentType: SearchType + setPrefix: (value: string | undefined) => void +} + +export const SearchHeader: FC = ({ currentType, setPrefix }) => { + return ( +
+

Metadata Search

+
+ {SEARCH_ENTITIES.map(type => ( + + {type} + + ))} +
+
+
+ +
+ { + const { value } = e.target + if (!!value) { + setPrefix(value) + } else { + setPrefix(undefined) + } + }} + className="block w-full rounded-lg border border-gray-300 p-2 ps-10 text-sm text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500" + /> +
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/components/TenantSelector.tsx b/dashboard/src/app/(authenticated)/components/TenantSelector.tsx new file mode 100644 index 000000000..c69cfc690 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/TenantSelector.tsx @@ -0,0 +1,62 @@ +'use client' +import { useWhoAmI } from '@/contexts/WhoAmIContext' +import { Menu, Transition } from '@headlessui/react' +import { FC, Fragment } from 'react' +import { setTenant } from '../../../setTenant' + +export const TenantSelector: FC = () => { + const { tenants, tenantId } = useWhoAmI() + + return ( + +
+ + + + + {tenantId} + +
+ + +
Tenants
+ {tenants.map(tenant => ( +
+ + {() => ( + + )} + +
+ ))} +
+
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/components/VersionSelector.tsx b/dashboard/src/app/(authenticated)/components/VersionSelector.tsx new file mode 100644 index 000000000..a24b1b63f --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/VersionSelector.tsx @@ -0,0 +1,40 @@ +import { Listbox } from '@headlessui/react' +import { TagIcon } from '@heroicons/react/16/solid' +import Link from 'next/link' +import { FC } from 'react' + +type Props = { + path: string + currentVersion: string + versions: string[] + loadVersions: () => void +} + +export const VersionSelector: FC = ({ path, currentVersion, versions, loadVersions }) => { + return ( + +
+ Version: +
+ + + {currentVersion} + + + {versions.map(version => ( + + {version} + + ))} + +
+
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/components/searchAction.ts b/dashboard/src/app/(authenticated)/components/searchAction.ts new file mode 100644 index 000000000..e871fd021 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/searchAction.ts @@ -0,0 +1,78 @@ +'use server' +import { SEARCH_DEFAULT_LIMIT, SearchType } from '@/app/constants' +import { lhClient } from '@/app/lhClient' +import { WithBookmark, WithTenant } from '@/types' +import { WfSpecId } from 'littlehorse-client/dist/proto/object_id' +import { WfSpecIdList } from 'littlehorse-client/dist/proto/service' + +type Props = { prefix?: string; limit?: number } & WithBookmark + +const genericSearch = async (props: P, fn: (props: P) => Promise): Promise => { + return fn(props) +} + +type SearchProps = { type: SearchType } & Props & WithTenant + +export const search = async ({ type, tenantId, bookmark, limit, prefix }: SearchProps): Promise => { + const client = await lhClient({ tenantId }) + const request = { + prefix, + bookmark: bookmarkFrom(bookmark), + limit: limit || SEARCH_DEFAULT_LIMIT, + } + + let results + switch (type) { + case 'TaskDef': + results = await genericSearch(request, client.searchTaskDef) + break + case 'UserTaskDef': + results = await genericSearch(request, client.searchUserTaskDef) + break + case 'ExternalEventDef': + results = await genericSearch(request, client.searchExternalEventDef) + break + default: + results = await genericSearch(request, client.searchWfSpec) + break + } + + return { + ...results, + type, + bookmark: results.bookmark?.toString('base64'), + } +} + +const bookmarkFrom = (bookmark?: string): Buffer | undefined => { + if (bookmark === undefined) return bookmark + return Buffer.from(bookmark, 'base64') +} + +export interface SearchResult { + type: SearchType + bookmark?: string + results: any +} + +export type WfSpecList = SearchResult & { + type: 'WfSpec' + results: WfSpecId[] +} + +type TaskDefList = SearchResult & { + type: 'TaskDef' + results: Pick +} + +type UserTaskDefList = SearchResult & { + type: 'UserTaskDef' + results: Pick +} + +type ExternalEventDefList = SearchResult & { + type: 'ExternalEventDef' + results: Pick +} + +export type SearchResponse = WfSpecList | TaskDefList | UserTaskDefList | ExternalEventDefList diff --git a/dashboard/src/app/(authenticated)/components/tables/ExternalEventDefTable.tsx b/dashboard/src/app/(authenticated)/components/tables/ExternalEventDefTable.tsx new file mode 100644 index 000000000..ddac96c85 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/tables/ExternalEventDefTable.tsx @@ -0,0 +1,26 @@ +import { ExternalEventDefId } from 'littlehorse-client/dist/proto/object_id' +import Link from 'next/link' +import { FC, Fragment } from 'react' +import { SearchResultProps } from '.' + +export const ExternalEventDefTable: FC = ({ pages = [] }) => { + if (pages.length === 0) { + return
No ExternalEventDefs
+ } + + return ( +
+ {pages.map((page, i) => ( + + {page.results.map(({ name }: ExternalEventDefId) => ( +
+ + {name} + +
+ ))} +
+ ))} +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/components/tables/TaskDefTable.tsx b/dashboard/src/app/(authenticated)/components/tables/TaskDefTable.tsx new file mode 100644 index 000000000..e1fcc95dc --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/tables/TaskDefTable.tsx @@ -0,0 +1,26 @@ +import { TaskDefId } from 'littlehorse-client/dist/proto/object_id' +import Link from 'next/link' +import { FC, Fragment } from 'react' +import { SearchResultProps } from '.' + +export const TaskDefTable: FC = ({ pages = [] }) => { + if (pages.length === 0) { + return
No TaskDefs
+ } + + return ( +
+ {pages.map((page, i) => ( + + {page.results.map(({ name }: TaskDefId) => ( +
+ + {name} + +
+ ))} +
+ ))} +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/components/tables/UserTaskDefTable.tsx b/dashboard/src/app/(authenticated)/components/tables/UserTaskDefTable.tsx new file mode 100644 index 000000000..608bfce20 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/tables/UserTaskDefTable.tsx @@ -0,0 +1,30 @@ +import { TagIcon } from '@heroicons/react/16/solid' +import { UserTaskDefId } from 'littlehorse-client/dist/proto/object_id' +import Link from 'next/link' +import { FC, Fragment } from 'react' +import { SearchResultProps } from '.' + +export const UserTaskDefTable: FC = ({ pages = [] }) => { + if (pages.length === 0) { + return
No UserTaskDefs
+ } + + return ( +
+ {pages.map((page, i) => ( + + {page.results.map(({ name, version }: UserTaskDefId) => ( +
+ + {name} + +
+ v{version} +
+
+ ))} +
+ ))} +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/components/tables/WfSpecTable.tsx b/dashboard/src/app/(authenticated)/components/tables/WfSpecTable.tsx new file mode 100644 index 000000000..8176040f8 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/tables/WfSpecTable.tsx @@ -0,0 +1,30 @@ +import { TagIcon } from '@heroicons/react/16/solid' +import { WfSpecId } from 'littlehorse-client/dist/proto/object_id' +import Link from 'next/link' +import { FC, Fragment } from 'react' +import { SearchResultProps } from '.' + +export const WfSpecTable: FC = ({ pages = [] }) => { + if (pages.length === 0) { + return
No WfSpecs
+ } + + return ( +
+ {pages.map((page, i) => ( + + {page.results.map(({ name, majorVersion, revision }: WfSpecId) => ( +
+ + {name} + +
+ v{majorVersion}.{revision} +
+
+ ))} +
+ ))} +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/components/tables/index.ts b/dashboard/src/app/(authenticated)/components/tables/index.ts new file mode 100644 index 000000000..6b2c26da9 --- /dev/null +++ b/dashboard/src/app/(authenticated)/components/tables/index.ts @@ -0,0 +1,10 @@ +import { SearchResult } from '../searchAction' + +export * from './ExternalEventDefTable' +export * from './TaskDefTable' +export * from './UserTaskDefTable' +export * from './WfSpecTable' + +export type SearchResultProps = { + pages?: SearchResult[] +} diff --git a/dashboard/src/app/(authenticated)/error.tsx b/dashboard/src/app/(authenticated)/error.tsx new file mode 100644 index 000000000..db43a7fe9 --- /dev/null +++ b/dashboard/src/app/(authenticated)/error.tsx @@ -0,0 +1,24 @@ +'use client' + +import { useEffect } from 'react' + +export default function Error({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) { + useEffect(() => { + // Log the error to an error reporting service + console.error(error) + }, [error]) + + return ( +
+

Something went wrong!

+ +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/externalEventDef/[name]/components/Details.tsx b/dashboard/src/app/(authenticated)/externalEventDef/[name]/components/Details.tsx new file mode 100644 index 000000000..f9853a511 --- /dev/null +++ b/dashboard/src/app/(authenticated)/externalEventDef/[name]/components/Details.tsx @@ -0,0 +1,22 @@ +'use client' +import { ExternalEventDef } from 'littlehorse-client/dist/proto/external_event' +import { FC } from 'react' + +type DetailsProps = { + spec: ExternalEventDef +} + +export const Details: FC = ({ spec: { id, retentionPolicy } }) => { + return ( +
+ ExternalEventDef +

{id?.name}

+ {retentionPolicy?.secondsAfterPut && ( +
+ Retention Policy: + {retentionPolicy.secondsAfterPut} seconds +
+ )} +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/externalEventDef/[name]/components/ExternalEventDef.tsx b/dashboard/src/app/(authenticated)/externalEventDef/[name]/components/ExternalEventDef.tsx new file mode 100644 index 000000000..b4607e8c7 --- /dev/null +++ b/dashboard/src/app/(authenticated)/externalEventDef/[name]/components/ExternalEventDef.tsx @@ -0,0 +1,17 @@ +import { Navigation } from '@/app/(authenticated)/components/Navigation' +import { ExternalEventDef as ExternalEventDefProto } from 'littlehorse-client/dist/proto/external_event' +import { FC } from 'react' +import { Details } from './Details' +import { InputVars } from './InputVars' + +type Props = { + spec: ExternalEventDefProto +} +export const ExternalEventDef: FC = ({ spec }) => { + return ( + <> + +
+ + ) +} diff --git a/dashboard/src/app/(authenticated)/externalEventDef/[name]/components/InputVars.tsx b/dashboard/src/app/(authenticated)/externalEventDef/[name]/components/InputVars.tsx new file mode 100644 index 000000000..cc3aee757 --- /dev/null +++ b/dashboard/src/app/(authenticated)/externalEventDef/[name]/components/InputVars.tsx @@ -0,0 +1,21 @@ +import { VARIABLE_TYPES } from '@/app/constants' +import { TaskDef } from 'littlehorse-client/dist/proto/task_def' +import { FC } from 'react' + +type Props = Pick +export const InputVars: FC = ({ inputVars }) => { + if (inputVars.length === 0) return
No input variables
+ + return ( +
+

Input Variables

+ {inputVars.map(({ name, type, defaultValue }) => ( +
+
{name}
+
{VARIABLE_TYPES[type]}
+ {defaultValue &&
{Object.values(defaultValue)[0]}
} +
+ ))} +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/externalEventDef/[name]/getExternalEventDef.ts b/dashboard/src/app/(authenticated)/externalEventDef/[name]/getExternalEventDef.ts new file mode 100644 index 000000000..20bb157fc --- /dev/null +++ b/dashboard/src/app/(authenticated)/externalEventDef/[name]/getExternalEventDef.ts @@ -0,0 +1,13 @@ +'use server' + +import { lhClient } from '@/app/lhClient' +import { ExternalEventDef } from 'littlehorse-client/dist/proto/external_event' +import { ExternalEventDefId } from 'littlehorse-client/dist/proto/object_id' +import { cookies } from 'next/headers' + +export const getExternalEventDef = async (request: ExternalEventDefId): Promise => { + const tenantId = cookies().get('tenantId')?.value + const client = await lhClient({ tenantId }) + + return client.getExternalEventDef(request) +} diff --git a/dashboard/src/app/(authenticated)/externalEventDef/[name]/page.tsx b/dashboard/src/app/(authenticated)/externalEventDef/[name]/page.tsx new file mode 100644 index 000000000..fbdac542f --- /dev/null +++ b/dashboard/src/app/(authenticated)/externalEventDef/[name]/page.tsx @@ -0,0 +1,23 @@ +import { Metadata } from 'next' +import { notFound } from 'next/navigation' +import { ClientError, Status } from 'nice-grpc-common' +import { ExternalEventDef } from './components/ExternalEventDef' +import { getExternalEventDef } from './getExternalEventDef' + +type Props = { params: { name: string } } + +export default async function Page({ params: { name } }: Props) { + try { + const spec = await getExternalEventDef({ name }) + return + } catch (error) { + if (error instanceof ClientError && error.code === Status.NOT_FOUND) return notFound() + throw error + } +} + +export async function generateMetadata({ params: { name } }: Props): Promise { + return { + title: `ExternalEventDef ${name} | Littlehorse`, + } +} diff --git a/dashboard/src/app/(authenticated)/layout.tsx b/dashboard/src/app/(authenticated)/layout.tsx new file mode 100644 index 000000000..d5f98d95a --- /dev/null +++ b/dashboard/src/app/(authenticated)/layout.tsx @@ -0,0 +1,28 @@ +import { WhoAmIContext } from '@/contexts/WhoAmIContext' +import type { Metadata } from 'next' +import { cookies } from 'next/headers' +import getWhoAmI from '../getWhoami' +import { Header } from './components/Header' +import { QueryProvider } from './components/QueryProvider' + +export const metadata: Metadata = { + title: 'LittleHorse | Dashboard', +} + +export default async function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + const { tenants, user } = await getWhoAmI() + const tenantId = cookies().get('tenantId')?.value + + return ( + +
+ +
{children}
+
+ + ) +} diff --git a/dashboard/src/app/(authenticated)/page.tsx b/dashboard/src/app/(authenticated)/page.tsx new file mode 100644 index 000000000..561b02fd9 --- /dev/null +++ b/dashboard/src/app/(authenticated)/page.tsx @@ -0,0 +1,5 @@ +import { Search } from './components/Search' + +export default function Home() { + return +} diff --git a/dashboard/src/app/(authenticated)/taskDef/[name]/components/Details.tsx b/dashboard/src/app/(authenticated)/taskDef/[name]/components/Details.tsx new file mode 100644 index 000000000..a00b3d48f --- /dev/null +++ b/dashboard/src/app/(authenticated)/taskDef/[name]/components/Details.tsx @@ -0,0 +1,14 @@ +'use client' +import { TaskDef } from 'littlehorse-client/dist/proto/task_def' +import { FC } from 'react' + +type DetailsProps = Pick + +export const Details: FC = ({ id }) => { + return ( +
+ TaskDef +

{id?.name}

+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/taskDef/[name]/components/InputVars.tsx b/dashboard/src/app/(authenticated)/taskDef/[name]/components/InputVars.tsx new file mode 100644 index 000000000..cc3aee757 --- /dev/null +++ b/dashboard/src/app/(authenticated)/taskDef/[name]/components/InputVars.tsx @@ -0,0 +1,21 @@ +import { VARIABLE_TYPES } from '@/app/constants' +import { TaskDef } from 'littlehorse-client/dist/proto/task_def' +import { FC } from 'react' + +type Props = Pick +export const InputVars: FC = ({ inputVars }) => { + if (inputVars.length === 0) return
No input variables
+ + return ( +
+

Input Variables

+ {inputVars.map(({ name, type, defaultValue }) => ( +
+
{name}
+
{VARIABLE_TYPES[type]}
+ {defaultValue &&
{Object.values(defaultValue)[0]}
} +
+ ))} +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/taskDef/[name]/components/TaskDef.tsx b/dashboard/src/app/(authenticated)/taskDef/[name]/components/TaskDef.tsx new file mode 100644 index 000000000..92dad1027 --- /dev/null +++ b/dashboard/src/app/(authenticated)/taskDef/[name]/components/TaskDef.tsx @@ -0,0 +1,18 @@ +import { Navigation } from '@/app/(authenticated)/components/Navigation' +import { TaskDef as TaskDefProto } from 'littlehorse-client/dist/proto/task_def' +import { FC } from 'react' +import { Details } from './Details' +import { InputVars } from './InputVars' + +type Props = { + spec: TaskDefProto +} +export const TaskDef: FC = ({ spec }) => { + return ( + <> + +
+ + + ) +} diff --git a/dashboard/src/app/(authenticated)/taskDef/[name]/getTaskDef.ts b/dashboard/src/app/(authenticated)/taskDef/[name]/getTaskDef.ts new file mode 100644 index 000000000..c84a7d922 --- /dev/null +++ b/dashboard/src/app/(authenticated)/taskDef/[name]/getTaskDef.ts @@ -0,0 +1,15 @@ +'use server' + +import { authOptions } from '@/app/api/auth/[...nextauth]/authOptions' +import { getClient } from '@/lhConfig' +import { TaskDefId } from 'littlehorse-client/dist/proto/object_id' +import { getServerSession } from 'next-auth' +import { cookies } from 'next/headers' + +export const getTaskDef = async (request: TaskDefId) => { + const session = await getServerSession(authOptions) + const tenantId = cookies().get('tenantId')?.value + const client = getClient({ tenantId, accessToken: session?.accessToken }) + + return client.getTaskDef(request) +} diff --git a/dashboard/src/app/(authenticated)/taskDef/[name]/page.tsx b/dashboard/src/app/(authenticated)/taskDef/[name]/page.tsx new file mode 100644 index 000000000..99a12767f --- /dev/null +++ b/dashboard/src/app/(authenticated)/taskDef/[name]/page.tsx @@ -0,0 +1,23 @@ +import { Metadata } from 'next' +import { notFound } from 'next/navigation' +import { ClientError, Status } from 'nice-grpc-common' +import { TaskDef } from './components/TaskDef' +import { getTaskDef } from './getTaskDef' + +type Props = { params: { name: string } } + +export default async function Page({ params: { name } }: Props) { + try { + const spec = await getTaskDef({ name }) + return + } catch (error) { + if (error instanceof ClientError && error.code === Status.NOT_FOUND) return notFound() + throw error + } +} + +export async function generateMetadata({ params: { name } }: Props): Promise { + return { + title: `TaskDef ${name} | Littlehorse`, + } +} diff --git a/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Details.tsx b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Details.tsx new file mode 100644 index 000000000..eb80f3660 --- /dev/null +++ b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Details.tsx @@ -0,0 +1,20 @@ +'use client' +import { UserTaskDef } from 'littlehorse-client/dist/proto/user_tasks' +import { FC } from 'react' +import { Versions } from './Versions' + +type Props = { + id: Pick +} +export const Details: FC = ({ id }) => { + return ( +
+ UserTaskDef +

{id.name}

+ {id.description &&
{id.description}
} +
+ +
+
+ ) +} diff --git a/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Fields.tsx b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Fields.tsx new file mode 100644 index 000000000..7f9cc340a --- /dev/null +++ b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Fields.tsx @@ -0,0 +1,24 @@ +import { VARIABLE_TYPES } from '@/app/constants' +import { UserTaskDef } from 'littlehorse-client/dist/proto/user_tasks' +import { FC } from 'react' + +type Props = Pick +export const Fields: FC = ({ fields }) => { + if (fields.length === 0) return <> + return ( +
+

Fields

+ {fields.map(({ name, displayName, description, required, type }) => ( +
+ {name} + {displayName && ( + display: {displayName} + )} + {VARIABLE_TYPES[type]} + {required && Required} + {description && {description}} +
+ ))} +
+ ) +} diff --git a/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/UserTaskDef.tsx b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/UserTaskDef.tsx new file mode 100644 index 000000000..713466f27 --- /dev/null +++ b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/UserTaskDef.tsx @@ -0,0 +1,18 @@ +import { UserTaskDef as UserTaskDefProto } from 'littlehorse-client/dist/proto/user_tasks' +import React, { FC } from 'react' +import { Details } from './Details' +import { Navigation } from '@/app/(authenticated)/components/Navigation' +import { Fields } from './Fields' + +type Props = { + spec: UserTaskDefProto +} +export const UserTaskDef: FC = ({ spec }) => { + return ( + <> + +
+ + + ) +} diff --git a/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Versions.tsx b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Versions.tsx new file mode 100644 index 000000000..5aac408f8 --- /dev/null +++ b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/Versions.tsx @@ -0,0 +1,27 @@ +import { VersionSelector } from '@/app/(authenticated)/components/VersionSelector' +import { useWhoAmI } from '@/contexts/WhoAmIContext' +import { UserTaskDefId } from 'littlehorse-client/dist/proto/object_id' +import { useParams } from 'next/navigation' +import { FC, useCallback, useState } from 'react' +import { getVersions } from './getVersions' + +export const Versions: FC<{ id?: UserTaskDefId }> = ({ id }) => { + const [versions, setVersions] = useState([]) + const { tenantId } = useWhoAmI() + const { name, version } = id! + const { props } = useParams() + + const loadVersions = useCallback(async () => { + const { versions } = await getVersions({ name, tenantId }) + setVersions(versions) + }, [name, tenantId]) + + return ( + + ) +} diff --git a/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/getVersions.ts b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/getVersions.ts new file mode 100644 index 000000000..7c09d08d7 --- /dev/null +++ b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/components/getVersions.ts @@ -0,0 +1,26 @@ +'use server' +import { SEARCH_DEFAULT_LIMIT } from '@/app/constants' +import { lhClient } from '@/app/lhClient' +import { VersionList, WithBookmark, WithTenant } from '@/types' + +type Props = { + name: string +} & WithBookmark & + WithTenant + +export const getVersions = async (props: Props): Promise => { + const { tenantId, name } = props + const bookmark = props.bookmark ? Buffer.from(props.bookmark) : undefined + const client = await lhClient({ tenantId }) + + const specs = await client.searchUserTaskDef({ name, bookmark, limit: SEARCH_DEFAULT_LIMIT }) + + const versions = specs.results.map(({ version }) => { + return version.toString() + }) + + return { + bookmark: specs.bookmark?.toString('base64'), + versions, + } +} diff --git a/dashboard/src/app/(authenticated)/userTaskDef/[...props]/getUserTaskDef.ts b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/getUserTaskDef.ts new file mode 100644 index 000000000..91e61fe91 --- /dev/null +++ b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/getUserTaskDef.ts @@ -0,0 +1,21 @@ +'use server' +import { lhClient } from '@/app/lhClient' +import { WithTenant } from '@/types' + +type Props = { + name: string + version: string +} & WithTenant + +export const getUserTaskDef = async ({ name, version, tenantId }: Props) => { + const client = await lhClient({ tenantId }) + + if (/[0-9]+/.test(version)) { + return client.getLatestUserTaskDef({ name }) + } + + return client.getUserTaskDef({ + name, + version: parseInt(version), + }) +} diff --git a/dashboard/src/app/(authenticated)/userTaskDef/[...props]/page.tsx b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/page.tsx new file mode 100644 index 000000000..7f8db390f --- /dev/null +++ b/dashboard/src/app/(authenticated)/userTaskDef/[...props]/page.tsx @@ -0,0 +1,27 @@ +import { Metadata } from 'next' +import { notFound } from 'next/navigation' +import { ClientError, Status } from 'nice-grpc-common' +import { UserTaskDef } from './components/UserTaskDef' +import { getUserTaskDef } from './getUserTaskDef' + +type Props = { params: { props: string[] } } + +export default async function Page({ params: { props } }: Props) { + const name = props[0] + const version = props[1] + try { + const spec = await getUserTaskDef({ name, version }) + return + } catch (error) { + if (error instanceof ClientError && error.code === Status.NOT_FOUND) return notFound() + throw error + } +} + +export async function generateMetadata({ params: { props } }: Props): Promise { + const name = props[0] + + return { + title: `UserTaskDef ${name} | Littlehorse`, + } +} diff --git a/dashboard/src/app/api/auth/[...nextauth]/authOptions.ts b/dashboard/src/app/api/auth/[...nextauth]/authOptions.ts new file mode 100644 index 000000000..1b7adf10f --- /dev/null +++ b/dashboard/src/app/api/auth/[...nextauth]/authOptions.ts @@ -0,0 +1,44 @@ +import { AuthOptions } from 'next-auth' +import { Provider } from 'next-auth/providers/index' +import KeycloakProvider from 'next-auth/providers/keycloak' +import { signOut } from 'next-auth/react' + +const providers: Provider[] = [] + +if ( + process.env.KEYCLOAK_CLIENT_ID && + process.env.KEYCLOAK_CLIENT_ID !== '' && + process.env.KEYCLOAK_CLIENT_SECRET && + process.env.KEYCLOAK_CLIENT_SECRET !== '' +) { + providers.push( + KeycloakProvider({ + clientId: process.env.KEYCLOAK_CLIENT_ID, + clientSecret: process.env.KEYCLOAK_CLIENT_SECRET, + issuer: process.env.KEYCLOAK_ISSUER_URI, + }) + ) +} + +export const authOptions: AuthOptions = { + providers, + callbacks: { + jwt: async ({ token, account }) => { + if (account) { + return { + ...token, + accessToken: account.access_token, + expiresAt: account.expires_at, + } + } + return token + }, + + session: async ({ token, session }) => { + return { + ...session, + accessToken: token.accessToken, + } + }, + }, +} diff --git a/dashboard/src/app/api/auth/[...nextauth]/route.ts b/dashboard/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 000000000..7ba56c26a --- /dev/null +++ b/dashboard/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,6 @@ +import NextAuth from 'next-auth' +import { authOptions } from './authOptions' + +const handler = NextAuth(authOptions) + +export { handler as GET, handler as POST } diff --git a/dashboard/src/app/api/auth/signin/LoginButton.tsx b/dashboard/src/app/api/auth/signin/LoginButton.tsx new file mode 100644 index 000000000..fb1a7a518 --- /dev/null +++ b/dashboard/src/app/api/auth/signin/LoginButton.tsx @@ -0,0 +1,17 @@ +'use client' +import { ClientSafeProvider, signIn } from 'next-auth/react' +import { useSearchParams } from 'next/navigation' +import { FC } from 'react' + +export const LoginButton: FC> = ({ id, name }) => { + const searchParams = useSearchParams() + const callbackUrl = searchParams.get('callbackUrl') || '/' + return ( + + ) +} diff --git a/dashboard/apps/web/public/handsome-horse.png b/dashboard/src/app/api/auth/signin/handsome-horse.png similarity index 100% rename from dashboard/apps/web/public/handsome-horse.png rename to dashboard/src/app/api/auth/signin/handsome-horse.png diff --git a/dashboard/src/app/api/auth/signin/page.tsx b/dashboard/src/app/api/auth/signin/page.tsx new file mode 100644 index 000000000..afd0d07dc --- /dev/null +++ b/dashboard/src/app/api/auth/signin/page.tsx @@ -0,0 +1,35 @@ +import { Metadata } from 'next' +import { getProviders } from 'next-auth/react' +import Image from 'next/image' +import { LoginButton } from './LoginButton' +import handsomeHorse from './handsome-horse.png' + +export const metadata: Metadata = { + title: 'Login - Littlehorse Dashboard', +} +export const dynamic = 'force-dynamic' + +export default async function Login() { + const providers = await getProviders() + const year = new Date().getFullYear() + return ( +
+
+ LittleHorse +
+
+
+

+ Welcome to your + Littlehorse + Dashboard +

+ {Object.values(providers || {}).map(({ id, name }) => ( + + ))} +
+
Copyright © {year} LittleHorse Enterprises LLC.
+
+
+ ) +} diff --git a/dashboard/src/app/constants.ts b/dashboard/src/app/constants.ts new file mode 100644 index 000000000..0369d9467 --- /dev/null +++ b/dashboard/src/app/constants.ts @@ -0,0 +1,39 @@ +import { LHStatus, VariableType } from 'littlehorse-client/dist/proto/common_enums' + +export const SEARCH_LIMITS = [10, 20, 30, 60, 100] as const +export type SearchLimit = (typeof SEARCH_LIMITS)[number] +export const SEARCH_DEFAULT_LIMIT: SearchLimit = 10 + +export const VARIABLE_TYPES: { [key in VariableType]: string } = { + JSON_OBJ: 'JSON Object', + JSON_ARR: 'JSON Array', + DOUBLE: 'Double', + BOOL: 'Boolean', + STR: 'String', + INT: 'Integer', + BYTES: 'Bytes', + UNRECOGNIZED: 'Unrecognized', +} + +export const SEARCH_ENTITIES = ['WfSpec', 'TaskDef', 'UserTaskDef', 'ExternalEventDef'] as const +export const WF_RUN_STATUSES = Object.values(LHStatus).filter(status => status !== 'UNRECOGNIZED') +export type SearchType = (typeof SEARCH_ENTITIES)[number] + +const toTime = (minutes: number) => { + return minutes * 60 +} + +export const TIME_RANGES = [5, 15, 30, 60, 180, 360, 720, 1440, 4320] as const +export type TimeRange = (typeof TIME_RANGES)[number] + +export const TIME_RANGES_NAMES: { [key in TimeRange]: string } = { + 5: '5 minutes', + 15: '15 minutes', + 30: '30 minutes', + 60: '1 hour', + 180: '3 hours', + 360: '6 hours', + 720: '12 hours', + 1440: '1 day', + 4320: '3 days', +} diff --git a/dashboard/src/app/getWhoami.ts b/dashboard/src/app/getWhoami.ts new file mode 100644 index 000000000..048ac66e3 --- /dev/null +++ b/dashboard/src/app/getWhoami.ts @@ -0,0 +1,36 @@ +import lhConfig from '@/lhConfig' +import { ACLAction, ACLResource, Principal, ServerACLs } from 'littlehorse-client/dist/proto/acls' +import { getServerSession } from 'next-auth' +import { WhoAmI } from '../types' +import { authOptions } from './api/auth/[...nextauth]/authOptions' + +const getWhoAmI = async (): Promise => { + const session = await getServerSession(authOptions) + const client = lhConfig.getClient(session?.accessToken) + + const { id, perTenantAcls, globalAcls } = await client.whoami({}) + + const tenants = getTenants({ perTenantAcls, globalAcls }) + + return { + user: session?.user || { name: id?.id }, + tenants, + } +} + +const getTenants = ({ perTenantAcls, globalAcls }: Pick): string[] => { + let tenants: string[] = [] + if (globalAcls && hasDefaultAccess(globalAcls)) { + tenants = ['default'] + } + return [...tenants, ...Object.keys(perTenantAcls)] +} + +const hasDefaultAccess = ({ acls }: ServerACLs): boolean => { + const result = acls.filter(({ resources, allowedActions }) => { + return resources.includes(ACLResource.ACL_ALL_RESOURCES) && allowedActions.includes(ACLAction.ALL_ACTIONS) + }) + return result.length > 0 +} + +export default getWhoAmI diff --git a/dashboard/src/app/globals.css b/dashboard/src/app/globals.css new file mode 100644 index 000000000..9bc13f792 --- /dev/null +++ b/dashboard/src/app/globals.css @@ -0,0 +1,15 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; +} + +body { + color: rgb(var(--foreground-rgb)); +} + +svg { + fill: currentColor; +} diff --git a/dashboard/src/app/layout.tsx b/dashboard/src/app/layout.tsx new file mode 100644 index 000000000..60ef2683c --- /dev/null +++ b/dashboard/src/app/layout.tsx @@ -0,0 +1,21 @@ +import type { Metadata } from 'next' +import { Inter } from 'next/font/google' +import './globals.css' + +const inter = Inter({ subsets: ['latin'] }) + +export const metadata: Metadata = { + title: 'Littlehorse Dashboard', +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + return ( + + {children} + + ) +} diff --git a/dashboard/src/app/lhClient.ts b/dashboard/src/app/lhClient.ts new file mode 100644 index 000000000..1664df182 --- /dev/null +++ b/dashboard/src/app/lhClient.ts @@ -0,0 +1,11 @@ +'use server' + +import { getServerSession } from 'next-auth' +import { WithTenant } from '../types' +import { getClient } from '../lhConfig' +import { authOptions } from './api/auth/[...nextauth]/authOptions' + +export const lhClient = async ({ tenantId }: WithTenant) => { + const session = await getServerSession(authOptions) + return getClient({ tenantId, accessToken: session?.accessToken }) +} diff --git a/dashboard/src/app/utils/date.ts b/dashboard/src/app/utils/date.ts new file mode 100644 index 000000000..0f69af98d --- /dev/null +++ b/dashboard/src/app/utils/date.ts @@ -0,0 +1,11 @@ +export const formatDate = (date?: Date | number) => { + return new Intl.DateTimeFormat('en-US', { + year: 'numeric', + month: 'numeric', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: false, + }).format(date) +} diff --git a/dashboard/src/app/utils/index.ts b/dashboard/src/app/utils/index.ts new file mode 100644 index 000000000..6d4d0f4e2 --- /dev/null +++ b/dashboard/src/app/utils/index.ts @@ -0,0 +1,3 @@ +export * from './variables' +export * from './date' +export * from './wfRun' diff --git a/dashboard/src/app/utils/variables.test.ts b/dashboard/src/app/utils/variables.test.ts new file mode 100644 index 000000000..8ed890e4c --- /dev/null +++ b/dashboard/src/app/utils/variables.test.ts @@ -0,0 +1,101 @@ +import { VariableAssignment } from 'littlehorse-client/dist/proto/common_wfspec' +import { getVariable } from './variables' + +describe('getVariable', () => { + it('should return from literalValue str', () => { + const variable: VariableAssignment = { + literalValue: { + str: 'string', + }, + } + expect(getVariable(variable)).toEqual('string') + }) + + it('should return from literalValue bool', () => { + const variable: VariableAssignment = { + literalValue: { + bool: true, + }, + } + expect(getVariable(variable)).toEqual(true) + }) + + it('should return variableName', () => { + const variable: VariableAssignment = { + variableName: 'variable', + } + expect(getVariable(variable)).toEqual('{variable}') + }) + + it('should return variableName with jsonPath', () => { + const variable: VariableAssignment = { + variableName: 'variable', + jsonPath: '$.path', + } + expect(getVariable(variable)).toEqual('{variable.path}') + }) + + it('should return from formatString', async () => { + const variable: VariableAssignment = { + formatString: { + format: { + literalValue: { + str: '{0} => {1}', + }, + }, + args: [ + { + literalValue: { + str: 'first', + }, + }, + { + literalValue: { + str: 'second', + }, + }, + ], + }, + } + expect(getVariable(variable)).toEqual('first => second') + }) + + it('should return from stacked formatString', async () => { + const variable: VariableAssignment = { + formatString: { + format: { + formatString: { + format: { + literalValue: { + str: '{0} => {1}', + }, + }, + args: [ + { + literalValue: { + str: '{1}', + }, + }, + { + literalValue: { + str: '{0}', + }, + }, + ], + }, + }, + args: [ + { + literalValue: { + str: 'arg1', + }, + }, + { + variableName: 'arg1', + }, + ], + }, + } + expect(getVariable(variable)).toEqual('{arg1} => arg1') + }) +}) diff --git a/dashboard/src/app/utils/variables.ts b/dashboard/src/app/utils/variables.ts new file mode 100644 index 000000000..30d5569ca --- /dev/null +++ b/dashboard/src/app/utils/variables.ts @@ -0,0 +1,34 @@ +import { VariableAssignment } from 'littlehorse-client/dist/proto/common_wfspec' +import { VariableValue } from 'littlehorse-client/dist/proto/variable' + +export const getVariable = (variable?: VariableAssignment) => { + if (!variable) return + if (variable.formatString) return getValueFromFormatString(variable) + if (variable.variableName) { + return getValueFromVariableName(variable) + } + if (variable.literalValue) return getVariableValue(variable.literalValue) +} + +export const getVariableValue = (variable?: VariableValue) => { + if (!variable) return + const key = Object.keys(variable)[0] as keyof VariableValue + return variable[key] +} + +const getValueFromVariableName = ({ + variableName, + jsonPath, +}: Pick) => { + if (!variableName) return + if (jsonPath) return `{${jsonPath.replace('$', variableName)}}` + return `{${variableName}}` +} + +const getValueFromFormatString = ({ formatString }: Pick): string | undefined => { + if (!formatString) return + const template = getVariable(formatString.format) + const args = formatString.args.map(getVariable) + + return `${template}`.replace(/{(\d+)}/g, (_, index) => `${args[index]}`) +} diff --git a/dashboard/src/app/utils/wfRun.test.ts b/dashboard/src/app/utils/wfRun.test.ts new file mode 100644 index 000000000..3881f2661 --- /dev/null +++ b/dashboard/src/app/utils/wfRun.test.ts @@ -0,0 +1,30 @@ +import { WfRunId } from 'littlehorse-client/dist/proto/object_id' +import { concatWfRunIds } from '.' + +describe('concatWfRunIds', () => { + it('should return reverse relationship', () => { + const wfRunId: WfRunId = { + id: 'child', + parentWfRunId: { + id: 'parent', + }, + } + expect(concatWfRunIds(wfRunId)).toEqual('parent/child') + }) + + it('should return stacked reverse relationship', () => { + const wfRunId: WfRunId = { + id: 'child', + parentWfRunId: { + id: 'parent', + parentWfRunId: { + id: 'grandparent', + parentWfRunId: { + id: 'great-grandparent', + }, + }, + }, + } + expect(concatWfRunIds(wfRunId)).toEqual('great-grandparent/grandparent/parent/child') + }) +}) diff --git a/dashboard/src/app/utils/wfRun.ts b/dashboard/src/app/utils/wfRun.ts new file mode 100644 index 000000000..75caf5815 --- /dev/null +++ b/dashboard/src/app/utils/wfRun.ts @@ -0,0 +1,11 @@ +import { WfRunId } from 'littlehorse-client/dist/proto/object_id' + +export const concatWfRunIds = (wfRunId: WfRunId) => { + const ids = [] + let current: WfRunId | undefined = wfRunId + while (current) { + ids.push(current.id) + current = current.parentWfRunId + } + return ids.reverse().join('/') +} diff --git a/dashboard/src/contexts/WhoAmIContext.tsx b/dashboard/src/contexts/WhoAmIContext.tsx new file mode 100644 index 000000000..8168be7a8 --- /dev/null +++ b/dashboard/src/contexts/WhoAmIContext.tsx @@ -0,0 +1,35 @@ +'use client' + +import { setTenant } from '@/setTenant' +import { DefaultSession } from 'next-auth' +import { FC, PropsWithChildren, createContext, useContext, useEffect } from 'react' + +type ContextProps = { + user: DefaultSession['user'] + tenantId?: string + tenants: string[] +} + +const Context = createContext({ + user: {}, + tenantId: '', + tenants: [], +}) + +type WhoAmIContextProps = ContextProps + +export const WhoAmIContext: FC> = ({ children, user, tenants, tenantId }) => { + useEffect(() => { + if (!tenantId) { + setTenant(tenants[0]) + } + }) + + return {children} +} + +export const useWhoAmI = () => { + const context = useContext(Context) + + return context +} diff --git a/dashboard/src/lhConfig.ts b/dashboard/src/lhConfig.ts new file mode 100644 index 000000000..bfba54536 --- /dev/null +++ b/dashboard/src/lhConfig.ts @@ -0,0 +1,21 @@ +import { LHConfig } from 'littlehorse-client' + +const CONFIG = { + apiHost: process.env.LHC_API_HOST || 'localhost', + apiPort: process.env.LHC_API_PORT || '2023', + protocol: process.env.LHD_OAUTH_ENABLED === 'true' ? 'SSL' : 'PLAINTEXT', + caCert: process.env.LHC_CA_CERT, +} + +const config = LHConfig.from(CONFIG) + +export const getClient = ({ tenantId, accessToken }: { tenantId?: string; accessToken?: string }) => { + const config = LHConfig.from({ + ...CONFIG, + tenantId, + }) + + return config.getClient(accessToken) +} + +export default config diff --git a/dashboard/src/littlehorse.svg b/dashboard/src/littlehorse.svg new file mode 100644 index 000000000..5d2a404d8 --- /dev/null +++ b/dashboard/src/littlehorse.svg @@ -0,0 +1,3 @@ + + + diff --git a/dashboard/src/middleware.ts b/dashboard/src/middleware.ts new file mode 100644 index 000000000..20c2754a8 --- /dev/null +++ b/dashboard/src/middleware.ts @@ -0,0 +1,24 @@ +import nextAuth from 'next-auth/middleware' +import { NextResponse } from 'next/server' +import { getToken } from 'next-auth/jwt' + +const withoutAuth = () => { + NextResponse.next() +} + +const withAuth = nextAuth(async req => { + const token = await getToken({ req }) + const baseUrl = req.nextUrl.origin + const currentPath = req.nextUrl.pathname + if (!token || token.expiresAt! < Date.now() / 1000) { + return NextResponse.redirect(`${baseUrl}/api/auth/signin?callbackUrl=${currentPath}`) + } + + return NextResponse.next() +}) + +export const config = { + matcher: ['/((?!api|_next/static|_next/image|images|favicon.ico).*)'], +} + +export default process.env.LHD_OAUTH_ENABLED === 'true' ? withAuth : withoutAuth diff --git a/dashboard/src/setTenant.ts b/dashboard/src/setTenant.ts new file mode 100644 index 000000000..6c0104db0 --- /dev/null +++ b/dashboard/src/setTenant.ts @@ -0,0 +1,6 @@ +'use server' +import { cookies } from 'next/headers' + +export const setTenant = async (tenantId: string) => { + cookies().set('tenantId', tenantId) +} diff --git a/dashboard/src/types/index.ts b/dashboard/src/types/index.ts new file mode 100644 index 000000000..5751290e6 --- /dev/null +++ b/dashboard/src/types/index.ts @@ -0,0 +1,19 @@ +import { DefaultSession } from 'next-auth' + +export type WhoAmI = { + user: DefaultSession['user'] + tenants: string[] +} + +export type WithTenant = { + tenantId?: string +} + +export type WithBookmark = { + bookmark?: string +} + +export type VersionList = { + versions: string[] + bookmark?: string +} diff --git a/dashboard/src/types/next-auth.d.ts b/dashboard/src/types/next-auth.d.ts new file mode 100644 index 000000000..6406659f7 --- /dev/null +++ b/dashboard/src/types/next-auth.d.ts @@ -0,0 +1,15 @@ +import { JWT } from 'next-auth/jwt' +import NextAuth, { DefaultSession } from 'next-auth' + +declare module 'next-auth/jwt' { + interface JWT { + accessToken?: string + expiresAt?: number + } +} + +declare module 'next-auth' { + interface Session { + accessToken: string + } +} diff --git a/dashboard/tailwind.config.ts b/dashboard/tailwind.config.ts new file mode 100644 index 000000000..293fec764 --- /dev/null +++ b/dashboard/tailwind.config.ts @@ -0,0 +1,26 @@ +import type { Config } from 'tailwindcss' + +const config: Config = { + important: true, + content: [ + './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + './src/components/**/*.{js,ts,jsx,tsx,mdx}', + './src/app/**/*.{js,ts,jsx,tsx,mdx}', + ], + safelist: ['stroke-green-500', 'stroke-red-500'], + theme: { + extend: { + colors: ({ colors }) => ({ + ...colors, + black: '#242529', + blue: { 500: '#7F7AFF' }, + }), + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + 'gradient-conic': 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', + }, + }, + }, + plugins: [], +} +export default config diff --git a/dashboard/tsconfig.json b/dashboard/tsconfig.json new file mode 100644 index 000000000..7b2858930 --- /dev/null +++ b/dashboard/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/dashboard/turbo.json b/dashboard/turbo.json deleted file mode 100644 index 0d805adda..000000000 --- a/dashboard/turbo.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "globalDependencies": ["**/.env.*local"], - "pipeline": { - "build": { - "dependsOn": ["^build"], - "env": [ - "AUTH_SECRET", - "GOOGLE_ID", - "GOOGLE_SECRET", - "NEXTAUTH_URL", - "GITHUB_ID", - "GITHUB_SECRET", - "AZURE_AD_CLIENT_ID", - "AZURE_AD_CLIENT_SECRET", - "AZURE_AD_TENANT_ID", - "OKTA_CLIENT_ID", - "OKTA_CLIENT_SECRET", - "OKTA_ISSUER_URI", - "API_URL", - "KEYCLOAK_CLIENT_ID", - "KEYCLOAK_CLIENT_SECRET", - "KEYCLOAK_ISSUER_URI" - ], - "outputs": [".next/**", "!.next/cache/**"] - }, - "lint": {}, - "dev": { - "cache": false, - "persistent": true - }, - "start": { - "cache": false, - "persistent": true - } - } -} diff --git a/docker/dashboard/Dockerfile b/docker/dashboard/Dockerfile index a529f028e..476d9a49f 100644 --- a/docker/dashboard/Dockerfile +++ b/docker/dashboard/Dockerfile @@ -1,25 +1,18 @@ -FROM node:20 AS base -RUN apt-get update && apt-get install -y uuid-runtime \ - && rm -rf /var/lib/apt/lists/* +FROM ghcr.io/littlehorse-enterprises/alpine-nginx-nodejs/nginx-nodejs:main as runner +ENV NODE_ENV production -FROM base AS runner -WORKDIR /lh/dashboard -ENV NODE_ENV=production +RUN apk add --no-cache uuidgen -RUN groupadd -g 1001 nodejs -RUN useradd nextjs -u 1001 -USER nextjs +RUN mkdir /app +WORKDIR /app +RUN mkdir .next -COPY --chown=nextjs:nodejs ./dashboard/apps/web/.next/standalone ./ -COPY --chown=nextjs:nodejs ./dashboard/apps/web/.next/static ./apps/web/.next/static -COPY --chown=nextjs:nodejs ./dashboard/apps/web/public ./apps/web/public +COPY ./dashboard/.next/standalone ./ +COPY ./dashboard/.next/static ./.next/static -COPY ./docker/dashboard/docker-entrypoint.sh ./ +COPY ./docker/dashboard/entrypoint.sh ./entrypoint.sh +EXPOSE 3000 +ENV PORT 3000 +ENV HOSTNAME "0.0.0.0" -EXPOSE 8080 - -ENV PORT 8080 -ENV HOSTNAME 0.0.0.0 - -ENTRYPOINT ["/lh/dashboard/docker-entrypoint.sh"] -CMD ["dashboard"] +ENTRYPOINT [ "/app/entrypoint.sh" ] diff --git a/docker/dashboard/docker-entrypoint.sh b/docker/dashboard/docker-entrypoint.sh deleted file mode 100755 index 0d1b8e188..000000000 --- a/docker/dashboard/docker-entrypoint.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -set -e - -if [ "$1" = 'dashboard' ]; then - shift - - # Env variables to translate here - # LHD_API_HOST - # LHD_API_PORT - # LHD_OAUTH_ENABLED - # LHD_OAUTH_CLIENT_ID - # LHD_OAUTH_CLIENT_SECRET - # LHD_OAUTH_SERVER_URL - # LHD_OAUTH_CALLBACK_URL - # LHD_OAUTH_ENCRYPT_SECRET - - if [ -z "${LHD_API_HOST}" ]; then - echo "Provide the LHD_API_HOST env variable" - exit 1 - fi - - if [ -z "${LHD_API_PORT}" ]; then - echo "Provide the LHD_API_PORT env variable" - exit 1 - fi - - export API_URL="${LHD_API_HOST}:${LHD_API_PORT}" - export LHD_OAUTH_ENABLED=${LHD_OAUTH_ENABLED:-"false"} - - if [ "${LHD_OAUTH_ENABLED}" == "true" ]; then - if [ -z "${LHD_OAUTH_CLIENT_ID}" ] || [ -z "${LHD_OAUTH_CLIENT_SECRET}" ] || [ -z "${LHD_OAUTH_SERVER_URL}" ] || [ -z "${LHD_OAUTH_ENCRYPT_SECRET}" ] || [ -z "${LHD_OAUTH_CALLBACK_URL}" ]; then - echo "Authentication is enabled and some configuration were not provided. Please refer to our documentation https://github.com/littlehorse-enterprises/littlehorse/blob/master/docs/DASHBOARD_CONFIGURATIONS.md" - exit 1 - fi - - export NEXTAUTH_URL=${LHD_OAUTH_CALLBACK_URL} - export KEYCLOAK_CLIENT_ID=${LHD_OAUTH_CLIENT_ID} - export KEYCLOAK_CLIENT_SECRET=${LHD_OAUTH_CLIENT_SECRET} - export KEYCLOAK_ISSUER_URI=${LHD_OAUTH_SERVER_URL} - export AUTH_SECRET=${LHD_OAUTH_ENCRYPT_SECRET} - else - export AUTH_SECRET=$(uuidgen) - fi - - node apps/web/server.js -fi - -exec "$@" diff --git a/docker/dashboard/entrypoint.sh b/docker/dashboard/entrypoint.sh new file mode 100755 index 000000000..0ed5fa3ae --- /dev/null +++ b/docker/dashboard/entrypoint.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +set -e + +# Env variables to translate here +# LHD_OAUTH_ENABLED +# LHD_OAUTH_CLIENT_ID +# LHD_OAUTH_CLIENT_SECRET +# LHD_OAUTH_ISSUER_URI +# LHD_OAUTH_CALLBACK_URL +# LHD_OAUTH_ENCRYPT_SECRET + +if [ -z "${LHC_API_HOST}" ]; then + echo "Provide the LHC_API_HOST env variable" + exit 1 +fi + +if [ -z "${LHC_API_PORT}" ]; then + echo "Provide the LHC_API_PORT env variable" + exit 1 +fi + +export LHD_OAUTH_ENABLED=${LHD_OAUTH_ENABLED:-"false"} + +if [ "${LHD_OAUTH_ENABLED}" == "true" ]; then + if [ -z "${LHD_OAUTH_CLIENT_ID}" ] || [ -z "${LHD_OAUTH_CLIENT_SECRET}" ] || [ -z "${LHD_OAUTH_ISSUER_URI}" ] || [ -z "${LHD_OAUTH_ENCRYPT_SECRET}" ] || [ -z "${LHD_OAUTH_CALLBACK_URL}" ]; then + echo "Authentication is enabled and some configuration were not provided. Please refer to our documentation https://github.com/littlehorse-enterprises/littlehorse/blob/master/docs/DASHBOARD_CONFIGURATIONS.md" + exit 1 + fi + + export NEXTAUTH_URL=${LHD_OAUTH_CALLBACK_URL} + export KEYCLOAK_CLIENT_ID=${LHD_OAUTH_CLIENT_ID} + export KEYCLOAK_CLIENT_SECRET=${LHD_OAUTH_CLIENT_SECRET} + export KEYCLOAK_ISSUER_URI=${LHD_OAUTH_ISSUER_URI} + export NEXTAUTH_SECRET=${LHD_OAUTH_ENCRYPT_SECRET} +else + export NEXTAUTH_SECRET=$(uuidgen) +fi + +/entrypoint.sh + + + \ No newline at end of file diff --git a/docker/standalone/Dockerfile b/docker/standalone/Dockerfile index e834ac0a1..d49348b3d 100644 --- a/docker/standalone/Dockerfile +++ b/docker/standalone/Dockerfile @@ -9,7 +9,6 @@ RUN mkdir /kafka /lh \ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ && apt update && apt install -y nodejs \ - && npm i -g pnpm \ && rm -rf /var/lib/apt/lists/* \ && wget -q https://downloads.apache.org/kafka/3.7.0/kafka_2.12-3.7.0.tgz -O /tmp/kafka.tgz \ && tar -xzf /tmp/kafka.tgz --strip-components 1 -C /kafka \ @@ -24,9 +23,8 @@ WORKDIR /lh/dashboard ENV NODE_ENV=production EXPOSE 8080 -COPY ./dashboard/apps/web/.next/standalone ./ -COPY ./dashboard/apps/web/.next/static ./apps/web/.next/static -COPY ./dashboard/apps/web/public ./apps/web/public +COPY ./dashboard/.next/standalone ./ +COPY ./dashboard/.next/static ./.next/static WORKDIR / @@ -34,5 +32,6 @@ COPY ./server/build/libs/server-*-all.jar /lh/server.jar ENV LHD_API_HOST=localhost ENV LHD_API_PORT=2023 +ENV DASHBOARD_NEXT=true ENTRYPOINT ["/lh/docker-entrypoint.sh"] diff --git a/docker/standalone/dashboard-entrypoint.sh b/docker/standalone/dashboard-entrypoint.sh index 6b40ef067..f502d63e9 100755 --- a/docker/standalone/dashboard-entrypoint.sh +++ b/docker/standalone/dashboard-entrypoint.sh @@ -36,11 +36,13 @@ if [ "${LHD_OAUTH_ENABLED}" == "true" ]; then export KEYCLOAK_CLIENT_SECRET=${LHD_OAUTH_CLIENT_SECRET} export KEYCLOAK_ISSUER_URI=${LHD_OAUTH_SERVER_URL} export AUTH_SECRET=${LHD_OAUTH_ENCRYPT_SECRET} + export NEXTAUTH_SECRET=${AUTH_SECRET} else export AUTH_SECRET=$(uuidgen) + export NEXTAUTH_SECRET=${AUTH_SECRET} fi export HOSTNAME=0.0.0.0 export PORT=8080 -node /lh/dashboard/apps/web/server.js +node /lh/dashboard/server.js diff --git a/local-dev/build.sh b/local-dev/build.sh index 7a5680698..fc6d7f8b9 100755 --- a/local-dev/build.sh +++ b/local-dev/build.sh @@ -37,8 +37,8 @@ done if [[ ${dashboard} = true ]]; then echo "Building lh-dashboard" cd dashboard - pnpm install - pnpm build + npm install + npm run build cd .. docker build -t littlehorse/lh-dashboard:latest -f docker/dashboard/Dockerfile . fi diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..c8262e6a5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "littlehorse", + "lockfileVersion": 3, + "requires": true, + "packages": {} +}