From fa0cf165c927cb5386297f5606deb36d8cb3f150 Mon Sep 17 00:00:00 2001 From: Chaya Malik Date: Mon, 18 Mar 2024 14:59:52 -0400 Subject: [PATCH 1/6] spruce/v3.0.224 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c9d66663ed..958e14664c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "spruce", - "version": "3.0.223", + "version": "3.0.224", "private": true, "scripts": { "bootstrap-logkeeper": "./scripts/bootstrap-logkeeper.sh", From c94a5935c8dfa4fbd178bc9bc7e64ff2161ca114 Mon Sep 17 00:00:00 2001 From: minnakt <47064971+minnakt@users.noreply.github.com> Date: Mon, 18 Mar 2024 19:44:36 -0400 Subject: [PATCH 2/6] DEVPROD-4193: Redirect to project identifier on Project Health page (#2290) --- .../useProjectHealthAnalytics.ts | 7 +- src/components/Header/Navbar.tsx | 17 +- src/gql/generated/types.ts | 36 ++++ src/gql/queries/index.ts | 2 + src/gql/queries/project.graphql | 6 + src/hooks/useProjectRedirect/index.ts | 45 +++++ .../useProjectRedirect.test.tsx | 157 ++++++++++++++++++ src/pages/commits/index.tsx | 19 ++- 8 files changed, 280 insertions(+), 9 deletions(-) create mode 100644 src/gql/queries/project.graphql create mode 100644 src/hooks/useProjectRedirect/index.ts create mode 100644 src/hooks/useProjectRedirect/useProjectRedirect.test.tsx diff --git a/src/analytics/projectHealth/useProjectHealthAnalytics.ts b/src/analytics/projectHealth/useProjectHealthAnalytics.ts index 6ec3a4f01d..1a4a04069c 100644 --- a/src/analytics/projectHealth/useProjectHealthAnalytics.ts +++ b/src/analytics/projectHealth/useProjectHealthAnalytics.ts @@ -44,7 +44,12 @@ type Action = name: "Add Notification"; subscription: SaveSubscriptionForUserMutationVariables["subscription"]; } - | { name: "Toggle view"; toggle: ProjectHealthView }; + | { name: "Toggle view"; toggle: ProjectHealthView } + | { + name: "Redirect to project identifier"; + projectId: string; + projectIdentifier: string; + }; export const useProjectHealthAnalytics = (p: { page: pageType }) => useAnalyticsRoot("ProjectHealthPages", { page: p.page }); diff --git a/src/components/Header/Navbar.tsx b/src/components/Header/Navbar.tsx index d02ecccee6..d6a45cb846 100644 --- a/src/components/Header/Navbar.tsx +++ b/src/components/Header/Navbar.tsx @@ -16,9 +16,12 @@ import { useAuthStateContext } from "context/Auth"; import { UserQuery, SpruceConfigQuery } from "gql/generated/types"; import { USER, SPRUCE_CONFIG } from "gql/queries"; import { useLegacyUIURL } from "hooks"; +import { validators } from "utils"; import { AuxiliaryDropdown } from "./AuxiliaryDropdown"; import { UserDropdown } from "./UserDropdown"; +const { validateObjectId } = validators; + const { blue, gray, white } = palette; export const Navbar: React.FC = () => { @@ -33,16 +36,20 @@ export const Navbar: React.FC = () => { const { projectIdentifier: projectFromUrl } = useParams<{ projectIdentifier: string; }>(); + const currProject = Cookies.get(CURRENT_PROJECT); - // Update current project cookie if the project in the URL does not equal the cookie value. + // Update current project cookie if the project in the URL is not an objectId and is not equal + // to the current project. // This will inform future navigations to the /commits page. useEffect(() => { - if (projectFromUrl && projectFromUrl !== Cookies.get(CURRENT_PROJECT)) { + if ( + projectFromUrl && + !validateObjectId(projectFromUrl) && + projectFromUrl !== currProject + ) { Cookies.set(CURRENT_PROJECT, projectFromUrl); } - }, [projectFromUrl]); - - const currProject = projectFromUrl ?? Cookies.get(CURRENT_PROJECT); + }, [currProject, projectFromUrl]); const { data: configData } = useQuery(SPRUCE_CONFIG, { skip: currProject !== undefined, diff --git a/src/gql/generated/types.ts b/src/gql/generated/types.ts index 769810448e..2c912cd4ad 100644 --- a/src/gql/generated/types.ts +++ b/src/gql/generated/types.ts @@ -699,6 +699,7 @@ export type Host = { instanceType?: Maybe; lastCommunicationTime?: Maybe; noExpiration: Scalars["Boolean"]["output"]; + persistentDnsName: Scalars["String"]["output"]; provider: Scalars["String"]["output"]; runningTask?: Maybe; startedBy: Scalars["String"]["output"]; @@ -1057,6 +1058,7 @@ export type Mutation = { unschedulePatchTasks?: Maybe; unscheduleTask: Task; updateHostStatus: Scalars["Int"]["output"]; + updateParsleySettings?: Maybe; updatePublicKey: Array; updateSpawnHostStatus: Host; updateUserSettings: Scalars["Boolean"]["output"]; @@ -1315,6 +1317,10 @@ export type MutationUpdateHostStatusArgs = { status: Scalars["String"]["input"]; }; +export type MutationUpdateParsleySettingsArgs = { + opts: UpdateParsleySettingsInput; +}; + export type MutationUpdatePublicKeyArgs = { targetKeyName: Scalars["String"]["input"]; updateInfo: PublicKeyInput; @@ -1406,6 +1412,16 @@ export type ParsleyFilterInput = { expression: Scalars["String"]["input"]; }; +/** ParsleySettings contains information about a user's settings for Parsley. */ +export type ParsleySettings = { + __typename?: "ParsleySettings"; + sectionsEnabled: Scalars["Boolean"]["output"]; +}; + +export type ParsleySettingsInput = { + sectionsEnabled?: InputMaybe; +}; + /** Patch is a manually initiated version submitted to test local code changes. */ export type Patch = { __typename?: "Patch"; @@ -2532,6 +2548,7 @@ export type Task = { startTime?: Maybe; status: Scalars["String"]["output"]; stepbackInfo?: Maybe; + tags: Array; /** @deprecated Use files instead */ taskFiles: TaskFiles; taskGroup?: Maybe; @@ -2865,6 +2882,15 @@ export type UiConfig = { userVoice?: Maybe; }; +export type UpdateParsleySettingsInput = { + parsleySettings: ParsleySettingsInput; +}; + +export type UpdateParsleySettingsPayload = { + __typename?: "UpdateParsleySettingsPayload"; + parsleySettings?: Maybe; +}; + /** * UpdateVolumeInput is the input to the updateVolume mutation. * Its fields determine how a given volume will be modified. @@ -2911,6 +2937,7 @@ export type User = { displayName: Scalars["String"]["output"]; emailAddress: Scalars["String"]["output"]; parsleyFilters: Array; + parsleySettings: ParsleySettings; patches: Patches; permissions: Permissions; subscriptions?: Maybe>; @@ -7389,6 +7416,15 @@ export type ProjectSettingsQuery = { }; }; +export type ProjectQueryVariables = Exact<{ + idOrIdentifier: Scalars["String"]["input"]; +}>; + +export type ProjectQuery = { + __typename?: "Query"; + project: { __typename?: "Project"; id: string; identifier: string }; +}; + export type ProjectsQueryVariables = Exact<{ [key: string]: never }>; export type ProjectsQuery = { diff --git a/src/gql/queries/index.ts b/src/gql/queries/index.ts index c1e97bad63..b62c6dba1e 100644 --- a/src/gql/queries/index.ts +++ b/src/gql/queries/index.ts @@ -46,6 +46,7 @@ import PROJECT_EVENT_LOGS from "./project-event-logs.graphql"; import PROJECT_HEALTH_VIEW from "./project-health-view.graphql"; import PROJECT_PATCHES from "./project-patches.graphql"; import PROJECT_SETTINGS from "./project-settings.graphql"; +import PROJECT from "./project.graphql"; import PROJECTS from "./projects.graphql"; import MY_PUBLIC_KEYS from "./public-keys.graphql"; import REPO_EVENT_LOGS from "./repo-event-logs.graphql"; @@ -124,6 +125,7 @@ export { PATCH, POD_EVENTS, POD, + PROJECT, PROJECT_BANNER, PROJECT_EVENT_LOGS, PROJECT_HEALTH_VIEW, diff --git a/src/gql/queries/project.graphql b/src/gql/queries/project.graphql new file mode 100644 index 0000000000..9c50d685c1 --- /dev/null +++ b/src/gql/queries/project.graphql @@ -0,0 +1,6 @@ +query Project($idOrIdentifier: String!) { + project(projectIdentifier: $idOrIdentifier) { + id + identifier + } +} diff --git a/src/hooks/useProjectRedirect/index.ts b/src/hooks/useProjectRedirect/index.ts new file mode 100644 index 0000000000..a3b2450977 --- /dev/null +++ b/src/hooks/useProjectRedirect/index.ts @@ -0,0 +1,45 @@ +import { useQuery } from "@apollo/client"; +import { useParams, useLocation, useNavigate } from "react-router-dom"; +import { ProjectQuery, ProjectQueryVariables } from "gql/generated/types"; +import { PROJECT } from "gql/queries"; +import { validators } from "utils"; + +const { validateObjectId } = validators; + +interface UseProjectRedirectProps { + sendAnalyticsEvent: (projectId: string, projectIdentifier: string) => void; +} + +/** + * useProjectRedirect will replace the project id with the project identifier in the URL. + * @param props - Object containing the following: + * @param props.sendAnalyticsEvent - analytics event to send upon redirect + * @returns isRedirecting - boolean to indicate if a redirect is in progress + */ +export const useProjectRedirect = ({ + sendAnalyticsEvent = () => {}, +}: UseProjectRedirectProps) => { + const { projectIdentifier: project } = useParams<{ + projectIdentifier: string; + }>(); + const navigate = useNavigate(); + const location = useLocation(); + + const needsRedirect = validateObjectId(project); + + const { loading } = useQuery(PROJECT, { + skip: !needsRedirect, + variables: { + idOrIdentifier: project, + }, + onCompleted: (projectData) => { + const { identifier } = projectData.project; + const currentUrl = location.pathname.concat(location.search); + const redirectPathname = currentUrl.replace(project, identifier); + sendAnalyticsEvent(project, identifier); + navigate(redirectPathname); + }, + }); + + return { isRedirecting: needsRedirect && loading }; +}; diff --git a/src/hooks/useProjectRedirect/useProjectRedirect.test.tsx b/src/hooks/useProjectRedirect/useProjectRedirect.test.tsx new file mode 100644 index 0000000000..ff5b8241d8 --- /dev/null +++ b/src/hooks/useProjectRedirect/useProjectRedirect.test.tsx @@ -0,0 +1,157 @@ +import { MockedProvider } from "@apollo/client/testing"; +import { GraphQLError } from "graphql"; +import { MemoryRouter, Routes, Route, useLocation } from "react-router-dom"; +import { ProjectQuery, ProjectQueryVariables } from "gql/generated/types"; +import { PROJECT } from "gql/queries"; +import { renderHook, waitFor } from "test_utils"; +import { ApolloMock } from "types/gql"; +import { useProjectRedirect } from "."; + +const useJointHook = ({ + sendAnalyticsEvent, +}: { + sendAnalyticsEvent: (projectId: string, projectIdentifier: string) => void; +}) => { + const { isRedirecting } = useProjectRedirect({ sendAnalyticsEvent }); + const { pathname, search } = useLocation(); + return { isRedirecting, pathname, search }; +}; + +const ProviderWrapper: React.FC<{ + children: React.ReactNode; + location: string; +}> = ({ children, location }) => ( + + + + + + + +); + +describe("useProjectRedirect", () => { + it("should not redirect if URL has project identifier", async () => { + const sendAnalyticsEvent = jest.fn(); + const { result } = renderHook(() => useJointHook({ sendAnalyticsEvent }), { + wrapper: ({ children }) => + ProviderWrapper({ children, location: "/commits/my-project" }), + }); + expect(result.current).toMatchObject({ + isRedirecting: false, + pathname: "/commits/my-project", + search: "", + }); + expect(sendAnalyticsEvent).toHaveBeenCalledTimes(0); + }); + + it("should redirect if URL has project ID", async () => { + const sendAnalyticsEvent = jest.fn(); + const { result } = renderHook(() => useJointHook({ sendAnalyticsEvent }), { + wrapper: ({ children }) => + ProviderWrapper({ children, location: `/commits/${projectId}` }), + }); + expect(result.current).toMatchObject({ + isRedirecting: true, + pathname: "/commits/5f74d99ab2373627c047c5e5", + search: "", + }); + await waitFor(() => { + expect(result.current).toMatchObject({ + isRedirecting: false, + pathname: "/commits/my-project", + search: "", + }); + }); + expect(sendAnalyticsEvent).toHaveBeenCalledTimes(1); + expect(sendAnalyticsEvent).toHaveBeenCalledWith( + "5f74d99ab2373627c047c5e5", + "my-project", + ); + }); + + it("should preserve query params when redirecting", async () => { + const sendAnalyticsEvent = jest.fn(); + const { result } = renderHook(() => useJointHook({ sendAnalyticsEvent }), { + wrapper: ({ children }) => + ProviderWrapper({ + children, + location: `/commits/${projectId}?taskName=thirdparty`, + }), + }); + expect(result.current).toMatchObject({ + isRedirecting: true, + pathname: "/commits/5f74d99ab2373627c047c5e5", + search: "?taskName=thirdparty", + }); + await waitFor(() => { + expect(result.current).toMatchObject({ + isRedirecting: false, + pathname: "/commits/my-project", + search: "?taskName=thirdparty", + }); + }); + expect(sendAnalyticsEvent).toHaveBeenCalledTimes(1); + expect(sendAnalyticsEvent).toHaveBeenCalledWith( + "5f74d99ab2373627c047c5e5", + "my-project", + ); + }); + + it("should attempt redirect if URL has repo ID but stop attempting after query", async () => { + const sendAnalyticsEvent = jest.fn(); + const { result } = renderHook(() => useJointHook({ sendAnalyticsEvent }), { + wrapper: ({ children }) => + ProviderWrapper({ children, location: `/commits/${repoId}` }), + }); + expect(result.current).toMatchObject({ + isRedirecting: true, + pathname: "/commits/5e6bb9e23066155a993e0f1a", + search: "", + }); + await waitFor(() => { + expect(result.current).toMatchObject({ + isRedirecting: false, + pathname: "/commits/5e6bb9e23066155a993e0f1a", + search: "", + }); + }); + expect(sendAnalyticsEvent).toHaveBeenCalledTimes(0); + }); +}); + +const projectId = "5f74d99ab2373627c047c5e5"; +const projectMock: ApolloMock = { + request: { + query: PROJECT, + variables: { + idOrIdentifier: projectId, + }, + }, + result: { + data: { + project: { + __typename: "Project", + id: projectId, + identifier: "my-project", + }, + }, + }, +}; + +const repoId = "5e6bb9e23066155a993e0f1a"; +const repoMock: ApolloMock = { + request: { + query: PROJECT, + variables: { + idOrIdentifier: repoId, + }, + }, + result: { + errors: [ + new GraphQLError( + `Error finding project by id ${repoId}: 404 (Not Found): project '${repoId}' not found`, + ), + ], + }, +}; diff --git a/src/pages/commits/index.tsx b/src/pages/commits/index.tsx index 04ae662229..680bf7dd25 100644 --- a/src/pages/commits/index.tsx +++ b/src/pages/commits/index.tsx @@ -36,6 +36,7 @@ import { useUpsertQueryParams, useUserSettings, } from "hooks"; +import { useProjectRedirect } from "hooks/useProjectRedirect"; import { useQueryParam } from "hooks/useQueryParam"; import { ProjectFilterOptions, MainlineCommitQueryParams } from "types/commits"; import { array, queryString, validators } from "utils"; @@ -69,8 +70,17 @@ const Commits = () => { const { projectIdentifier } = useParams<{ projectIdentifier: string; }>(); - usePageTitle(`Project Health | ${projectIdentifier}`); + + const sendAnalyticsEvent = (id: string, identifier: string) => { + sendEvent({ + name: "Redirect to project identifier", + projectId: id, + projectIdentifier: identifier, + }); + }; + const { isRedirecting } = useProjectRedirect({ sendAnalyticsEvent }); + const recentlySelectedProject = Cookies.get(CURRENT_PROJECT); // Push default project to URL if there isn't a project in // the URL already and an mci-project-cookie does not exist. @@ -139,7 +149,7 @@ const Commits = () => { MainlineCommitsQuery, MainlineCommitsQueryVariables >(MAINLINE_COMMITS, { - skip: !projectIdentifier || isResizing, + skip: !projectIdentifier || isRedirecting || isResizing, errorPolicy: "all", fetchPolicy: "cache-and-network", variables, @@ -233,7 +243,10 @@ const Commits = () => { versions={versions} revision={revision} isLoading={ - (loading && !versions) || !projectIdentifier || isResizing + (loading && !versions) || + !projectIdentifier || + isRedirecting || + isResizing } hasTaskFilter={hasTasks} hasFilters={hasFilters} From d04245aa7d5a7da0389406e823db42f41f12eb81 Mon Sep 17 00:00:00 2001 From: Chaya Malik Date: Tue, 19 Mar 2024 10:55:15 -0400 Subject: [PATCH 3/6] spruce/v3.0.225 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 958e14664c..3c130b9289 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "spruce", - "version": "3.0.224", + "version": "3.0.225", "private": true, "scripts": { "bootstrap-logkeeper": "./scripts/bootstrap-logkeeper.sh", From 021f2fb10a8ec9f99d7eab8ea6c660da3399315e Mon Sep 17 00:00:00 2001 From: Mohamed Khelif Date: Tue, 19 Mar 2024 15:50:07 -0400 Subject: [PATCH 4/6] DEVPROD-5665 Stop reporting e2e results to cypress cloud (#2304) --- .evergreen.yml | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/.evergreen.yml b/.evergreen.yml index 27a1789650..8971cfddaa 100644 --- a/.evergreen.yml +++ b/.evergreen.yml @@ -25,6 +25,7 @@ post: - func: assume-ec2-role - func: attach-codegen-diff - func: attach-cypress-results + - func: attach-logkeeper-logs - func: attach-source-map - func: attach-storybook - func: attach-test-results @@ -251,12 +252,9 @@ functions: shell: bash script: | ${PREPARE_SHELL} - # Only record to cypress cloud if this is a pr, mainline commit or an intentional patch. - # And only allow spec filtering for an intentional patch. - if [[ "${requester}" == "github_pr" || "${requester}" == "commit" ]]; then - yarn cy:run --record --key "${spruce_cypress_record_key}" --reporter junit - elif [[ "${requester}" == "patch" ]]; then - yarn cy:run --record --key "${spruce_cypress_record_key}" --reporter junit --spec "${cypress_spec}" + # Allow spec filtering for an intentional patch. + if [[ "${requester}" == "patch" ]]; then + yarn cy:run --reporter junit --spec "${cypress_spec}" else yarn cy:run --reporter junit fi @@ -297,6 +295,19 @@ functions: files: - "./spruce/bin/cypress/*.xml" + attach-logkeeper-logs: + command: s3.put + type: system + params: + aws_key: ${AWS_ACCESS_KEY_ID} + aws_secret: ${AWS_SECRET_ACCESS_KEY} + aws_session_token: ${AWS_SESSION_TOKEN} + local_file: spruce/logkeeper/logkeeperapp.log + remote_file: spruce/${task_id}/${execution}/logkeeperapp.log + bucket: mciuploads + content_type: text/plain + permissions: public-read + attach-source-map: command: s3.put type: system From 59d476dcf752bb4d71a180901b89203b204aa8b1 Mon Sep 17 00:00:00 2001 From: Chaya Malik Date: Wed, 20 Mar 2024 08:31:18 -0400 Subject: [PATCH 5/6] spruce/v3.0.226 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3c130b9289..d468888a6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "spruce", - "version": "3.0.225", + "version": "3.0.226", "private": true, "scripts": { "bootstrap-logkeeper": "./scripts/bootstrap-logkeeper.sh", From 97c3fb49c4bf442d7c48718b62a10839325602a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 09:02:57 -0400 Subject: [PATCH 6/6] CHORE(NPM) - bump @leafygreen-ui/combobox from 7.2.0 to 8.1.1 (#2307) --- package.json | 2 +- yarn.lock | 180 ++++++++++++++++++++++----------------------------- 2 files changed, 80 insertions(+), 102 deletions(-) diff --git a/package.json b/package.json index d468888a6f..750ef460d5 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "@leafygreen-ui/card": "10.0.5", "@leafygreen-ui/checkbox": "12.0.5", "@leafygreen-ui/code": "14.2.18", - "@leafygreen-ui/combobox": "7.2.0", + "@leafygreen-ui/combobox": "8.1.1", "@leafygreen-ui/confirmation-modal": "5.0.9", "@leafygreen-ui/emotion": "4.0.7", "@leafygreen-ui/expandable-card": "3.0.5", diff --git a/yarn.lock b/yarn.lock index 9e038c50b2..e22e86558f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3255,7 +3255,7 @@ resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== -"@leafygreen-ui/a11y@^1.3.4", "@leafygreen-ui/a11y@^1.4.11", "@leafygreen-ui/a11y@^1.4.2", "@leafygreen-ui/a11y@^1.4.3": +"@leafygreen-ui/a11y@^1.3.4", "@leafygreen-ui/a11y@^1.4.11", "@leafygreen-ui/a11y@^1.4.3": version "1.4.11" resolved "https://registry.yarnpkg.com/@leafygreen-ui/a11y/-/a11y-1.4.11.tgz#5ebaa4a4a1bf99e2c3d6d9cb08f6b4983f2b2d59" integrity sha512-mzNMR4ci3ExdCY3Ec1kr7xH4nV02uamoohbWxcI9qSd41TFskaDAZSXO9PL9S8JosQXjpRkt0f470XvVE0kEXQ== @@ -3264,6 +3264,15 @@ "@leafygreen-ui/hooks" "^8.0.0" "@leafygreen-ui/lib" "^13.0.0" +"@leafygreen-ui/a11y@^1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@leafygreen-ui/a11y/-/a11y-1.4.12.tgz#727df62a6bd33defb296fc43885df59e0c8c1083" + integrity sha512-JYpXbcPN6cbURBYEVW186gU/n4ibmmoBsD0IEtnxDl7jGir7aT7s6hd3L9nbOQEzcYfzDNHYg1CWvOHktanpkQ== + dependencies: + "@leafygreen-ui/emotion" "^4.0.7" + "@leafygreen-ui/hooks" "^8.1.0" + "@leafygreen-ui/lib" "^13.2.0" + "@leafygreen-ui/badge@8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@leafygreen-ui/badge/-/badge-8.0.2.tgz#2928d5a3877644b83f7459a008c03361cb2c744b" @@ -3380,18 +3389,18 @@ "@leafygreen-ui/typography" "^16.0.0" react-transition-group "^4.4.1" -"@leafygreen-ui/checkbox@^12.0.20": - version "12.0.20" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/checkbox/-/checkbox-12.0.20.tgz#8969b106f27ab30d3e5ff742682130a21c471409" - integrity sha512-H811SnLrrW2jwwno92AtpdqCNcmvHJCu0X+TjnPcYAUjvXPtGUBw+aJLpwQ+S4qtss6TavnsXQ75xJWnyM2w8A== +"@leafygreen-ui/checkbox@^12.0.20", "@leafygreen-ui/checkbox@^12.1.1": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@leafygreen-ui/checkbox/-/checkbox-12.1.1.tgz#49067165b3ba35b3e56116c72e14932e33d7c6b7" + integrity sha512-9hl2tLeajx4i7MpFyK+Glck76wo+h780MkwkuSGIQZLKNGxithlHXmVJeejDyS72effeLO/umsZJGxylvbEs/A== dependencies: "@leafygreen-ui/a11y" "^1.4.11" "@leafygreen-ui/emotion" "^4.0.7" - "@leafygreen-ui/hooks" "^8.0.0" + "@leafygreen-ui/hooks" "^8.1.2" "@leafygreen-ui/lib" "^13.0.0" "@leafygreen-ui/palette" "^4.0.7" - "@leafygreen-ui/tokens" "^2.2.0" - "@leafygreen-ui/typography" "^18.0.0" + "@leafygreen-ui/tokens" "^2.5.1" + "@leafygreen-ui/typography" "^18.2.2" react-transition-group "^4.4.5" "@leafygreen-ui/chip@^1.0.0": @@ -3430,24 +3439,24 @@ lodash "^4.17.21" polished "^4.2.2" -"@leafygreen-ui/combobox@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/combobox/-/combobox-7.2.0.tgz#126a2dc107571fae1a4adf814b2284f775f7ee10" - integrity sha512-4mXeIdSEH5KjD/N2INw9whNRD1VLjkR7yJ2B9CfKniwCrnjrIphgOcQ9NCJccCBmLa9HUAafFvKSULw3DyciNQ== +"@leafygreen-ui/combobox@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@leafygreen-ui/combobox/-/combobox-8.1.1.tgz#73d1e095294b50a9ec2d0aaad22d5ae7febda51f" + integrity sha512-dEYnVKRmUMmWHsmS7efKppO/bO8AWQL1sxO/O87KX2b/Ikqm6GY+KnknXFDL7oCSjUPrMAwB7Iv7IQJ8r7JsXw== dependencies: - "@leafygreen-ui/checkbox" "^12.0.20" + "@leafygreen-ui/checkbox" "^12.1.1" "@leafygreen-ui/chip" "^1.0.0" "@leafygreen-ui/emotion" "^4.0.7" - "@leafygreen-ui/hooks" "^8.1.1" - "@leafygreen-ui/icon" "^11.23.0" + "@leafygreen-ui/hooks" "^8.1.2" + "@leafygreen-ui/icon" "^11.29.1" "@leafygreen-ui/icon-button" "^15.0.19" "@leafygreen-ui/inline-definition" "^6.0.13" - "@leafygreen-ui/input-option" "^1.0.13" + "@leafygreen-ui/input-option" "^1.1.1" "@leafygreen-ui/lib" "^13.2.1" "@leafygreen-ui/palette" "^4.0.7" - "@leafygreen-ui/popover" "^11.1.1" - "@leafygreen-ui/tokens" "^2.3.0" - "@leafygreen-ui/typography" "^18.0.0" + "@leafygreen-ui/popover" "^11.3.0" + "@leafygreen-ui/tokens" "^2.5.1" + "@leafygreen-ui/typography" "^18.2.2" chalk "^4.1.2" lodash "^4.17.21" polished "^4.2.2" @@ -3544,22 +3553,14 @@ dependencies: lodash "^4.17.21" -"@leafygreen-ui/hooks@^8.0.0", "@leafygreen-ui/hooks@^8.0.1", "@leafygreen-ui/hooks@^8.1.1": - version "8.1.1" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/hooks/-/hooks-8.1.1.tgz#39ff22a762ea61146e9b0d136d73836e72103acc" - integrity sha512-Ovh4/huQbM3UVSnHDQE0rWWG8bxZG7qdI2RZYtmUW/YbAL66GQx3jkfpuLlL3Npu5SxuS6b/Ai42sB2U6+Df0A== +"@leafygreen-ui/hooks@^8.0.0", "@leafygreen-ui/hooks@^8.0.1", "@leafygreen-ui/hooks@^8.1.0", "@leafygreen-ui/hooks@^8.1.1", "@leafygreen-ui/hooks@^8.1.2": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@leafygreen-ui/hooks/-/hooks-8.1.2.tgz#2166c621d8c1c56b45d56c01fae09e4957ba0dff" + integrity sha512-XJlTqPx1RqjGRk1v5MWtISWfHBudAqYDsc7NzRCgK+bfwGa4LvsrJ89ZcJJdxUHH2Coz/z+Vxp+zNJThxtaf5A== dependencies: "@leafygreen-ui/lib" "^13.2.1" lodash "^4.17.21" -"@leafygreen-ui/hooks@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/hooks/-/hooks-8.1.0.tgz#1f6fec4d7021a86a28ae8c84d353b6190183767c" - integrity sha512-BWuZ2vCeWxI6fYb6Kj7C7BcQji7PfuTOiB8PB9NW0fEtrC76p18eclwgCrlimaCLIV81/eLN07NTwR14OCpWHg== - dependencies: - "@leafygreen-ui/lib" "^13.2.0" - lodash "^4.17.21" - "@leafygreen-ui/icon-button@15.0.19", "@leafygreen-ui/icon-button@^15.0.10", "@leafygreen-ui/icon-button@^15.0.12", "@leafygreen-ui/icon-button@^15.0.16", "@leafygreen-ui/icon-button@^15.0.19", "@leafygreen-ui/icon-button@^15.0.4", "@leafygreen-ui/icon-button@^15.0.7": version "15.0.19" resolved "https://registry.yarnpkg.com/@leafygreen-ui/icon-button/-/icon-button-15.0.19.tgz#4c9bd36358c6568605bb76cd2477f6930d4039fc" @@ -3581,10 +3582,10 @@ "@leafygreen-ui/emotion" "^4.0.7" lodash "^4.17.21" -"@leafygreen-ui/icon@^11.12.4", "@leafygreen-ui/icon@^11.12.5", "@leafygreen-ui/icon@^11.15.0", "@leafygreen-ui/icon@^11.17.0", "@leafygreen-ui/icon@^11.22.1", "@leafygreen-ui/icon@^11.22.2", "@leafygreen-ui/icon@^11.23.0", "@leafygreen-ui/icon@^11.24.0", "@leafygreen-ui/icon@^11.25.0", "@leafygreen-ui/icon@^11.25.1", "@leafygreen-ui/icon@^11.27.0", "@leafygreen-ui/icon@^11.27.1", "@leafygreen-ui/icon@^11.28.0": - version "11.29.0" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/icon/-/icon-11.29.0.tgz#8a766530980228ec2f502dfba1ecaccbec8477d8" - integrity sha512-hmnFJYdmTovtSyDOwjfc5cN2+iLc1/Iv7bIVw0N+TUdq9k2FQXbZ/JFWI/afoHS78xoyn5Gwo3iuofyRxpFMcw== +"@leafygreen-ui/icon@^11.12.4", "@leafygreen-ui/icon@^11.12.5", "@leafygreen-ui/icon@^11.15.0", "@leafygreen-ui/icon@^11.17.0", "@leafygreen-ui/icon@^11.22.1", "@leafygreen-ui/icon@^11.22.2", "@leafygreen-ui/icon@^11.23.0", "@leafygreen-ui/icon@^11.24.0", "@leafygreen-ui/icon@^11.25.0", "@leafygreen-ui/icon@^11.25.1", "@leafygreen-ui/icon@^11.27.0", "@leafygreen-ui/icon@^11.27.1", "@leafygreen-ui/icon@^11.28.0", "@leafygreen-ui/icon@^11.29.1": + version "11.29.1" + resolved "https://registry.yarnpkg.com/@leafygreen-ui/icon/-/icon-11.29.1.tgz#f61115a5b0b36310a5ffb008bf51dd9ae8982917" + integrity sha512-bCfeJ3mndU5wHayMWfkVWo0NXhPpBpHIG53aox/eRterqLvWg6jWyiuF930MHbyWDNEXC9Qw1WD637kZ93mmog== dependencies: "@leafygreen-ui/emotion" "^4.0.7" lodash "^4.17.21" @@ -3601,7 +3602,7 @@ "@leafygreen-ui/tokens" "^2.2.0" "@leafygreen-ui/tooltip" "^11.0.0" -"@leafygreen-ui/inline-definition@6.0.14": +"@leafygreen-ui/inline-definition@6.0.14", "@leafygreen-ui/inline-definition@^6.0.11", "@leafygreen-ui/inline-definition@^6.0.13": version "6.0.14" resolved "https://registry.yarnpkg.com/@leafygreen-ui/inline-definition/-/inline-definition-6.0.14.tgz#fd0ba775a2ff88520ed31d0489e57fd90416bad3" integrity sha512-vCfSF1Lr8O4sm8f7w9rTflVyJRjF3Tyrtppr9OSfEPTDDlla+tiuSyvrMUty3xfdomc6JEGyumdozvjyU9dFsg== @@ -3611,41 +3612,18 @@ "@leafygreen-ui/palette" "^4.0.7" "@leafygreen-ui/tooltip" "^11.0.0" -"@leafygreen-ui/inline-definition@^6.0.11", "@leafygreen-ui/inline-definition@^6.0.13": - version "6.0.13" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/inline-definition/-/inline-definition-6.0.13.tgz#cf5010793edcc1cc911c944ee660243b2ed2447f" - integrity sha512-auHv9UwJwZeqbT08BvTcRuzfxRIiSvsPM3kPcdsnDvtJiEO6WwxH33UKhQ+CFY3xz+70qfCW3CInwPIQF/ea0A== - dependencies: - "@leafygreen-ui/emotion" "^4.0.7" - "@leafygreen-ui/lib" "^13.0.0" - "@leafygreen-ui/palette" "^4.0.7" - "@leafygreen-ui/tooltip" "^10.1.0" - -"@leafygreen-ui/input-option@^1.0.13": - version "1.0.13" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/input-option/-/input-option-1.0.13.tgz#eeaf25e111bad5117079338e1cc3f0435d5254c9" - integrity sha512-6J4rji1V2EHpKyqsuZPa2KVW4IHbj26Wp9VoJuFh6hz3LkNpJ5FoRxLvUGlL9wf8b+A2oK+bz5rW0FP+vs+nlw== +"@leafygreen-ui/input-option@^1.0.13", "@leafygreen-ui/input-option@^1.0.5", "@leafygreen-ui/input-option@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@leafygreen-ui/input-option/-/input-option-1.1.1.tgz#ba115819fc38b22f8123e4d4e81cf9aceec2814d" + integrity sha512-ix6QQmnRGqnvZWERATO0jsMiziG2CWBe9t3ng++sBWaF1nqQXPqcBSZihuuJaoY7hg9qA7MCQMEb5XuZqhi59w== dependencies: - "@leafygreen-ui/a11y" "^1.4.11" + "@leafygreen-ui/a11y" "^1.4.12" "@leafygreen-ui/emotion" "^4.0.7" - "@leafygreen-ui/lib" "^13.0.0" + "@leafygreen-ui/lib" "^13.2.0" "@leafygreen-ui/palette" "^4.0.7" "@leafygreen-ui/polymorphic" "^1.3.6" - "@leafygreen-ui/tokens" "^2.1.4" - "@leafygreen-ui/typography" "^18.0.0" - -"@leafygreen-ui/input-option@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/input-option/-/input-option-1.0.5.tgz#d6f814b943900f9ede4981f3bd7107b89fd7b74a" - integrity sha512-gU051Rr5oB6CelLziN1xpbymexEP28DsbhgN+KTXxzpOM5q4l1dNAv12UDuCSEJS/xPP0kzkBkMWT/WPOEE/uQ== - dependencies: - "@leafygreen-ui/a11y" "^1.4.2" - "@leafygreen-ui/emotion" "^4.0.4" - "@leafygreen-ui/lib" "^10.4.0" - "@leafygreen-ui/palette" "^4.0.4" - "@leafygreen-ui/polymorphic" "^1.3.2" - "@leafygreen-ui/tokens" "^2.1.1" - "@leafygreen-ui/typography" "^16.5.1" + "@leafygreen-ui/tokens" "^2.5.1" + "@leafygreen-ui/typography" "^18.2.2" "@leafygreen-ui/interaction-ring@7.0.2": version "7.0.2" @@ -3839,16 +3817,17 @@ "@leafygreen-ui/tokens" "^2.2.0" react-transition-group "^4.4.5" -"@leafygreen-ui/popover@^11.0.12", "@leafygreen-ui/popover@^11.0.15", "@leafygreen-ui/popover@^11.0.17", "@leafygreen-ui/popover@^11.0.4", "@leafygreen-ui/popover@^11.1.1": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/popover/-/popover-11.1.1.tgz#fe0ee8b6f83e28d87f000af6089f021a48f774b7" - integrity sha512-isXdPQQM/sdygDt1Wp89ekyXKLW6AMENTC4C6DVuRAAmdRZLtcb724K1KMOkiooa0h/CXWxdLslqJsdzsicAuA== +"@leafygreen-ui/popover@^11.0.12", "@leafygreen-ui/popover@^11.0.15", "@leafygreen-ui/popover@^11.0.17", "@leafygreen-ui/popover@^11.0.4", "@leafygreen-ui/popover@^11.1.1", "@leafygreen-ui/popover@^11.3.0": + version "11.3.0" + resolved "https://registry.yarnpkg.com/@leafygreen-ui/popover/-/popover-11.3.0.tgz#c75b5cc049ec88965a4c6d4607214fbc94e6eb5f" + integrity sha512-tSTuDw0JAs1w6Kj1mQdRe+XhuVQKcaOaf6BLxDB2kTCkdGmnwN1s+/vaDyERguv00VI4ttM4QbvC9kZ8t+fAdA== dependencies: "@leafygreen-ui/emotion" "^4.0.7" - "@leafygreen-ui/hooks" "^8.0.0" - "@leafygreen-ui/lib" "^13.0.0" - "@leafygreen-ui/portal" "^5.0.3" - "@leafygreen-ui/tokens" "^2.2.0" + "@leafygreen-ui/hooks" "^8.1.2" + "@leafygreen-ui/lib" "^13.2.0" + "@leafygreen-ui/portal" "^5.1.0" + "@leafygreen-ui/tokens" "^2.5.1" + "@types/react-transition-group" "^4.4.5" react-transition-group "^4.4.5" "@leafygreen-ui/portal@^4.0.9", "@leafygreen-ui/portal@^4.1.2": @@ -3867,6 +3846,14 @@ "@leafygreen-ui/hooks" "^8.0.0" "@leafygreen-ui/lib" "^13.0.0" +"@leafygreen-ui/portal@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@leafygreen-ui/portal/-/portal-5.1.0.tgz#d9dfd61e4ee403ebb0086b5e91b1c5d41a553d75" + integrity sha512-zvbxF0YN4YLA3KECm1wVM/Ag96CjjhFYORoWwQM6KRbHP/Brg9/g7mPd2aJj/xpPZlJYSTeAwhKM9JJkrnm6Dg== + dependencies: + "@leafygreen-ui/hooks" "^8.1.2" + "@leafygreen-ui/lib" "^13.0.0" + "@leafygreen-ui/radio-box-group@12.0.16": version "12.0.16" resolved "https://registry.yarnpkg.com/@leafygreen-ui/radio-box-group/-/radio-box-group-12.0.16.tgz#866ad9c82998bf85970201c543aec9ea2073b195" @@ -4124,10 +4111,10 @@ dependencies: "@leafygreen-ui/palette" "^3.4.5" -"@leafygreen-ui/tokens@^2.0.0", "@leafygreen-ui/tokens@^2.0.1", "@leafygreen-ui/tokens@^2.1.0", "@leafygreen-ui/tokens@^2.1.1", "@leafygreen-ui/tokens@^2.1.4", "@leafygreen-ui/tokens@^2.2.0", "@leafygreen-ui/tokens@^2.3.0", "@leafygreen-ui/tokens@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/tokens/-/tokens-2.4.0.tgz#1210f3d649d0239f97a11f701d6f32863153a2d5" - integrity sha512-zTc+MQM3Q20z1xMLkjflFo+g2EQZW8YsquNhiUPRnqW85DyvsQn9TSDQJAcfvkzYqyeJ53AtAib983D/gpKw9A== +"@leafygreen-ui/tokens@^2.0.0", "@leafygreen-ui/tokens@^2.0.1", "@leafygreen-ui/tokens@^2.1.0", "@leafygreen-ui/tokens@^2.1.1", "@leafygreen-ui/tokens@^2.1.4", "@leafygreen-ui/tokens@^2.2.0", "@leafygreen-ui/tokens@^2.3.0", "@leafygreen-ui/tokens@^2.4.0", "@leafygreen-ui/tokens@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@leafygreen-ui/tokens/-/tokens-2.5.1.tgz#295e02ba47c0fb4f2ab6891973c64be4a0d92c95" + integrity sha512-sC0fQ578tsQan54kQ9SCidUgSY2R31o787N7Umzji44CcnqZCPj2Lrbyp3tideUw+FcdapTAxkA+mpppPfGgRA== dependencies: "@leafygreen-ui/palette" "^4.0.7" @@ -4147,22 +4134,6 @@ lodash "^4.17.21" polished "^4.2.2" -"@leafygreen-ui/tooltip@^10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/tooltip/-/tooltip-10.1.0.tgz#4832a8b688ab0d88803e15b319a00c3e788c397a" - integrity sha512-jgrETmJveRDzDtz1qYI18Pkc53XGp/38l10MWPl8mv+/ahCCgNED2idmCjCwJ3/ju14t6ASSzs0SuH1jokNcAA== - dependencies: - "@leafygreen-ui/emotion" "^4.0.7" - "@leafygreen-ui/hooks" "^8.0.0" - "@leafygreen-ui/icon" "^11.23.0" - "@leafygreen-ui/lib" "^13.0.0" - "@leafygreen-ui/palette" "^4.0.7" - "@leafygreen-ui/popover" "^11.1.1" - "@leafygreen-ui/tokens" "^2.2.0" - "@leafygreen-ui/typography" "^18.0.0" - lodash "^4.17.21" - polished "^4.2.2" - "@leafygreen-ui/tooltip@^11.0.0": version "11.0.0" resolved "https://registry.yarnpkg.com/@leafygreen-ui/tooltip/-/tooltip-11.0.0.tgz#fc56c8c3292c6c64b067727c5bc92b7fe833e361" @@ -4203,17 +4174,17 @@ "@leafygreen-ui/polymorphic" "^1.3.5" "@leafygreen-ui/tokens" "^2.1.4" -"@leafygreen-ui/typography@^18.0.0", "@leafygreen-ui/typography@^18.0.1", "@leafygreen-ui/typography@^18.1.0", "@leafygreen-ui/typography@^18.2.1": - version "18.2.1" - resolved "https://registry.yarnpkg.com/@leafygreen-ui/typography/-/typography-18.2.1.tgz#f036ffd9febe4b852c0971e53870306c82735fbd" - integrity sha512-6sZ50kifwMO+zkuqMxsv3IDu/5bcy4ryKWRDVTre2J2RI2au0HlcsrtGew6Sm46SJ2NBuu9ditzS6eco88cYIw== +"@leafygreen-ui/typography@^18.0.0", "@leafygreen-ui/typography@^18.0.1", "@leafygreen-ui/typography@^18.1.0", "@leafygreen-ui/typography@^18.2.1", "@leafygreen-ui/typography@^18.2.2": + version "18.2.2" + resolved "https://registry.yarnpkg.com/@leafygreen-ui/typography/-/typography-18.2.2.tgz#0aacccf8187f4725cee25dc8fd1c31184c94f4d3" + integrity sha512-RuJcZ7XkxDj8ZJADJ50LGhWQFOIYcwRdJhe05JjpM26+JwHjBlESIU9XhSMjcg1bZDBSvg6AVP/LAD5Vb7VItA== dependencies: "@leafygreen-ui/emotion" "^4.0.7" - "@leafygreen-ui/icon" "^11.27.1" + "@leafygreen-ui/icon" "^11.29.1" "@leafygreen-ui/lib" "^13.2.0" "@leafygreen-ui/palette" "^4.0.7" "@leafygreen-ui/polymorphic" "^1.3.6" - "@leafygreen-ui/tokens" "^2.4.0" + "@leafygreen-ui/tokens" "^2.5.1" "@mdx-js/react@^2.1.5": version "2.3.0" @@ -6127,6 +6098,13 @@ dependencies: "@types/react" "*" +"@types/react-transition-group@^4.4.5": + version "4.4.10" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" + integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@>=16": version "18.2.20" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.20.tgz#1605557a83df5c8a2cc4eeb743b3dfc0eb6aaeb2"