From e52b72f731a4c8a28266cc7b1fe1dfd05e23ad1a Mon Sep 17 00:00:00 2001 From: marcelines Date: Fri, 30 Jun 2023 16:32:52 +0100 Subject: [PATCH] [website] Connect burnup charts to API (#425) * feat: add queries to get epics links and repos and epic burnup data * feat: add codegen and api fetcher util to create named custom hook query functions * feat: add more queries with fetcher and infinite scroll * feat: add some improvements on existing components * feat: add more functionalities to table issues * feat: add available fitlers and search to table issues * feat: add more missing features to the burnup chart * feat: fix some issues with scroll * fix: color epic overview and fixe repos card icons * feat: add overview page data with filters * fix: changes from review * fix: component removed from pages folder * fix import * fix: several changes to improve performance and handles some edge cases * fix: infinite scroll epics overview page --------- Co-authored-by: marcelines Co-authored-by: Pavel Prichodko <14926950+prichodko@users.noreply.github.com> --- apps/website/@types/custom.d.ts | 12 + apps/website/codegen.yml | 36 + apps/website/package.json | 11 +- apps/website/src/components/chart/chart.tsx | 10 +- .../src/components/chart/components/areas.tsx | 6 +- .../chart/components/chart-component.tsx | 5 +- .../chart/components/chart-tooltip.tsx | 2 +- .../src/components/chart/components/empty.tsx | 4 +- .../src/components/chart/components/lines.tsx | 6 +- .../chart/hooks/use-chart-tooltip.ts | 5 +- .../src/components/datepicker/datepicker.tsx | 2 + apps/website/src/components/epic-overview.tsx | 145 +- apps/website/src/components/index.tsx | 2 + .../components/navigation/floating-menu.tsx | 11 +- .../src/components/repos/loading-skeleton.tsx | 38 + .../src/components/sidebar-menu/index.tsx | 74 +- .../sidebar-menu/nav-nested-links.tsx | 5 +- .../sidebar-menu/skeleton-placeholder.tsx | 89 ++ .../src/components/sidebar-menu/utils.ts | 3 + apps/website/src/components/table-issues.tsx | 98 ++ .../src/components/table-issues/empty.tsx | 41 + .../table-issues/filters/dropdown-filter.tsx | 26 +- .../table-issues/filters/dropdown-sort.tsx | 36 +- .../components/table-issues/filters/tabs.tsx | 31 +- .../src/components/table-issues/select.tsx | 0 .../components/table-issues/table-issues.tsx | 435 +++--- apps/website/src/hooks/use-debounce.ts | 15 + .../src/hooks/use-intersection-observer.ts | 43 + .../src/hooks/use-render-if-visible.tsx | 85 ++ apps/website/src/layouts/insights-layout.tsx | 105 +- apps/website/src/lib/burnup.ts | 178 +++ apps/website/src/lib/graphql/api.ts | 27 + .../src/lib/graphql/generated/hooks.ts | 327 ++++ .../src/lib/graphql/generated/operations.ts | 149 ++ .../src/lib/graphql/generated/schemas.ts | 775 ++++++++++ apps/website/src/lib/graphql/index.ts | 1 + apps/website/src/lib/graphql/utils.ts | 14 + apps/website/src/pages/api/hasura.ts | 17 + .../src/pages/insights/epics/[epic].tsx | 384 ++++- .../src/pages/insights/epics/index.tsx | 327 +++- apps/website/src/pages/insights/orphans.tsx | 201 ++- apps/website/src/pages/insights/repos.tsx | 129 -- .../src/pages/insights/repos/index.tsx | 139 ++ yarn.lock | 1352 ++++++++++++++++- 44 files changed, 4558 insertions(+), 843 deletions(-) create mode 100644 apps/website/@types/custom.d.ts create mode 100644 apps/website/codegen.yml create mode 100644 apps/website/src/components/repos/loading-skeleton.tsx create mode 100644 apps/website/src/components/sidebar-menu/skeleton-placeholder.tsx create mode 100644 apps/website/src/components/sidebar-menu/utils.ts create mode 100644 apps/website/src/components/table-issues.tsx create mode 100644 apps/website/src/components/table-issues/empty.tsx create mode 100644 apps/website/src/components/table-issues/select.tsx create mode 100644 apps/website/src/hooks/use-debounce.ts create mode 100644 apps/website/src/hooks/use-intersection-observer.ts create mode 100644 apps/website/src/hooks/use-render-if-visible.tsx create mode 100644 apps/website/src/lib/burnup.ts create mode 100644 apps/website/src/lib/graphql/api.ts create mode 100644 apps/website/src/lib/graphql/generated/hooks.ts create mode 100644 apps/website/src/lib/graphql/generated/operations.ts create mode 100644 apps/website/src/lib/graphql/generated/schemas.ts create mode 100644 apps/website/src/lib/graphql/index.ts create mode 100644 apps/website/src/lib/graphql/utils.ts create mode 100644 apps/website/src/pages/api/hasura.ts delete mode 100644 apps/website/src/pages/insights/repos.tsx create mode 100644 apps/website/src/pages/insights/repos/index.tsx diff --git a/apps/website/@types/custom.d.ts b/apps/website/@types/custom.d.ts new file mode 100644 index 00000000..13847028 --- /dev/null +++ b/apps/website/@types/custom.d.ts @@ -0,0 +1,12 @@ +type ApiError = { + extensions: { code?: string; [key: string]: string } + locations: { column: number; line: number }[] + message: string + path: string[] +} + +declare interface GraphqlApiError { + response?: { + errors?: ApiError[] + } +} diff --git a/apps/website/codegen.yml b/apps/website/codegen.yml new file mode 100644 index 00000000..74c100ad --- /dev/null +++ b/apps/website/codegen.yml @@ -0,0 +1,36 @@ +schema: + - https://hasura.infra.status.im/v1/graphql + +documents: + - ./src/**/*.tsx + - ./src/**/*.ts + +overwrite: true + +hooks: + afterAllFileWrite: + - prettier --write + - eslint --fix + +generates: + ./src/lib/graphql/generated/schemas.ts: + plugins: + - typescript + + ./src/lib/graphql/generated/operations.ts: + preset: import-types + presetConfig: + typesPath: ./schemas + plugins: + - typescript-operations + + ./src/lib/graphql/generated/hooks.ts: + preset: import-types + presetConfig: + typesPath: ./operations + plugins: + - typescript-react-query + config: + fetcher: '../api#createFetcher' + exposeQueryKeys: true + errorType: GraphqlApiError diff --git a/apps/website/package.json b/apps/website/package.json index 6f9d72ce..003fd25a 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -9,7 +9,9 @@ "lint": "next lint", "typecheck": "contentlayer build && tsc", "clean": "rimraf .next .tamagui .turbo .vercel/output node_modules", - "preview": "next start --port 8151" + "preview": "next start --port 8151", + "codegen": "graphql-codegen -r dotenv/config --config codegen.yml", + "codegen:watch": "yarn run codegen -- --watch" }, "dependencies": { "@mdx-js/react": "^2.3.0", @@ -48,6 +50,12 @@ }, "devDependencies": { "@achingbrain/ssdp": "^4.0.1", + "@graphql-codegen/cli": "^4.0.1", + "@graphql-codegen/import-types-preset": "^2.2.6", + "@graphql-codegen/typescript": "^4.0.1", + "@graphql-codegen/typescript-operations": "^4.0.1", + "@graphql-codegen/typescript-react-query": "^4.1.0", + "@status-im/eslint-config": "*", "@tailwindcss/typography": "^0.5.9", "@tamagui/next-plugin": "1.36.4", "@types/d3-array": "^3.0.4", @@ -76,7 +84,6 @@ "typescript": "^5.0.3", "unist-util-visit": "^4.1.2", "@types/tryghost__content-api": "^1.3.11", - "@status-im/eslint-config": "*", "rehype-parse": "^8.0.4", "rehype-react": "^7.2.0", "rehype-stringify": "^9.0.3", diff --git a/apps/website/src/components/chart/chart.tsx b/apps/website/src/components/chart/chart.tsx index f55da37b..04ef14b9 100644 --- a/apps/website/src/components/chart/chart.tsx +++ b/apps/website/src/components/chart/chart.tsx @@ -1,7 +1,7 @@ import { Stack } from '@tamagui/core' import { ParentSize } from '@visx/responsive' -import { ChartComponent, Empty, Loading } from './components' +import { ChartComponent, Loading } from './components' type DayType = { date: string @@ -26,14 +26,6 @@ const Chart = (props: Props) => { ) } - if (!data.length) { - return ( - - - - ) - } - return ( {({ width }) => { diff --git a/apps/website/src/components/chart/components/areas.tsx b/apps/website/src/components/chart/components/areas.tsx index 13aa88ea..6021330a 100644 --- a/apps/website/src/components/chart/components/areas.tsx +++ b/apps/website/src/components/chart/components/areas.tsx @@ -1,5 +1,5 @@ import { animated } from '@react-spring/web' -import { curveMonotoneX } from '@visx/curve' +import { curveBasis } from '@visx/curve' import { LinearGradient } from '@visx/gradient' import { AreaClosed } from '@visx/shape' @@ -71,7 +71,7 @@ const Areas = (props: Props) => { }} yScale={yScale} fill="url(#gradient)" - curve={curveMonotoneX} + curve={curveBasis} style={{ ...clipPathAnimation, zIndex: 10 }} /> @@ -88,7 +88,7 @@ const Areas = (props: Props) => { }} yScale={yScale} fill="url(#gradient-open)" - curve={curveMonotoneX} + curve={curveBasis} style={{ ...clipPathAnimation, zIndex: 10 }} /> diff --git a/apps/website/src/components/chart/components/chart-component.tsx b/apps/website/src/components/chart/components/chart-component.tsx index 81ed8b80..6e9a76a8 100644 --- a/apps/website/src/components/chart/components/chart-component.tsx +++ b/apps/website/src/components/chart/components/chart-component.tsx @@ -63,7 +63,10 @@ const ChartComponent = (props: Props): JSX.Element => { const yScale = scaleLinear({ domain: [0, max(totalIssues) || 0], - range: [innerHeight, 0], + range: [ + innerHeight, + totalIssues.every(issue => issue === 0) ? innerHeight : 0, + ], // Adjusted the range to start from innerHeight instead of 0 nice: true, }) diff --git a/apps/website/src/components/chart/components/chart-tooltip.tsx b/apps/website/src/components/chart/components/chart-tooltip.tsx index 1b17e042..37688eba 100644 --- a/apps/website/src/components/chart/components/chart-tooltip.tsx +++ b/apps/website/src/components/chart/components/chart-tooltip.tsx @@ -91,7 +91,7 @@ const ChartTooltip = (props: Props) => { - {tooltipData.closedIssues} closes + {tooltipData.closedIssues} closed {
- +
No results found @@ -17,7 +17,7 @@ const Empty = () => { Try adjusting your search or filter to find what you’re looking for.
-
+
diff --git a/apps/website/src/components/chart/components/lines.tsx b/apps/website/src/components/chart/components/lines.tsx index 0ef17d04..cf04f077 100644 --- a/apps/website/src/components/chart/components/lines.tsx +++ b/apps/website/src/components/chart/components/lines.tsx @@ -1,5 +1,5 @@ import { animated } from '@react-spring/web' -import { curveMonotoneX } from '@visx/curve' +import { curveBasis } from '@visx/curve' import { LinePath } from '@visx/shape' import { colors } from './chart-component' @@ -47,7 +47,7 @@ const Lines = (props: Props) => { }} stroke={colors.total} strokeWidth={2} - curve={curveMonotoneX} + curve={curveBasis} style={drawingLineStyle} /> @@ -64,7 +64,7 @@ const Lines = (props: Props) => { }} stroke={colors.closed} strokeWidth={2} - curve={curveMonotoneX} + curve={curveBasis} style={drawingLineStyle} /> diff --git a/apps/website/src/components/chart/hooks/use-chart-tooltip.ts b/apps/website/src/components/chart/hooks/use-chart-tooltip.ts index d7d5e09f..2420c337 100644 --- a/apps/website/src/components/chart/hooks/use-chart-tooltip.ts +++ b/apps/website/src/components/chart/hooks/use-chart-tooltip.ts @@ -98,9 +98,10 @@ const useChartTooltip = (props: Props) => { const totalIssues = getTotalIssues(d) const openIssues = totalIssues - closedIssues - const completedIssuesPercentage = getPercentage(closedIssues, totalIssues) + const completedIssuesPercentage = + getPercentage(closedIssues, totalIssues) || 0 - const openIssuesPercentage = getPercentage(openIssues, totalIssues) + const openIssuesPercentage = getPercentage(openIssues, totalIssues) || 0 showTooltip({ tooltipData: { diff --git a/apps/website/src/components/datepicker/datepicker.tsx b/apps/website/src/components/datepicker/datepicker.tsx index fe89e51c..a90500f7 100644 --- a/apps/website/src/components/datepicker/datepicker.tsx +++ b/apps/website/src/components/datepicker/datepicker.tsx @@ -1,6 +1,7 @@ import { Calendar } from '@status-im/components/src/calendar/calendar' import { Popover } from '@status-im/components/src/popover' import { EditIcon } from '@status-im/icons' +import { addDays } from 'date-fns' import { formatDate } from '../chart/utils/format-time' @@ -35,6 +36,7 @@ const DatePicker = (props: Props) => { selected={selected} onSelect={onSelect} fixedWeeks + disabled={{ from: addDays(new Date(), 1) }} /> diff --git a/apps/website/src/components/epic-overview.tsx b/apps/website/src/components/epic-overview.tsx index 270d09da..c3bfee0d 100644 --- a/apps/website/src/components/epic-overview.tsx +++ b/apps/website/src/components/epic-overview.tsx @@ -1,112 +1,101 @@ -import { useEffect, useState } from 'react' - import { Tag, Text } from '@status-im/components' import { OpenIcon } from '@status-im/icons' import { Chart } from './chart/chart' +import { DatePicker } from './datepicker/datepicker' -const DATA = [ - { - date: '2022-01-25', - open_issues: 100, - closed_issues: 2, - }, - { - date: '2022-01-26', - open_issues: 100, - closed_issues: 10, - }, - { - date: '2022-01-27', - open_issues: 100, - closed_issues: 20, - }, - { - date: '2022-01-28', - open_issues: 90, - closed_issues: 30, - }, - { - date: '2022-01-29', - open_issues: 80, - closed_issues: 40, - }, - { - date: '2022-01-30', - open_issues: 40, - closed_issues: 80, - }, - { - date: '2022-01-31', - open_issues: 30, - closed_issues: 90, - }, - { - date: '2022-02-01', - open_issues: 25, - closed_issues: 95, - }, - { - date: '2022-02-02', - open_issues: 20, - closed_issues: 98, - }, - { - date: '2022-02-03', - open_issues: 10, - closed_issues: 130, - }, -] +import type { GetBurnupQuery } from '@/lib/graphql/generated/operations' +import type { DateRange } from '@status-im/components/src/calendar/calendar' type Props = { title: string - description: string + description?: string + color?: `#${string}` fullscreen?: boolean + isLoading?: boolean + burnup?: GetBurnupQuery['gh_burnup'] + selectedDates?: DateRange + setSelectedDates: (date?: DateRange) => void + showPicker?: boolean } export const EpicOverview = (props: Props) => { - const { title, description, fullscreen } = props + const { + title, + description, + color, + fullscreen, + isLoading, + burnup, + selectedDates, + setSelectedDates, + showPicker = true, + } = props - // Simulating loading state - const [isLoading, setIsLoading] = useState(true) - useEffect(() => { - const timeout = setTimeout(() => { - setIsLoading(false) - }, 2000) + const filteredData = burnup?.reduce( + ( + accumulator: { + date: string + open_issues: number + closed_issues: number + }[], + current: GetBurnupQuery['gh_burnup'][0] + ) => { + const existingItem = accumulator.find( + item => item.date === current.date_field + ) + if (!existingItem) { + accumulator.push({ + date: current?.date_field, + open_issues: + current?.total_opened_issues - current?.total_closed_issues, + closed_issues: current?.total_closed_issues, + }) + } - return () => { - clearTimeout(timeout) - } - }, []) + return accumulator + }, + [] + ) return (
-
- - {title} +
+
+ + {title} + + +
+ {showPicker && ( + + )} +
+ {Boolean(description) && ( + + {description} - -
- - {description} - + )} +
- +
- + -
+ {/* TODO - Add theses when we have milestones and/or labels */} + {/*
+
-
+
*/}
) } diff --git a/apps/website/src/components/index.tsx b/apps/website/src/components/index.tsx index ac8a2a81..3711604a 100644 --- a/apps/website/src/components/index.tsx +++ b/apps/website/src/components/index.tsx @@ -1,2 +1,4 @@ +export { Breadcrumbs } from './breadcrumbs' export { EpicOverview } from './epic-overview' +export { SidebarMenu } from './sidebar-menu' export { TableIssues } from './table-issues/table-issues' diff --git a/apps/website/src/components/navigation/floating-menu.tsx b/apps/website/src/components/navigation/floating-menu.tsx index 5fd4a8b4..ec4403b9 100644 --- a/apps/website/src/components/navigation/floating-menu.tsx +++ b/apps/website/src/components/navigation/floating-menu.tsx @@ -25,11 +25,10 @@ const FloatingMenu = (): JSX.Element => { useLockScroll(open) useScroll({ - onChange: ({ value: { scrollYProgress } }) => { + onChange: ({ value: { scrollY } }) => { const isMenuOpen = openRef.current - const isScrollingUp = scrollYProgress < scrollYRef.current - const detectionPoint = scrollYProgress > 0.005 - + const isScrollingUp = scrollY < scrollYRef.current + const detectionPoint = scrollY > 0.005 if (detectionPoint && isScrollingUp) { if (!visibleRef.current) { setVisible(true) @@ -39,7 +38,7 @@ const FloatingMenu = (): JSX.Element => { setVisible(false) } } - scrollYRef.current = scrollYProgress + scrollYRef.current = scrollY }, default: { immediate: true, @@ -58,7 +57,7 @@ const FloatingMenu = (): JSX.Element => { 'rounded-2xl border border-neutral-80/5 bg-blur-neutral-80/80 backdrop-blur-md', ' w-[calc(100%-24px)]', ' opacity-0 transition-opacity data-[visible=true]:opacity-100', - 'z-10', + 'z-20', ])} > diff --git a/apps/website/src/components/repos/loading-skeleton.tsx b/apps/website/src/components/repos/loading-skeleton.tsx new file mode 100644 index 00000000..a5af71fd --- /dev/null +++ b/apps/website/src/components/repos/loading-skeleton.tsx @@ -0,0 +1,38 @@ +import { Shadow, Skeleton } from '@status-im/components' + +const LoadingSkeleton = () => { + return ( +
+ {[...Array(6)].map((_, index) => ( + +
+ + +
+ + + +
+
+
+ ))} +
+ ) +} + +export { LoadingSkeleton } diff --git a/apps/website/src/components/sidebar-menu/index.tsx b/apps/website/src/components/sidebar-menu/index.tsx index a0325684..75608eda 100644 --- a/apps/website/src/components/sidebar-menu/index.tsx +++ b/apps/website/src/components/sidebar-menu/index.tsx @@ -5,8 +5,11 @@ import { useRouter } from 'next/router' import { NavLink } from './nav-link' import { NavNestedLinks } from './nav-nested-links' +import { SkeletonPlaceholder } from './skeleton-placeholder' +import { decodeUriComponent } from './utils' type Props = { + isLoading?: boolean items: { label: string href?: string @@ -22,7 +25,7 @@ type Props = { } const SidebarMenu = (props: Props) => { - const { items } = props + const { items, isLoading } = props const [label, setLabel] = useState('') @@ -30,7 +33,8 @@ const SidebarMenu = (props: Props) => { const defaultLabel = items?.find( item => - item.href === asPath || item.links?.find(link => link.href === asPath) + item.href === decodeUriComponent(asPath) || + item.links?.find(link => link.href === decodeUriComponent(asPath)) )?.label useEffect(() => { @@ -40,40 +44,40 @@ const SidebarMenu = (props: Props) => { return (
) diff --git a/apps/website/src/components/sidebar-menu/nav-nested-links.tsx b/apps/website/src/components/sidebar-menu/nav-nested-links.tsx index 21ac1820..5215f656 100644 --- a/apps/website/src/components/sidebar-menu/nav-nested-links.tsx +++ b/apps/website/src/components/sidebar-menu/nav-nested-links.tsx @@ -5,6 +5,7 @@ import { ChevronRightIcon } from '@status-im/icons' import { useRouter } from 'next/router' import { Link } from '../link' +import { decodeUriComponent } from './utils' import type { Url } from 'next/dist/shared/lib/router/router' @@ -26,7 +27,7 @@ const NavNestedLinks = (props: NavLinkProps) => { const { asPath } = useRouter() return ( - +
@@ -44,7 +45,7 @@ const NavNestedLinks = (props: NavLinkProps) => { }} > {links.map((link, index) => { - const active = asPath === link.href + const active = decodeUriComponent(asPath) === link.href const paddingClassName = index === 0 ? 'pt-5' : 'pt-2' const paddingLastChild = index === links.length - 1 ? 'pb-5' : '' diff --git a/apps/website/src/components/sidebar-menu/skeleton-placeholder.tsx b/apps/website/src/components/sidebar-menu/skeleton-placeholder.tsx new file mode 100644 index 00000000..79283c6f --- /dev/null +++ b/apps/website/src/components/sidebar-menu/skeleton-placeholder.tsx @@ -0,0 +1,89 @@ +import { Skeleton } from '@status-im/components' +import { Stack } from '@tamagui/core' + +const SkeletonPlaceholder = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export { SkeletonPlaceholder } diff --git a/apps/website/src/components/sidebar-menu/utils.ts b/apps/website/src/components/sidebar-menu/utils.ts new file mode 100644 index 00000000..394023e4 --- /dev/null +++ b/apps/website/src/components/sidebar-menu/utils.ts @@ -0,0 +1,3 @@ +export function decodeUriComponent(str: string): string { + return decodeURIComponent(str.replace(/\+/g, '%20')) +} diff --git a/apps/website/src/components/table-issues.tsx b/apps/website/src/components/table-issues.tsx new file mode 100644 index 00000000..d10073b8 --- /dev/null +++ b/apps/website/src/components/table-issues.tsx @@ -0,0 +1,98 @@ +import { Avatar, Skeleton, Tag, Text } from '@status-im/components' +import { formatDistanceToNow } from 'date-fns' +import Link from 'next/link' + +import type { + GetIssuesByEpicQuery, + GetOrphansQuery, +} from '@/lib/graphql/generated/operations' + +type Props = { + isLoading?: boolean + data?: GetOrphansQuery['gh_orphans'] | GetIssuesByEpicQuery['gh_epic_issues'] + count?: { + total: number + closed: number + open: number + } +} + +// function isOrphans( +// data: GetOrphansQuery['gh_orphans'] | GetIssuesByEpicQuery['gh_epic_issues'] +// ): data is GetOrphansQuery['gh_orphans'] { +// return 'labels' in data[0] +// } + +function isIssues( + data: GetOrphansQuery['gh_orphans'] | GetIssuesByEpicQuery['gh_epic_issues'] +): data is GetIssuesByEpicQuery['gh_epic_issues'] { + return 'assignee' in data[0] +} + +export const TableIssues = (props: Props) => { + const { data, count, isLoading } = props + + const issues = data || [] + + return ( +
+
+ + {count?.open || 0} Open + + + + {count?.closed || 0} Closed + +
+ +
+ {issues.length !== 0 && + isIssues(issues) && + issues.map(issue => ( + +
+ + {issue.title} + + + #{issue.issue_number} •{' '} + {formatDistanceToNow(new Date(issue.created_at), { + addSuffix: true, + })}{' '} + by {issue.author} + +
+ +
+
+ +
+ +
+ + ))} + {isLoading && ( +
+
+ + +
+
+ + +
+
+ )} +
+
+ ) +} diff --git a/apps/website/src/components/table-issues/empty.tsx b/apps/website/src/components/table-issues/empty.tsx new file mode 100644 index 00000000..e8b1142b --- /dev/null +++ b/apps/website/src/components/table-issues/empty.tsx @@ -0,0 +1,41 @@ +import { Image, Text } from '@status-im/components' + +const Empty = () => { + return ( +
+
+
+ +
+ + No results found + +
+ + Try adjusting your search or filter to find what you’re looking for. + +
+ +
+
+ {Array.from({ length: 12 }).map((_, i) => ( +
+ ))} +
+
+
+ ) +} + +export { Empty } diff --git a/apps/website/src/components/table-issues/filters/dropdown-filter.tsx b/apps/website/src/components/table-issues/filters/dropdown-filter.tsx index 74243274..ec64c63c 100644 --- a/apps/website/src/components/table-issues/filters/dropdown-filter.tsx +++ b/apps/website/src/components/table-issues/filters/dropdown-filter.tsx @@ -1,4 +1,4 @@ -import { cloneElement, useState } from 'react' +import { cloneElement, useMemo, useState } from 'react' import { Avatar, Button, Input, Text } from '@status-im/components' import { DropdownMenu } from '@status-im/components/src/dropdown-menu' @@ -12,7 +12,7 @@ import { ColorCircle } from './components/color-circle' import type { ColorTokens } from '@tamagui/core' type Data = { - id: number + id: string name: string avatar?: string | React.ReactElement color?: ColorTokens | `#${string}` @@ -22,6 +22,8 @@ type Props = { data: Data[] label: string placeholder?: string + selectedValues: string[] + onSelectedValuesChange: (values: string[]) => void } const isAvatar = (value: unknown): value is string => { @@ -45,23 +47,26 @@ const RenderIcon = (props: Data) => { } const DropdownFilter = (props: Props) => { - const { data, label, placeholder } = props + const { data, label, placeholder, selectedValues, onSelectedValuesChange } = + props const [filterText, setFilterText] = useState('') - // TODO - this will be improved by having a debounced search and use memoization - const filteredData = data.filter(label => - label.name.toLowerCase().includes(filterText.toLowerCase()) + const filteredData = useMemo( + () => + data.filter(label => + label.name.toLowerCase().includes(filterText.toLowerCase()) + ), + [data, filterText] ) - const [selectedValues, setSelectedValues] = useState([]) const [isOpen, setIsOpen] = useState(false) const currentBreakpoint = useCurrentBreakpoint() return (
- setIsOpen(!isOpen)}> + setIsOpen(!isOpen)} modal={false}> + { checked={selectedValues.includes(filtered.id)} onSelect={() => { if (selectedValues.includes(filtered.id)) { - setSelectedValues( + onSelectedValuesChange( selectedValues.filter(id => id !== filtered.id) ) } else { - setSelectedValues([...selectedValues, filtered.id]) + onSelectedValuesChange([...selectedValues, filtered.id]) } }} /> diff --git a/apps/website/src/components/table-issues/filters/dropdown-sort.tsx b/apps/website/src/components/table-issues/filters/dropdown-sort.tsx index cd23e274..b850c46a 100644 --- a/apps/website/src/components/table-issues/filters/dropdown-sort.tsx +++ b/apps/website/src/components/table-issues/filters/dropdown-sort.tsx @@ -1,23 +1,22 @@ -import { useState } from 'react' - import { IconButton, Text } from '@status-im/components' import { DropdownMenu } from '@status-im/components/src/dropdown-menu' import { SortIcon } from '@status-im/icons' -import Image from 'next/image' + +import type { Order_By } from '@/lib/graphql/generated/schemas' type Data = { - id: number + id: Order_By name: string } type Props = { data: Data[] + orderByValue: Order_By + onOrderByValueChange: (value: Order_By) => void } const DropdownSort = (props: Props) => { - const { data } = props - - const [selectedValue, setSelectedValue] = useState() + const { data, orderByValue, onOrderByValueChange } = props return (
@@ -37,31 +36,12 @@ const DropdownSort = (props: Props) => { key={option.id} label={option.name} onSelect={() => { - setSelectedValue(option.id) + onOrderByValueChange(option.id) }} - selected={selectedValue === option.id} + selected={orderByValue === option.id} /> ) })} - {data.length === 0 && ( -
- No results -
- - No options found - -
-
- We didn't find any results -
-
- )}
diff --git a/apps/website/src/components/table-issues/filters/tabs.tsx b/apps/website/src/components/table-issues/filters/tabs.tsx index ed821ef9..7cf382b8 100644 --- a/apps/website/src/components/table-issues/filters/tabs.tsx +++ b/apps/website/src/components/table-issues/filters/tabs.tsx @@ -1,10 +1,15 @@ -import { useState } from 'react' - -import { DoneIcon, OpenIcon } from '@status-im/icons' - -const Tabs = (): JSX.Element => { - const [activeTab, setActiveTab] = useState<'open' | 'closed'>('open') +import { ActiveMembersIcon, OpenIcon } from '@status-im/icons' +type Props = { + count: { + open?: number + closed?: number + } + activeTab: 'open' | 'closed' + onTabChange: (tab: 'open' | 'closed') => void +} +const Tabs = (props: Props): JSX.Element => { + const { count, activeTab, onTabChange } = props const isOpen = activeTab === 'open' return ( @@ -14,10 +19,12 @@ const Tabs = (): JSX.Element => { className={`flex cursor-pointer flex-row items-center transition-colors ${ isOpen ? 'text-neutral-100' : 'text-neutral-50' }`} - onClick={() => setActiveTab('open')} + onClick={() => onTabChange('open')} > - 784 Open + + {typeof count.open === 'number' ? count.open : '-'} Open +
@@ -25,13 +32,15 @@ const Tabs = (): JSX.Element => { className={`flex cursor-pointer flex-row items-center transition-colors ${ !isOpen ? 'text-neutral-100' : 'text-neutral-50' }`} - onClick={() => setActiveTab('closed')} + onClick={() => onTabChange('closed')} > - - 1012 Closed + + {typeof count.closed === 'number' ? count.closed : '-'} Closed +
diff --git a/apps/website/src/components/table-issues/select.tsx b/apps/website/src/components/table-issues/select.tsx new file mode 100644 index 00000000..e69de29b diff --git a/apps/website/src/components/table-issues/table-issues.tsx b/apps/website/src/components/table-issues/table-issues.tsx index b99c5046..28430e0d 100644 --- a/apps/website/src/components/table-issues/table-issues.tsx +++ b/apps/website/src/components/table-issues/table-issues.tsx @@ -1,273 +1,155 @@ -import { useState } from 'react' - -import { Avatar, Button, Input, Tag, Text } from '@status-im/components' -import { ProfileIcon, SearchIcon } from '@status-im/icons' +import { Avatar, Input, Skeleton, Tag, Text } from '@status-im/components' +import { ActiveMembersIcon, OpenIcon, SearchIcon } from '@status-im/icons' +import { formatDistanceToNow } from 'date-fns' import Link from 'next/link' import { useCurrentBreakpoint } from '@/hooks/use-current-breakpoint' +import { Order_By } from '@/lib/graphql/generated/schemas' +import { Empty } from './empty' import { DropdownFilter, DropdownSort, Tabs } from './filters' -import type { DropdownFilterProps } from './filters/dropdown-filter' import type { DropdownSortProps } from './filters/dropdown-sort' - -const issues = [ - { - id: 5154, - title: 'Add support for encrypted communities', - status: 'open', - }, - { - id: 5155, - title: 'Add support for encrypted communities', - status: 'open', - }, - { - id: 4, - title: 'Add support for encrypted communities', - status: 'open', - }, - { - id: 4324, - title: 'Add support for encrypted communities', - status: 'open', - }, - { - id: 134, - title: 'Add support for encrypted communities', - status: 'closed', - }, - { - id: 999, - title: 'Add support for encrypted communities', - status: 'closed', - }, - { - id: 873, - title: 'Add support for encrypted communities', - status: 'open', - }, - { - id: 123, - title: 'Add support for encrypted communities', - status: 'open', - }, -] - -const authors: DropdownFilterProps['data'] = [ - { - id: 4, - name: 'marcelines', - avatar: 'https://avatars.githubusercontent.com/u/29401404?v=4', - }, - { - id: 5, - name: 'prichodko', - avatar: 'https://avatars.githubusercontent.com/u/14926950?v=4', - }, - { - id: 6, - name: 'felicio', - avatar: 'https://avatars.githubusercontent.com/u/13265126?v=4', - }, - { - id: 7, - name: 'jkbktl', - avatar: 'https://avatars.githubusercontent.com/u/520927?v=4', - }, -] - -const epics: DropdownFilterProps['data'] = [ - { - id: 4, - name: 'E:ActivityCenter', - color: '$orange-60', - }, - { - id: 5, - name: 'E:Keycard', - color: '$purple-60', - }, - { - id: 6, - name: 'E:Wallet', - color: '$pink-60', - }, - { - id: 7, - name: 'E:Chat', - color: '$beige-60', - }, -] - -const labels: DropdownFilterProps['data'] = [ - { - id: 4, - name: 'Mobile', - color: '$blue-60', - }, - { - id: 5, - name: 'Frontend', - color: '$brown-50', - }, - { - id: 6, - name: 'Backend', - color: '$red-60', - }, - { - id: 7, - name: 'Desktop', - color: '$green-60', - }, -] - -const assignees: DropdownFilterProps['data'] = [ - { - id: 1, - name: 'Unassigned', - avatar: , - }, - { - id: 4, - name: 'marcelines', - avatar: 'https://avatars.githubusercontent.com/u/29401404?v=4', - }, - { - id: 5, - name: 'prichodko', - avatar: 'https://avatars.githubusercontent.com/u/14926950?v=4', - }, - { - id: 6, - name: 'felicio', - avatar: 'https://avatars.githubusercontent.com/u/13265126?v=4', - }, - { - id: 7, - name: 'jkbktl', - avatar: 'https://avatars.githubusercontent.com/u/520927?v=4', - }, -] - -const repositories: DropdownFilterProps['data'] = [ - { - id: 1, - name: 'status-mobile', - }, - { - id: 2, - name: 'status-desktop', - }, - { - id: 3, - name: 'status-web', - }, - { - id: 4, - name: 'status-go', - }, - { - id: 5, - name: 'nwaku', - }, - { - id: 6, - name: 'go-waku', - }, - { - id: 7, - name: 'js-waku', - }, - { - id: 8, - name: 'nimbus-eth2', - }, - { - id: 9, - name: 'help.status.im', - }, -] +import type { + GetFiltersForOrphansQuery, + GetFiltersWithEpicQuery, + GetIssuesByEpicQuery, + GetOrphansQuery, +} from '@/lib/graphql/generated/operations' const sortOptions: DropdownSortProps['data'] = [ { - id: 1, - name: 'Default', + id: Order_By.Asc, + name: 'Ascending', }, { - id: 2, - name: 'Alphabetical', - }, - { - id: 3, - name: 'Creation date', - }, - { - id: 4, - name: 'Updated', - }, - { - id: 5, - name: 'Completion', + id: Order_By.Desc, + name: 'Descending', }, ] -const TableIssues = () => { - const [issuesSearchText, setIssuesSearchText] = useState('') +type Props = { + isLoading?: boolean + data?: GetOrphansQuery['gh_orphans'] | GetIssuesByEpicQuery['gh_epic_issues'] + filters?: GetFiltersWithEpicQuery | GetFiltersForOrphansQuery + count?: { + total?: number + closed?: number + open?: number + } + activeTab: 'open' | 'closed' + handleTabChange: (tab: 'open' | 'closed') => void + selectedAuthors: string[] + handleSelectedAuthors: (values: string[]) => void + selectedAssignees: string[] + handleSelectedAssignees: (values: string[]) => void + selectedRepos: string[] + handleSelectedRepos: (values: string[]) => void + orderByValue: Order_By + handleOrderByValue: (value: Order_By) => void + handleSearchFilter: (value: string) => void + searchFilterValue: string +} +const TableIssues = (props: Props) => { const currentBreakpoint = useCurrentBreakpoint() + const { + data = [], + count, + isLoading, + filters, + handleTabChange, + activeTab, + selectedAuthors, + handleSelectedAuthors, + selectedAssignees, + handleSelectedAssignees, + selectedRepos, + handleSelectedRepos, + orderByValue, + handleOrderByValue, + handleSearchFilter, + searchFilterValue, + } = props + return ( -
-
+
+
- +
} size={32} - value={issuesSearchText} - onChangeText={setIssuesSearchText} + value={searchFilterValue} + onChangeText={handleSearchFilter} variant="retractable" direction={currentBreakpoint === '2xl' ? 'rtl' : 'ltr'} />
{ + return { + id: author.author || '', + name: author.author || '', + } + }) || [] + } label="Author" - placeholder="Find author" + placeholder="Find author " /> - - { + return { + id: assignee.assignee || '', + name: assignee.assignee || '', + } + }) || [] + } label="Assignee" placeholder="Find assignee" /> { + return { + id: repo.repository || '', + name: repo.repository || '', + } + }) || [] + } label="Repos" placeholder="Find repo" />
-
- +
@@ -275,47 +157,78 @@ const TableIssues = () => {
-
- {issues.map(issue => ( - -
- - {issue.title} - - - #9667 • Opened 2 days ago by slaedjenic - -
- -
-
- - - - +
+ {data.length !== 0 && + data.map(issue => ( + +
+
+ {issue.stage === 'open' ? ( + + ) : ( + + )} +
+
+ + {issue.title} + + + #{issue.issue_number} •{' '} + {formatDistanceToNow(new Date(issue.created_at), { + addSuffix: true, + })}{' '} + by {issue.author} + +
- +
+ {'epic_name' in issue && issue.epic_name && ( + + )} - + {'labels' in issue && + issue.labels && + JSON.parse(issue.labels).map( + (label: { id: string; name: string; color: string }) => ( + + ) + )} + +
+ + ))} + {data.length === 0 && !isLoading && ( +
+ +
+ )} + {isLoading && ( +
+
+ +
- - ))} -
- -
- +
+ + +
+
+ )}
) diff --git a/apps/website/src/hooks/use-debounce.ts b/apps/website/src/hooks/use-debounce.ts new file mode 100644 index 00000000..67d8c03b --- /dev/null +++ b/apps/website/src/hooks/use-debounce.ts @@ -0,0 +1,15 @@ +import { useEffect, useState } from 'react' + +export function useDebounce(value: T, delay?: number): T { + const [debouncedValue, setDebouncedValue] = useState(value) + + useEffect(() => { + const timer = setTimeout(() => setDebouncedValue(value), delay || 300) + + return () => { + clearTimeout(timer) + } + }, [value, delay]) + + return debouncedValue +} diff --git a/apps/website/src/hooks/use-intersection-observer.ts b/apps/website/src/hooks/use-intersection-observer.ts new file mode 100644 index 00000000..e9b8d420 --- /dev/null +++ b/apps/website/src/hooks/use-intersection-observer.ts @@ -0,0 +1,43 @@ +import { useEffect, useState } from 'react' + +import type { RefObject } from 'react' + +interface Args extends IntersectionObserverInit { + freezeOnceVisible?: boolean +} + +export function useIntersectionObserver( + elementRef: RefObject, + { + threshold = 0, + root = null, + rootMargin = '0%', + freezeOnceVisible = false, + }: Args +): IntersectionObserverEntry | undefined { + const [entry, setEntry] = useState() + + const frozen = entry?.isIntersecting && freezeOnceVisible + + const updateEntry = ([entry]: IntersectionObserverEntry[]): void => { + setEntry(entry) + } + + useEffect(() => { + const node = elementRef?.current // DOM Ref + const hasIOSupport = !!window.IntersectionObserver + + if (!hasIOSupport || frozen || !node) return + + const observerParams = { threshold, root, rootMargin } + const observer = new IntersectionObserver(updateEntry, observerParams) + + observer.observe(node) + + return () => observer.disconnect() + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [elementRef?.current, JSON.stringify(threshold), root, rootMargin, frozen]) + + return entry +} diff --git a/apps/website/src/hooks/use-render-if-visible.tsx b/apps/website/src/hooks/use-render-if-visible.tsx new file mode 100644 index 00000000..12b6d407 --- /dev/null +++ b/apps/website/src/hooks/use-render-if-visible.tsx @@ -0,0 +1,85 @@ +import React, { useEffect, useMemo, useRef, useState } from 'react' + +const TIMEOUT = 600 + +type Props = { + initialVisible?: boolean + defaultHeight?: number + visibleOffset?: number + disabled?: boolean + root?: HTMLElement | null + rootElement?: string + rootElementClass?: string + children: React.ReactNode + placeholderComponent?: React.ReactNode +} + +export const RenderIfVisible = ({ + initialVisible = false, + defaultHeight = 300, + visibleOffset = 1000, + disabled = false, + root = null, + rootElement = 'div', + rootElementClass = '', + placeholderComponent: PlaceholderComponent, + children, +}: Props) => { + const [isVisible, setIsVisible] = useState(initialVisible) + const wasVisible = useRef(initialVisible) + const placeholderHeight = useRef(defaultHeight) + const intersectionRef = useRef(null) + + useEffect(() => { + if (intersectionRef.current) { + const localRef = intersectionRef.current + const observer = new IntersectionObserver( + entries => { + if (!entries[0].isIntersecting) { + placeholderHeight.current = localRef!.offsetHeight + } + if (typeof window !== undefined && window.requestIdleCallback) { + window.requestIdleCallback( + () => setIsVisible(entries[0].isIntersecting), + { + timeout: TIMEOUT, + } + ) + } else { + setIsVisible(entries[0].isIntersecting) + } + }, + { root, rootMargin: `${visibleOffset}px 0px ${visibleOffset}px 0px` } + ) + + observer.observe(localRef) + return () => { + if (localRef) { + observer.unobserve(localRef) + } + } + } + }, [root, visibleOffset]) + + useEffect(() => { + if (isVisible) { + wasVisible.current = true + } + }, [isVisible]) + + const rootClasses = useMemo( + () => `renderIfVisible ${rootElementClass}`, + [rootElementClass] + ) + + return React.createElement( + rootElement, + { + ref: intersectionRef, + className: rootClasses, + }, + isVisible || (disabled && wasVisible.current) + ? children + : PlaceholderComponent || null + ) +} diff --git a/apps/website/src/layouts/insights-layout.tsx b/apps/website/src/layouts/insights-layout.tsx index 3680d421..14726121 100644 --- a/apps/website/src/layouts/insights-layout.tsx +++ b/apps/website/src/layouts/insights-layout.tsx @@ -1,74 +1,7 @@ -import { SidebarMenu } from '../components/sidebar-menu' +import { SidebarMenu } from '../components' import { AppLayout } from './app-layout' -// Eventually this will be fetched from the API, at least the nested links -const MENU_LINKS = [ - { - label: 'Epics', - links: [ - { - label: 'Overview', - href: '/insights/epics', - }, - { - label: 'Community Protocol', - href: '/insights/epics/1', - }, - { - label: 'Keycard', - href: '/insights/epics/keycard', - }, - { - label: 'Notifications Settings', - href: '/insights/epics/notifications-settings', - }, - { - label: 'Wallet', - href: '/insights/epics/wallet', - }, - { - label: 'Communities', - href: '/insights/epics/communities', - }, - { - label: 'Acitivity Center', - href: '/insights/epics/activity-center', - }, - ], - }, - { - label: 'Workstreams', - links: [ - { - label: 'Overview', - href: '/insights/workstreams', - }, - { - label: 'Community Protocol 2', - href: '/insights/workstreams/community-protocol-2', - }, - { - label: 'Keycard 2', - href: '/insights/workstreams/keycard-2', - }, - { - label: 'Notifications Settings 2', - href: '/insights/workstreams/notifications-settings-2', - }, - { - label: 'Wallet 2', - href: '/insights/workstreams/wallet-2', - }, - { - label: 'Communities 2', - href: '/insights/workstreams/communities-2', - }, - { - label: 'Acitivity Center 2', - href: '/insights/workstreams/activity-center-2', - }, - ], - }, +const STATIC_LINKS = [ { label: 'Orphans', href: '/insights/orphans', @@ -81,14 +14,40 @@ const MENU_LINKS = [ interface InsightsLayoutProps { children: React.ReactNode + links: string[] } -export const InsightsLayout: React.FC = ({ children }) => { +export const InsightsLayout: React.FC = ({ + children, + links: linksFromProps, +}) => { + const epicLinks = + linksFromProps?.map(epic => { + return { + label: epic || '', + href: `/insights/epics/${epic}`, + } + }) || [] + + const links = [ + { + label: 'Epics', + links: [ + { + label: 'Overview', + href: '/insights/epics', + }, + ...epicLinks, + ], + }, + ...STATIC_LINKS, + ] + return ( -
- -
{children}
+
+ {} +
{children}
) diff --git a/apps/website/src/lib/burnup.ts b/apps/website/src/lib/burnup.ts new file mode 100644 index 00000000..6d2dc3f1 --- /dev/null +++ b/apps/website/src/lib/burnup.ts @@ -0,0 +1,178 @@ +export const GET_BURNUP = /* GraphQL */ ` + query getBurnup($epicNames: [String!], $from: timestamptz, $to: timestamptz) { + gh_burnup( + where: { + epic_name: { _in: $epicNames } + _or: [ + { + _and: [ + { date_field: { _gte: $from } } + { date_field: { _lt: $to } } + ] + } + { + _and: [ + { date_field: { _gt: $from } } + { date_field: { _lte: $to } } + ] + } + ] + } + order_by: { date_field: asc } + ) { + epic_name + total_closed_issues + total_opened_issues + date_field + } + } +` + +export const GET_ISSUES_BY_EPIC = /* GraphQL */ ` + query getIssuesByEpic( + $where: gh_epic_issues_bool_exp! + $limit: Int! + $offset: Int! + $orderBy: order_by + ) { + gh_epic_issues( + where: $where + order_by: { created_at: $orderBy } + limit: $limit + offset: $offset + ) { + assignee + author + closed_at + created_at + epic_color + epic_name + repository + stage + title + issue_number + issue_url + } + } +` + +export const GET_EPIC_ISSUES_COUNT = /* GraphQL */ ` + query getEpicIssuesCount($where: gh_epic_issues_bool_exp!) { + gh_epic_issues(where: $where) { + closed_at + } + } +` + +export const GET_FILTERS_WITH_EPIC = /* GraphQL */ ` + query getFiltersWithEpic($epicName: String!) { + authors: gh_epic_issues( + where: { epic_name: { _eq: $epicName }, author: { _is_null: false } } + distinct_on: author + ) { + author + } + assignees: gh_epic_issues( + where: { epic_name: { _eq: $epicName }, assignee: { _is_null: false } } + distinct_on: assignee + ) { + assignee + } + repos: gh_epic_issues( + where: { epic_name: { _eq: $epicName } } + distinct_on: repository + ) { + repository + } + } +` + +export const GET_EPIC_LINKS = /* GraphQL */ ` + query getEpicMenuLinks( + $where: gh_epics_bool_exp + $orderBy: [gh_epics_order_by!] + $limit: Int + $offset: Int + ) { + gh_epics( + where: $where + order_by: $orderBy + limit: $limit + offset: $offset + distinct_on: epic_name + ) { + epic_name + epic_color + epic_description + status + } + } +` + +export const GET_REPOS = /* GraphQL */ ` + query getRepositories { + gh_repositories { + description + full_name + name + open_issues_count + stargazers_count + visibility + } + } +` + +export const GET_ORPHANS = /* GraphQL */ ` + query getOrphans( + $where: gh_orphans_bool_exp! + $limit: Int! + $offset: Int! + $orderBy: order_by + ) { + gh_orphans( + where: $where + order_by: { created_at: $orderBy } + limit: $limit + offset: $offset + ) { + labels + assignee + author + issue_number + issue_url + created_at + closed_at + repository + stage + title + } + } +` + +export const GET_ORPHANS_COUNT = /* GraphQL */ ` + query getOrphansCount($where: gh_orphans_bool_exp!) { + gh_orphans(where: $where) { + closed_at + } + } +` + +export const GET_FILTERS_FOR_ORPHANS = /* GraphQL */ ` + query getFiltersForOrphans { + authors: gh_orphans( + where: { author: { _is_null: false } } + distinct_on: author + ) { + author + } + assignees: gh_orphans( + where: { assignee: { _is_null: false } } + distinct_on: assignee + ) { + assignee + } + repos: gh_orphans(distinct_on: repository) { + repository + } + } +` diff --git a/apps/website/src/lib/graphql/api.ts b/apps/website/src/lib/graphql/api.ts new file mode 100644 index 00000000..92edd421 --- /dev/null +++ b/apps/website/src/lib/graphql/api.ts @@ -0,0 +1,27 @@ +import { GraphQLClient } from 'graphql-request' + +import type { RequestDocument, Variables } from 'graphql-request' + +export const GRAPHQL_ENDPOINT = `https://hasura.infra.status.im/v1/graphql` + +export const api = ( + operation: RequestDocument, + variables?: V, + headers?: Record +): Promise => { + const client = new GraphQLClient(GRAPHQL_ENDPOINT, { + headers: { + 'Content-Type': 'application/json', + ...headers, + }, + }) + + return client.request(operation, variables as Variables) +} + +export const createFetcher = ( + operation: string, + variables?: V +) => { + return () => api(operation, variables) +} diff --git a/apps/website/src/lib/graphql/generated/hooks.ts b/apps/website/src/lib/graphql/generated/hooks.ts new file mode 100644 index 00000000..d5390d57 --- /dev/null +++ b/apps/website/src/lib/graphql/generated/hooks.ts @@ -0,0 +1,327 @@ +import { useQuery } from '@tanstack/react-query' + +import { createFetcher } from '../api' + +import type * as Types from './operations' +import type { UseQueryOptions } from '@tanstack/react-query' + +export const GetBurnupDocument = ` + query getBurnup($epicNames: [String!], $from: timestamptz, $to: timestamptz) { + gh_burnup( + where: {epic_name: {_in: $epicNames}, _or: [{_and: [{date_field: {_gte: $from}}, {date_field: {_lt: $to}}]}, {_and: [{date_field: {_gt: $from}}, {date_field: {_lte: $to}}]}]} + order_by: {date_field: asc} + ) { + epic_name + total_closed_issues + total_opened_issues + date_field + } +} + ` +export const useGetBurnupQuery = < + TData = Types.GetBurnupQuery, + TError = GraphqlApiError +>( + variables?: Types.GetBurnupQueryVariables, + options?: UseQueryOptions +) => + useQuery( + variables === undefined ? ['getBurnup'] : ['getBurnup', variables], + createFetcher( + GetBurnupDocument, + variables + ), + options + ) + +useGetBurnupQuery.getKey = (variables?: Types.GetBurnupQueryVariables) => + variables === undefined ? ['getBurnup'] : ['getBurnup', variables] +export const GetIssuesByEpicDocument = ` + query getIssuesByEpic($where: gh_epic_issues_bool_exp!, $limit: Int!, $offset: Int!, $orderBy: order_by) { + gh_epic_issues( + where: $where + order_by: {created_at: $orderBy} + limit: $limit + offset: $offset + ) { + assignee + author + closed_at + created_at + epic_color + epic_name + repository + stage + title + issue_number + issue_url + } +} + ` +export const useGetIssuesByEpicQuery = < + TData = Types.GetIssuesByEpicQuery, + TError = GraphqlApiError +>( + variables: Types.GetIssuesByEpicQueryVariables, + options?: UseQueryOptions +) => + useQuery( + ['getIssuesByEpic', variables], + createFetcher< + Types.GetIssuesByEpicQuery, + Types.GetIssuesByEpicQueryVariables + >(GetIssuesByEpicDocument, variables), + options + ) + +useGetIssuesByEpicQuery.getKey = ( + variables: Types.GetIssuesByEpicQueryVariables +) => ['getIssuesByEpic', variables] +export const GetEpicIssuesCountDocument = ` + query getEpicIssuesCount($where: gh_epic_issues_bool_exp!) { + gh_epic_issues(where: $where) { + closed_at + } +} + ` +export const useGetEpicIssuesCountQuery = < + TData = Types.GetEpicIssuesCountQuery, + TError = GraphqlApiError +>( + variables: Types.GetEpicIssuesCountQueryVariables, + options?: UseQueryOptions +) => + useQuery( + ['getEpicIssuesCount', variables], + createFetcher< + Types.GetEpicIssuesCountQuery, + Types.GetEpicIssuesCountQueryVariables + >(GetEpicIssuesCountDocument, variables), + options + ) + +useGetEpicIssuesCountQuery.getKey = ( + variables: Types.GetEpicIssuesCountQueryVariables +) => ['getEpicIssuesCount', variables] +export const GetFiltersWithEpicDocument = ` + query getFiltersWithEpic($epicName: String!) { + authors: gh_epic_issues( + where: {epic_name: {_eq: $epicName}, author: {_is_null: false}} + distinct_on: author + ) { + author + } + assignees: gh_epic_issues( + where: {epic_name: {_eq: $epicName}, assignee: {_is_null: false}} + distinct_on: assignee + ) { + assignee + } + repos: gh_epic_issues( + where: {epic_name: {_eq: $epicName}} + distinct_on: repository + ) { + repository + } +} + ` +export const useGetFiltersWithEpicQuery = < + TData = Types.GetFiltersWithEpicQuery, + TError = GraphqlApiError +>( + variables: Types.GetFiltersWithEpicQueryVariables, + options?: UseQueryOptions +) => + useQuery( + ['getFiltersWithEpic', variables], + createFetcher< + Types.GetFiltersWithEpicQuery, + Types.GetFiltersWithEpicQueryVariables + >(GetFiltersWithEpicDocument, variables), + options + ) + +useGetFiltersWithEpicQuery.getKey = ( + variables: Types.GetFiltersWithEpicQueryVariables +) => ['getFiltersWithEpic', variables] +export const GetEpicMenuLinksDocument = ` + query getEpicMenuLinks($where: gh_epics_bool_exp, $orderBy: [gh_epics_order_by!], $limit: Int, $offset: Int) { + gh_epics( + where: $where + order_by: $orderBy + limit: $limit + offset: $offset + distinct_on: epic_name + ) { + epic_name + epic_color + epic_description + status + } +} + ` +export const useGetEpicMenuLinksQuery = < + TData = Types.GetEpicMenuLinksQuery, + TError = GraphqlApiError +>( + variables?: Types.GetEpicMenuLinksQueryVariables, + options?: UseQueryOptions +) => + useQuery( + variables === undefined + ? ['getEpicMenuLinks'] + : ['getEpicMenuLinks', variables], + createFetcher< + Types.GetEpicMenuLinksQuery, + Types.GetEpicMenuLinksQueryVariables + >(GetEpicMenuLinksDocument, variables), + options + ) + +useGetEpicMenuLinksQuery.getKey = ( + variables?: Types.GetEpicMenuLinksQueryVariables +) => + variables === undefined + ? ['getEpicMenuLinks'] + : ['getEpicMenuLinks', variables] +export const GetRepositoriesDocument = ` + query getRepositories { + gh_repositories { + description + full_name + name + open_issues_count + stargazers_count + visibility + } +} + ` +export const useGetRepositoriesQuery = < + TData = Types.GetRepositoriesQuery, + TError = GraphqlApiError +>( + variables?: Types.GetRepositoriesQueryVariables, + options?: UseQueryOptions +) => + useQuery( + variables === undefined + ? ['getRepositories'] + : ['getRepositories', variables], + createFetcher< + Types.GetRepositoriesQuery, + Types.GetRepositoriesQueryVariables + >(GetRepositoriesDocument, variables), + options + ) + +useGetRepositoriesQuery.getKey = ( + variables?: Types.GetRepositoriesQueryVariables +) => + variables === undefined ? ['getRepositories'] : ['getRepositories', variables] +export const GetOrphansDocument = ` + query getOrphans($where: gh_orphans_bool_exp!, $limit: Int!, $offset: Int!, $orderBy: order_by) { + gh_orphans( + where: $where + order_by: {created_at: $orderBy} + limit: $limit + offset: $offset + ) { + labels + assignee + author + issue_number + issue_url + created_at + closed_at + repository + stage + title + } +} + ` +export const useGetOrphansQuery = < + TData = Types.GetOrphansQuery, + TError = GraphqlApiError +>( + variables: Types.GetOrphansQueryVariables, + options?: UseQueryOptions +) => + useQuery( + ['getOrphans', variables], + createFetcher( + GetOrphansDocument, + variables + ), + options + ) + +useGetOrphansQuery.getKey = (variables: Types.GetOrphansQueryVariables) => [ + 'getOrphans', + variables, +] +export const GetOrphansCountDocument = ` + query getOrphansCount($where: gh_orphans_bool_exp!) { + gh_orphans(where: $where) { + closed_at + } +} + ` +export const useGetOrphansCountQuery = < + TData = Types.GetOrphansCountQuery, + TError = GraphqlApiError +>( + variables: Types.GetOrphansCountQueryVariables, + options?: UseQueryOptions +) => + useQuery( + ['getOrphansCount', variables], + createFetcher< + Types.GetOrphansCountQuery, + Types.GetOrphansCountQueryVariables + >(GetOrphansCountDocument, variables), + options + ) + +useGetOrphansCountQuery.getKey = ( + variables: Types.GetOrphansCountQueryVariables +) => ['getOrphansCount', variables] +export const GetFiltersForOrphansDocument = ` + query getFiltersForOrphans { + authors: gh_orphans(where: {author: {_is_null: false}}, distinct_on: author) { + author + } + assignees: gh_orphans( + where: {assignee: {_is_null: false}} + distinct_on: assignee + ) { + assignee + } + repos: gh_orphans(distinct_on: repository) { + repository + } +} + ` +export const useGetFiltersForOrphansQuery = < + TData = Types.GetFiltersForOrphansQuery, + TError = GraphqlApiError +>( + variables?: Types.GetFiltersForOrphansQueryVariables, + options?: UseQueryOptions +) => + useQuery( + variables === undefined + ? ['getFiltersForOrphans'] + : ['getFiltersForOrphans', variables], + createFetcher< + Types.GetFiltersForOrphansQuery, + Types.GetFiltersForOrphansQueryVariables + >(GetFiltersForOrphansDocument, variables), + options + ) + +useGetFiltersForOrphansQuery.getKey = ( + variables?: Types.GetFiltersForOrphansQueryVariables +) => + variables === undefined + ? ['getFiltersForOrphans'] + : ['getFiltersForOrphans', variables] diff --git a/apps/website/src/lib/graphql/generated/operations.ts b/apps/website/src/lib/graphql/generated/operations.ts new file mode 100644 index 00000000..a9e4192b --- /dev/null +++ b/apps/website/src/lib/graphql/generated/operations.ts @@ -0,0 +1,149 @@ +import type * as Types from './schemas' + +export type GetBurnupQueryVariables = Types.Exact<{ + epicNames?: Types.InputMaybe< + Array | Types.Scalars['String']['input'] + > + from?: Types.InputMaybe + to?: Types.InputMaybe +}> + +export type GetBurnupQuery = { + __typename?: 'query_root' + gh_burnup: Array<{ + __typename?: 'gh_burnup' + epic_name?: string | null + total_closed_issues?: any | null + total_opened_issues?: any | null + date_field?: any | null + }> +} + +export type GetIssuesByEpicQueryVariables = Types.Exact<{ + where: Types.Gh_Epic_Issues_Bool_Exp + limit: Types.Scalars['Int']['input'] + offset: Types.Scalars['Int']['input'] + orderBy?: Types.InputMaybe +}> + +export type GetIssuesByEpicQuery = { + __typename?: 'query_root' + gh_epic_issues: Array<{ + __typename?: 'gh_epic_issues' + assignee?: string | null + author?: string | null + closed_at?: any | null + created_at?: any | null + epic_color?: string | null + epic_name?: string | null + repository?: string | null + stage?: string | null + title?: string | null + issue_number?: any | null + issue_url?: string | null + }> +} + +export type GetEpicIssuesCountQueryVariables = Types.Exact<{ + where: Types.Gh_Epic_Issues_Bool_Exp +}> + +export type GetEpicIssuesCountQuery = { + __typename?: 'query_root' + gh_epic_issues: Array<{ + __typename?: 'gh_epic_issues' + closed_at?: any | null + }> +} + +export type GetFiltersWithEpicQueryVariables = Types.Exact<{ + epicName: Types.Scalars['String']['input'] +}> + +export type GetFiltersWithEpicQuery = { + __typename?: 'query_root' + authors: Array<{ __typename?: 'gh_epic_issues'; author?: string | null }> + assignees: Array<{ __typename?: 'gh_epic_issues'; assignee?: string | null }> + repos: Array<{ __typename?: 'gh_epic_issues'; repository?: string | null }> +} + +export type GetEpicMenuLinksQueryVariables = Types.Exact<{ + where?: Types.InputMaybe + orderBy?: Types.InputMaybe< + Array | Types.Gh_Epics_Order_By + > + limit?: Types.InputMaybe + offset?: Types.InputMaybe +}> + +export type GetEpicMenuLinksQuery = { + __typename?: 'query_root' + gh_epics: Array<{ + __typename?: 'gh_epics' + epic_name?: string | null + epic_color?: string | null + epic_description?: string | null + status?: string | null + }> +} + +export type GetRepositoriesQueryVariables = Types.Exact<{ + [key: string]: never +}> + +export type GetRepositoriesQuery = { + __typename?: 'query_root' + gh_repositories: Array<{ + __typename?: 'gh_repositories' + description?: string | null + full_name?: string | null + name?: string | null + open_issues_count?: any | null + stargazers_count?: any | null + visibility?: string | null + }> +} + +export type GetOrphansQueryVariables = Types.Exact<{ + where: Types.Gh_Orphans_Bool_Exp + limit: Types.Scalars['Int']['input'] + offset: Types.Scalars['Int']['input'] + orderBy?: Types.InputMaybe +}> + +export type GetOrphansQuery = { + __typename?: 'query_root' + gh_orphans: Array<{ + __typename?: 'gh_orphans' + labels?: string | null + assignee?: string | null + author?: string | null + issue_number?: any | null + issue_url?: string | null + created_at?: any | null + closed_at?: any | null + repository?: string | null + stage?: string | null + title?: string | null + }> +} + +export type GetOrphansCountQueryVariables = Types.Exact<{ + where: Types.Gh_Orphans_Bool_Exp +}> + +export type GetOrphansCountQuery = { + __typename?: 'query_root' + gh_orphans: Array<{ __typename?: 'gh_orphans'; closed_at?: any | null }> +} + +export type GetFiltersForOrphansQueryVariables = Types.Exact<{ + [key: string]: never +}> + +export type GetFiltersForOrphansQuery = { + __typename?: 'query_root' + authors: Array<{ __typename?: 'gh_orphans'; author?: string | null }> + assignees: Array<{ __typename?: 'gh_orphans'; assignee?: string | null }> + repos: Array<{ __typename?: 'gh_orphans'; repository?: string | null }> +} diff --git a/apps/website/src/lib/graphql/generated/schemas.ts b/apps/website/src/lib/graphql/generated/schemas.ts new file mode 100644 index 00000000..54120906 --- /dev/null +++ b/apps/website/src/lib/graphql/generated/schemas.ts @@ -0,0 +1,775 @@ +export type Maybe = T | null +export type InputMaybe = Maybe +export type Exact = { + [K in keyof T]: T[K] +} +export type MakeOptional = Omit & { + [SubKey in K]?: Maybe +} +export type MakeMaybe = Omit & { + [SubKey in K]: Maybe +} +export type MakeEmpty< + T extends { [key: string]: unknown }, + K extends keyof T +> = { [_ in K]?: never } +export type Incremental = + | T + | { + [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never + } +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string } + String: { input: string; output: string } + Boolean: { input: boolean; output: boolean } + Int: { input: number; output: number } + Float: { input: number; output: number } + bigint: { input: any; output: any } + timestamptz: { input: any; output: any } +} + +/** Boolean expression to compare columns of type "String". All fields are combined with logical 'AND'. */ +export type String_Comparison_Exp = { + _eq?: InputMaybe + _gt?: InputMaybe + _gte?: InputMaybe + /** does the column match the given case-insensitive pattern */ + _ilike?: InputMaybe + _in?: InputMaybe> + /** does the column match the given POSIX regular expression, case insensitive */ + _iregex?: InputMaybe + _is_null?: InputMaybe + /** does the column match the given pattern */ + _like?: InputMaybe + _lt?: InputMaybe + _lte?: InputMaybe + _neq?: InputMaybe + /** does the column NOT match the given case-insensitive pattern */ + _nilike?: InputMaybe + _nin?: InputMaybe> + /** does the column NOT match the given POSIX regular expression, case insensitive */ + _niregex?: InputMaybe + /** does the column NOT match the given pattern */ + _nlike?: InputMaybe + /** does the column NOT match the given POSIX regular expression, case sensitive */ + _nregex?: InputMaybe + /** does the column NOT match the given SQL regular expression */ + _nsimilar?: InputMaybe + /** does the column match the given POSIX regular expression, case sensitive */ + _regex?: InputMaybe + /** does the column match the given SQL regular expression */ + _similar?: InputMaybe +} + +/** Boolean expression to compare columns of type "bigint". All fields are combined with logical 'AND'. */ +export type Bigint_Comparison_Exp = { + _eq?: InputMaybe + _gt?: InputMaybe + _gte?: InputMaybe + _in?: InputMaybe> + _is_null?: InputMaybe + _lt?: InputMaybe + _lte?: InputMaybe + _neq?: InputMaybe + _nin?: InputMaybe> +} + +/** ordering argument of a cursor */ +export enum Cursor_Ordering { + /** ascending ordering of the cursor */ + Asc = 'ASC', + /** descending ordering of the cursor */ + Desc = 'DESC', +} + +/** columns and relationships of "gh_burnup" */ +export type Gh_Burnup = { + __typename?: 'gh_burnup' + date_field?: Maybe + epic_name?: Maybe + total_closed_issues?: Maybe + total_opened_issues?: Maybe +} + +/** Boolean expression to filter rows from the table "gh_burnup". All fields are combined with a logical 'AND'. */ +export type Gh_Burnup_Bool_Exp = { + _and?: InputMaybe> + _not?: InputMaybe + _or?: InputMaybe> + date_field?: InputMaybe + epic_name?: InputMaybe + total_closed_issues?: InputMaybe + total_opened_issues?: InputMaybe +} + +/** Ordering options when selecting data from "gh_burnup". */ +export type Gh_Burnup_Order_By = { + date_field?: InputMaybe + epic_name?: InputMaybe + total_closed_issues?: InputMaybe + total_opened_issues?: InputMaybe +} + +/** select columns of table "gh_burnup" */ +export enum Gh_Burnup_Select_Column { + /** column name */ + DateField = 'date_field', + /** column name */ + EpicName = 'epic_name', + /** column name */ + TotalClosedIssues = 'total_closed_issues', + /** column name */ + TotalOpenedIssues = 'total_opened_issues', +} + +/** Streaming cursor of the table "gh_burnup" */ +export type Gh_Burnup_Stream_Cursor_Input = { + /** Stream column input with initial value */ + initial_value: Gh_Burnup_Stream_Cursor_Value_Input + /** cursor ordering */ + ordering?: InputMaybe +} + +/** Initial value of the column from where the streaming should start */ +export type Gh_Burnup_Stream_Cursor_Value_Input = { + date_field?: InputMaybe + epic_name?: InputMaybe + total_closed_issues?: InputMaybe + total_opened_issues?: InputMaybe +} + +/** columns and relationships of "gh_epic_issues" */ +export type Gh_Epic_Issues = { + __typename?: 'gh_epic_issues' + assignee?: Maybe + author?: Maybe + closed_at?: Maybe + created_at?: Maybe + epic_color?: Maybe + epic_name?: Maybe + issue_number?: Maybe + issue_url?: Maybe + labels?: Maybe + repository?: Maybe + stage?: Maybe + title?: Maybe +} + +/** Boolean expression to filter rows from the table "gh_epic_issues". All fields are combined with a logical 'AND'. */ +export type Gh_Epic_Issues_Bool_Exp = { + _and?: InputMaybe> + _not?: InputMaybe + _or?: InputMaybe> + assignee?: InputMaybe + author?: InputMaybe + closed_at?: InputMaybe + created_at?: InputMaybe + epic_color?: InputMaybe + epic_name?: InputMaybe + issue_number?: InputMaybe + issue_url?: InputMaybe + labels?: InputMaybe + repository?: InputMaybe + stage?: InputMaybe + title?: InputMaybe +} + +/** Ordering options when selecting data from "gh_epic_issues". */ +export type Gh_Epic_Issues_Order_By = { + assignee?: InputMaybe + author?: InputMaybe + closed_at?: InputMaybe + created_at?: InputMaybe + epic_color?: InputMaybe + epic_name?: InputMaybe + issue_number?: InputMaybe + issue_url?: InputMaybe + labels?: InputMaybe + repository?: InputMaybe + stage?: InputMaybe + title?: InputMaybe +} + +/** select columns of table "gh_epic_issues" */ +export enum Gh_Epic_Issues_Select_Column { + /** column name */ + Assignee = 'assignee', + /** column name */ + Author = 'author', + /** column name */ + ClosedAt = 'closed_at', + /** column name */ + CreatedAt = 'created_at', + /** column name */ + EpicColor = 'epic_color', + /** column name */ + EpicName = 'epic_name', + /** column name */ + IssueNumber = 'issue_number', + /** column name */ + IssueUrl = 'issue_url', + /** column name */ + Labels = 'labels', + /** column name */ + Repository = 'repository', + /** column name */ + Stage = 'stage', + /** column name */ + Title = 'title', +} + +/** Streaming cursor of the table "gh_epic_issues" */ +export type Gh_Epic_Issues_Stream_Cursor_Input = { + /** Stream column input with initial value */ + initial_value: Gh_Epic_Issues_Stream_Cursor_Value_Input + /** cursor ordering */ + ordering?: InputMaybe +} + +/** Initial value of the column from where the streaming should start */ +export type Gh_Epic_Issues_Stream_Cursor_Value_Input = { + assignee?: InputMaybe + author?: InputMaybe + closed_at?: InputMaybe + created_at?: InputMaybe + epic_color?: InputMaybe + epic_name?: InputMaybe + issue_number?: InputMaybe + issue_url?: InputMaybe + labels?: InputMaybe + repository?: InputMaybe + stage?: InputMaybe + title?: InputMaybe +} + +/** columns and relationships of "gh_epics" */ +export type Gh_Epics = { + __typename?: 'gh_epics' + closed_count?: Maybe + epic_color?: Maybe + epic_description?: Maybe + epic_name?: Maybe + opened_count?: Maybe + status?: Maybe + total_count?: Maybe +} + +/** Boolean expression to filter rows from the table "gh_epics". All fields are combined with a logical 'AND'. */ +export type Gh_Epics_Bool_Exp = { + _and?: InputMaybe> + _not?: InputMaybe + _or?: InputMaybe> + closed_count?: InputMaybe + epic_color?: InputMaybe + epic_description?: InputMaybe + epic_name?: InputMaybe + opened_count?: InputMaybe + status?: InputMaybe + total_count?: InputMaybe +} + +/** Ordering options when selecting data from "gh_epics". */ +export type Gh_Epics_Order_By = { + closed_count?: InputMaybe + epic_color?: InputMaybe + epic_description?: InputMaybe + epic_name?: InputMaybe + opened_count?: InputMaybe + status?: InputMaybe + total_count?: InputMaybe +} + +/** select columns of table "gh_epics" */ +export enum Gh_Epics_Select_Column { + /** column name */ + ClosedCount = 'closed_count', + /** column name */ + EpicColor = 'epic_color', + /** column name */ + EpicDescription = 'epic_description', + /** column name */ + EpicName = 'epic_name', + /** column name */ + OpenedCount = 'opened_count', + /** column name */ + Status = 'status', + /** column name */ + TotalCount = 'total_count', +} + +/** Streaming cursor of the table "gh_epics" */ +export type Gh_Epics_Stream_Cursor_Input = { + /** Stream column input with initial value */ + initial_value: Gh_Epics_Stream_Cursor_Value_Input + /** cursor ordering */ + ordering?: InputMaybe +} + +/** Initial value of the column from where the streaming should start */ +export type Gh_Epics_Stream_Cursor_Value_Input = { + closed_count?: InputMaybe + epic_color?: InputMaybe + epic_description?: InputMaybe + epic_name?: InputMaybe + opened_count?: InputMaybe + status?: InputMaybe + total_count?: InputMaybe +} + +/** columns and relationships of "gh_issues" */ +export type Gh_Issues = { + __typename?: 'gh_issues' + assignee?: Maybe + author?: Maybe + closed_at?: Maybe + created_at?: Maybe + issue_number?: Maybe + issue_url?: Maybe + labels?: Maybe + repository?: Maybe + stage?: Maybe + title?: Maybe +} + +/** Boolean expression to filter rows from the table "gh_issues". All fields are combined with a logical 'AND'. */ +export type Gh_Issues_Bool_Exp = { + _and?: InputMaybe> + _not?: InputMaybe + _or?: InputMaybe> + assignee?: InputMaybe + author?: InputMaybe + closed_at?: InputMaybe + created_at?: InputMaybe + issue_number?: InputMaybe + issue_url?: InputMaybe + labels?: InputMaybe + repository?: InputMaybe + stage?: InputMaybe + title?: InputMaybe +} + +/** Ordering options when selecting data from "gh_issues". */ +export type Gh_Issues_Order_By = { + assignee?: InputMaybe + author?: InputMaybe + closed_at?: InputMaybe + created_at?: InputMaybe + issue_number?: InputMaybe + issue_url?: InputMaybe + labels?: InputMaybe + repository?: InputMaybe + stage?: InputMaybe + title?: InputMaybe +} + +/** select columns of table "gh_issues" */ +export enum Gh_Issues_Select_Column { + /** column name */ + Assignee = 'assignee', + /** column name */ + Author = 'author', + /** column name */ + ClosedAt = 'closed_at', + /** column name */ + CreatedAt = 'created_at', + /** column name */ + IssueNumber = 'issue_number', + /** column name */ + IssueUrl = 'issue_url', + /** column name */ + Labels = 'labels', + /** column name */ + Repository = 'repository', + /** column name */ + Stage = 'stage', + /** column name */ + Title = 'title', +} + +/** Streaming cursor of the table "gh_issues" */ +export type Gh_Issues_Stream_Cursor_Input = { + /** Stream column input with initial value */ + initial_value: Gh_Issues_Stream_Cursor_Value_Input + /** cursor ordering */ + ordering?: InputMaybe +} + +/** Initial value of the column from where the streaming should start */ +export type Gh_Issues_Stream_Cursor_Value_Input = { + assignee?: InputMaybe + author?: InputMaybe + closed_at?: InputMaybe + created_at?: InputMaybe + issue_number?: InputMaybe + issue_url?: InputMaybe + labels?: InputMaybe + repository?: InputMaybe + stage?: InputMaybe + title?: InputMaybe +} + +/** columns and relationships of "gh_orphans" */ +export type Gh_Orphans = { + __typename?: 'gh_orphans' + assignee?: Maybe + author?: Maybe + closed_at?: Maybe + created_at?: Maybe + issue_number?: Maybe + issue_url?: Maybe + labels?: Maybe + repository?: Maybe + stage?: Maybe + title?: Maybe +} + +/** Boolean expression to filter rows from the table "gh_orphans". All fields are combined with a logical 'AND'. */ +export type Gh_Orphans_Bool_Exp = { + _and?: InputMaybe> + _not?: InputMaybe + _or?: InputMaybe> + assignee?: InputMaybe + author?: InputMaybe + closed_at?: InputMaybe + created_at?: InputMaybe + issue_number?: InputMaybe + issue_url?: InputMaybe + labels?: InputMaybe + repository?: InputMaybe + stage?: InputMaybe + title?: InputMaybe +} + +/** Ordering options when selecting data from "gh_orphans". */ +export type Gh_Orphans_Order_By = { + assignee?: InputMaybe + author?: InputMaybe + closed_at?: InputMaybe + created_at?: InputMaybe + issue_number?: InputMaybe + issue_url?: InputMaybe + labels?: InputMaybe + repository?: InputMaybe + stage?: InputMaybe + title?: InputMaybe +} + +/** select columns of table "gh_orphans" */ +export enum Gh_Orphans_Select_Column { + /** column name */ + Assignee = 'assignee', + /** column name */ + Author = 'author', + /** column name */ + ClosedAt = 'closed_at', + /** column name */ + CreatedAt = 'created_at', + /** column name */ + IssueNumber = 'issue_number', + /** column name */ + IssueUrl = 'issue_url', + /** column name */ + Labels = 'labels', + /** column name */ + Repository = 'repository', + /** column name */ + Stage = 'stage', + /** column name */ + Title = 'title', +} + +/** Streaming cursor of the table "gh_orphans" */ +export type Gh_Orphans_Stream_Cursor_Input = { + /** Stream column input with initial value */ + initial_value: Gh_Orphans_Stream_Cursor_Value_Input + /** cursor ordering */ + ordering?: InputMaybe +} + +/** Initial value of the column from where the streaming should start */ +export type Gh_Orphans_Stream_Cursor_Value_Input = { + assignee?: InputMaybe + author?: InputMaybe + closed_at?: InputMaybe + created_at?: InputMaybe + issue_number?: InputMaybe + issue_url?: InputMaybe + labels?: InputMaybe + repository?: InputMaybe + stage?: InputMaybe + title?: InputMaybe +} + +/** columns and relationships of "gh_repositories" */ +export type Gh_Repositories = { + __typename?: 'gh_repositories' + description?: Maybe + full_name?: Maybe + name?: Maybe + open_issues_count?: Maybe + stargazers_count?: Maybe + visibility?: Maybe +} + +/** Boolean expression to filter rows from the table "gh_repositories". All fields are combined with a logical 'AND'. */ +export type Gh_Repositories_Bool_Exp = { + _and?: InputMaybe> + _not?: InputMaybe + _or?: InputMaybe> + description?: InputMaybe + full_name?: InputMaybe + name?: InputMaybe + open_issues_count?: InputMaybe + stargazers_count?: InputMaybe + visibility?: InputMaybe +} + +/** Ordering options when selecting data from "gh_repositories". */ +export type Gh_Repositories_Order_By = { + description?: InputMaybe + full_name?: InputMaybe + name?: InputMaybe + open_issues_count?: InputMaybe + stargazers_count?: InputMaybe + visibility?: InputMaybe +} + +/** select columns of table "gh_repositories" */ +export enum Gh_Repositories_Select_Column { + /** column name */ + Description = 'description', + /** column name */ + FullName = 'full_name', + /** column name */ + Name = 'name', + /** column name */ + OpenIssuesCount = 'open_issues_count', + /** column name */ + StargazersCount = 'stargazers_count', + /** column name */ + Visibility = 'visibility', +} + +/** Streaming cursor of the table "gh_repositories" */ +export type Gh_Repositories_Stream_Cursor_Input = { + /** Stream column input with initial value */ + initial_value: Gh_Repositories_Stream_Cursor_Value_Input + /** cursor ordering */ + ordering?: InputMaybe +} + +/** Initial value of the column from where the streaming should start */ +export type Gh_Repositories_Stream_Cursor_Value_Input = { + description?: InputMaybe + full_name?: InputMaybe + name?: InputMaybe + open_issues_count?: InputMaybe + stargazers_count?: InputMaybe + visibility?: InputMaybe +} + +/** column ordering options */ +export enum Order_By { + /** in ascending order, nulls last */ + Asc = 'asc', + /** in ascending order, nulls first */ + AscNullsFirst = 'asc_nulls_first', + /** in ascending order, nulls last */ + AscNullsLast = 'asc_nulls_last', + /** in descending order, nulls first */ + Desc = 'desc', + /** in descending order, nulls first */ + DescNullsFirst = 'desc_nulls_first', + /** in descending order, nulls last */ + DescNullsLast = 'desc_nulls_last', +} + +export type Query_Root = { + __typename?: 'query_root' + /** fetch data from the table: "gh_burnup" */ + gh_burnup: Array + /** fetch data from the table: "gh_epic_issues" */ + gh_epic_issues: Array + /** fetch data from the table: "gh_epics" */ + gh_epics: Array + /** fetch data from the table: "gh_issues" */ + gh_issues: Array + /** fetch data from the table: "gh_orphans" */ + gh_orphans: Array + /** fetch data from the table: "gh_repositories" */ + gh_repositories: Array +} + +export type Query_RootGh_BurnupArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Query_RootGh_Epic_IssuesArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Query_RootGh_EpicsArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Query_RootGh_IssuesArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Query_RootGh_OrphansArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Query_RootGh_RepositoriesArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Subscription_Root = { + __typename?: 'subscription_root' + /** fetch data from the table: "gh_burnup" */ + gh_burnup: Array + /** fetch data from the table in a streaming manner: "gh_burnup" */ + gh_burnup_stream: Array + /** fetch data from the table: "gh_epic_issues" */ + gh_epic_issues: Array + /** fetch data from the table in a streaming manner: "gh_epic_issues" */ + gh_epic_issues_stream: Array + /** fetch data from the table: "gh_epics" */ + gh_epics: Array + /** fetch data from the table in a streaming manner: "gh_epics" */ + gh_epics_stream: Array + /** fetch data from the table: "gh_issues" */ + gh_issues: Array + /** fetch data from the table in a streaming manner: "gh_issues" */ + gh_issues_stream: Array + /** fetch data from the table: "gh_orphans" */ + gh_orphans: Array + /** fetch data from the table in a streaming manner: "gh_orphans" */ + gh_orphans_stream: Array + /** fetch data from the table: "gh_repositories" */ + gh_repositories: Array + /** fetch data from the table in a streaming manner: "gh_repositories" */ + gh_repositories_stream: Array +} + +export type Subscription_RootGh_BurnupArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Subscription_RootGh_Burnup_StreamArgs = { + batch_size: Scalars['Int']['input'] + cursor: Array> + where?: InputMaybe +} + +export type Subscription_RootGh_Epic_IssuesArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Subscription_RootGh_Epic_Issues_StreamArgs = { + batch_size: Scalars['Int']['input'] + cursor: Array> + where?: InputMaybe +} + +export type Subscription_RootGh_EpicsArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Subscription_RootGh_Epics_StreamArgs = { + batch_size: Scalars['Int']['input'] + cursor: Array> + where?: InputMaybe +} + +export type Subscription_RootGh_IssuesArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Subscription_RootGh_Issues_StreamArgs = { + batch_size: Scalars['Int']['input'] + cursor: Array> + where?: InputMaybe +} + +export type Subscription_RootGh_OrphansArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Subscription_RootGh_Orphans_StreamArgs = { + batch_size: Scalars['Int']['input'] + cursor: Array> + where?: InputMaybe +} + +export type Subscription_RootGh_RepositoriesArgs = { + distinct_on?: InputMaybe> + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe> + where?: InputMaybe +} + +export type Subscription_RootGh_Repositories_StreamArgs = { + batch_size: Scalars['Int']['input'] + cursor: Array> + where?: InputMaybe +} + +/** Boolean expression to compare columns of type "timestamptz". All fields are combined with logical 'AND'. */ +export type Timestamptz_Comparison_Exp = { + _eq?: InputMaybe + _gt?: InputMaybe + _gte?: InputMaybe + _in?: InputMaybe> + _is_null?: InputMaybe + _lt?: InputMaybe + _lte?: InputMaybe + _neq?: InputMaybe + _nin?: InputMaybe> +} diff --git a/apps/website/src/lib/graphql/index.ts b/apps/website/src/lib/graphql/index.ts new file mode 100644 index 00000000..649bf9ef --- /dev/null +++ b/apps/website/src/lib/graphql/index.ts @@ -0,0 +1 @@ +export { api, GRAPHQL_ENDPOINT } from './api' diff --git a/apps/website/src/lib/graphql/utils.ts b/apps/website/src/lib/graphql/utils.ts new file mode 100644 index 00000000..3f6b3d23 --- /dev/null +++ b/apps/website/src/lib/graphql/utils.ts @@ -0,0 +1,14 @@ +export const catchApiError = ( + error: GraphqlApiError, + callback: (codes: string[]) => void +) => { + const codes: string[] = [] + + error.response?.errors?.forEach(error => { + if (error.extensions?.code) { + codes.push(error.extensions?.code) + } + }) + + return callback(codes) +} diff --git a/apps/website/src/pages/api/hasura.ts b/apps/website/src/pages/api/hasura.ts new file mode 100644 index 00000000..0c417ed9 --- /dev/null +++ b/apps/website/src/pages/api/hasura.ts @@ -0,0 +1,17 @@ +export async function fetchQueryFromHasura(query: string) { + const response = await fetch('https://hasura.infra.status.im/v1/graphql', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query, + }), + }) + + if (!response.ok) { + throw new Error('Failed to fetch data from Hasura.') + } + + return response.json() +} diff --git a/apps/website/src/pages/insights/epics/[epic].tsx b/apps/website/src/pages/insights/epics/[epic].tsx index a0b4da18..972e8324 100644 --- a/apps/website/src/pages/insights/epics/[epic].tsx +++ b/apps/website/src/pages/insights/epics/[epic].tsx @@ -1,82 +1,352 @@ -import { Breadcrumbs } from '@/components/breadcrumbs' -import { EpicOverview } from '@/components/epic-overview' -import { TableIssues } from '@/components/table-issues' -import { InsightsLayout } from '@/layouts/insights-layout' +import { useEffect, useMemo, useRef, useState } from 'react' -import { epics } from '.' +import { useInfiniteQuery } from '@tanstack/react-query' +import { differenceInCalendarDays, format } from 'date-fns' +import { useRouter } from 'next/router' + +import { Breadcrumbs, EpicOverview, TableIssues } from '@/components' +import { useDebounce } from '@/hooks/use-debounce' +import { useIntersectionObserver } from '@/hooks/use-intersection-observer' +import { InsightsLayout } from '@/layouts/insights-layout' +import { + GET_EPIC_ISSUES_COUNT, + GET_EPIC_LINKS, + GET_FILTERS_WITH_EPIC, + GET_ISSUES_BY_EPIC, +} from '@/lib/burnup' +import { api } from '@/lib/graphql' +import { + useGetBurnupQuery, + useGetEpicIssuesCountQuery, + useGetFiltersWithEpicQuery, +} from '@/lib/graphql/generated/hooks' +import { Order_By } from '@/lib/graphql/generated/schemas' import type { BreadcrumbsProps } from '@/components/breadcrumbs' -import type { GetStaticPaths, GetStaticProps, Page } from 'next' +import type { + GetBurnupQuery, + GetEpicIssuesCountQuery, + GetEpicIssuesCountQueryVariables, + GetEpicMenuLinksQuery, + GetEpicMenuLinksQueryVariables, + GetFiltersWithEpicQuery, + GetFiltersWithEpicQueryVariables, + GetIssuesByEpicQuery, + GetIssuesByEpicQueryVariables, +} from '@/lib/graphql/generated/operations' +import type { DateRange } from '@status-im/components/src/calendar/calendar' +import type { GetServerSidePropsContext, Page } from 'next' -type Params = { epic: string } - -type Epic = (typeof epics)[number] - -export const getStaticPaths: GetStaticPaths = async () => { - const paths = epics.map(epic => ({ - params: { epic: epic.id }, - })) - - return { paths, fallback: false } +type Epic = { + title: string + color: `#${string}` + description: string } -export const getStaticProps: GetStaticProps = async context => { - const epic = epics.find(epic => epic.id === context.params!.epic)! +type Props = { + links: string[] + epic: Epic + breadcrumbs: BreadcrumbsProps['items'] + count: GetEpicIssuesCountQuery + filters: GetFiltersWithEpicQuery + initialDates: { + from: string + to: string + } +} - if (!epic) { +const LIMIT = 10 + +const EpicsDetailPage: Page = props => { + const router = useRouter() + + const { epic: epicName } = router.query + + const { epic, breadcrumbs, links, initialDates } = props + + const [activeTab, setActiveTab] = useState<'open' | 'closed'>('open') + const [selectedAuthors, setSelectedAuthors] = useState([]) + const [selectedAssignees, setSelectedAssignees] = useState([]) + const [selectedRepos, setSelectedRepos] = useState([]) + const [orderByValue, setOrderByValue] = useState(Order_By.Desc) + + const [searchFilter, setSearchFilter] = useState('') + const debouncedSearchFilter = useDebounce(searchFilter) + + const [selectedDates, setSelectedDates] = useState() + const [burnupData, setBurnupData] = useState() + + const { isFetching: isLoadingBurnup } = useGetBurnupQuery( + { + epicNames: epicName, + from: selectedDates?.from || initialDates.from, + to: selectedDates?.to || initialDates.to, + }, + { + // Prevent animation if we go out of the page + refetchOnWindowFocus: false, + onSuccess: data => { + const differenceBetweenSelectedDates = differenceInCalendarDays( + selectedDates?.to || new Date(), + selectedDates?.from || new Date() + ) + + const rate = 50 // 1 sample per 50 days + + let samplingRate = rate // Use the default rate as the initial value + + if (differenceBetweenSelectedDates > 0) { + // Calculate the total number of data points within the selected date range + const totalDataPoints = data?.gh_burnup.length || 0 + + // Calculate the desired number of data points based on the sampling rate + const desiredDataPoints = Math.ceil(totalDataPoints / rate) + + // Calculate the actual sampling rate based on the desired number of data points + samplingRate = Math.max( + 1, + Math.floor(totalDataPoints / desiredDataPoints) + ) + } + + // Downsampling the burnup data + const downsampledData: GetBurnupQuery['gh_burnup'] = [] + + if (data?.gh_burnup.length > 0) { + data?.gh_burnup.forEach((dataPoint, index) => { + if (index % samplingRate === 0) { + downsampledData.push(dataPoint) + } + }) + } + + if ( + selectedDates?.from && + selectedDates?.to && + data?.gh_burnup.length === 0 + ) { + downsampledData.push({ + date_field: selectedDates.from, + total_closed_issues: 0, + total_opened_issues: 0, + }) + downsampledData.push({ + date_field: selectedDates.to, + total_closed_issues: 0, + total_opened_issues: 0, + }) + } + + setBurnupData(downsampledData) + }, + } + ) + + const { data: dataCounter } = useGetEpicIssuesCountQuery({ + where: { + epic_name: { _eq: epicName as string }, + ...(selectedAuthors.length > 0 && { + author: { _in: selectedAuthors }, + }), + ...(selectedAssignees.length > 0 && { + assignee: { _in: selectedAssignees }, + }), + ...(selectedRepos.length > 0 && { + repository: { _in: selectedRepos }, + }), + title: { _ilike: `%${debouncedSearchFilter}%` }, + }, + }) + + const count = { + total: dataCounter?.gh_epic_issues.length, + closed: dataCounter?.gh_epic_issues.filter(issue => issue.closed_at).length, + open: dataCounter?.gh_epic_issues.filter(issue => !issue.closed_at).length, + } + + const { data, isFetching, fetchNextPage, hasNextPage, isFetchingNextPage } = + useInfiniteQuery( + [ + 'getIssuesByEpic', + epicName, + activeTab, + selectedAssignees, + selectedRepos, + selectedAuthors, + orderByValue, + debouncedSearchFilter, + ], + async ({ pageParam = 0 }) => { + const result = await api< + GetIssuesByEpicQuery, + GetIssuesByEpicQueryVariables + >(GET_ISSUES_BY_EPIC, { + where: { + epic_name: { _eq: epicName as string }, + stage: { _eq: activeTab }, + ...(selectedAuthors.length > 0 && { + author: { _in: selectedAuthors }, + }), + ...(selectedAssignees.length > 0 && { + assignee: { _in: selectedAssignees }, + }), + ...(selectedRepos.length > 0 && { + repository: { _in: selectedRepos }, + }), + title: { _ilike: `%${debouncedSearchFilter}%` }, + }, + limit: LIMIT, + offset: pageParam, + orderBy: orderByValue, + }) + + return result?.gh_epic_issues || [] + }, + { + getNextPageParam: (lastPage, pages) => { + if (lastPage.length < LIMIT) { + return undefined + } + + return pages.length * LIMIT + }, + } + ) + + const { data: filters } = useGetFiltersWithEpicQuery( + { + epicName: epicName as string, + }, + { + initialData: props.filters, + } + ) + + const issues = useMemo( + () => data?.pages.flatMap(page => page) || [], + [data?.pages] + ) + + const endOfPageRef = useRef(null) + const entry = useIntersectionObserver(endOfPageRef, { + rootMargin: '800px', + }) + const isVisible = !!entry?.isIntersecting + + useEffect(() => { + if (isVisible && !isFetchingNextPage && hasNextPage) { + fetchNextPage() + } + }, [fetchNextPage, hasNextPage, isFetchingNextPage, isVisible]) + + return ( + + +
+ +
+
+ +
+
+ + ) +} + +export default EpicsDetailPage + +export async function getServerSideProps(context: GetServerSidePropsContext) { + const { epic } = context.query + + const links = await api< + GetEpicMenuLinksQuery, + GetEpicMenuLinksQueryVariables + >(GET_EPIC_LINKS) + + const epicLinkExists = links?.gh_epics.find(link => link.epic_name === epic) + + if (!epicLinkExists) { return { - // notFound: true, redirect: { destination: '/insights/epics', permanent: false }, } } + // TODO: get initial date based on the epic when available + const initialDates = { + from: '2017-01-01', + to: format(new Date(), 'yyyy-MM-dd'), + } + + const [resultIssuesCount, resultFilters] = await Promise.all([ + api( + GET_EPIC_ISSUES_COUNT, + { + where: { + epic_name: { _eq: String(epic) }, + }, + } + ), + api( + GET_FILTERS_WITH_EPIC, + { + epicName: String(epic), + } + ), + ]) + return { props: { - epic, + links: + links?.gh_epics + .filter(epic => epic.status === 'In Progress') + .map(epic => epic.epic_name) || [], + count: resultIssuesCount?.gh_epic_issues, + filters: resultFilters || [], + initialDates, + epic: { + title: String(epic), + description: epicLinkExists?.epic_description || '', + color: epicLinkExists.epic_color + ? `#${epicLinkExists.epic_color}` + : '#4360df', + }, breadcrumbs: [ { label: 'Epics', href: '/insights/epics', }, { - label: epic.title, - href: `/insights/epics/${epic.id}`, + label: epic, + href: `/insights/epics/${epic}`, }, ], + key: epic, }, } } - -type Props = { - epic: Epic - breadcrumbs: BreadcrumbsProps['items'] -} - -const EpicsDetailPage: Page = props => { - const { epic, breadcrumbs } = props - - return ( -
- - -
- -
-
-
- - -
-
- ) -} - -EpicsDetailPage.getLayout = function getLayout(page) { - return {page} -} - -export default EpicsDetailPage diff --git a/apps/website/src/pages/insights/epics/index.tsx b/apps/website/src/pages/insights/epics/index.tsx index 337750ec..2db7de7d 100644 --- a/apps/website/src/pages/insights/epics/index.tsx +++ b/apps/website/src/pages/insights/epics/index.tsx @@ -1,71 +1,310 @@ -import { useState } from 'react' +import { useEffect, useMemo, useRef, useState } from 'react' -import { IconButton, Shadow, Tag, Text } from '@status-im/components' -import { - DoneIcon, - NotStartedIcon, - OpenIcon, - SearchIcon, - SortIcon, -} from '@status-im/icons' +import { Input, Shadow, Tag, Text } from '@status-im/components' +import { DoneIcon, OpenIcon, SearchIcon } from '@status-im/icons' +import { useInfiniteQuery } from '@tanstack/react-query' +import { differenceInCalendarDays, format } from 'date-fns' +import { Loading } from '@/components/chart/components' import { DatePicker } from '@/components/datepicker/datepicker' import { EpicOverview } from '@/components/epic-overview' +import { Empty } from '@/components/table-issues/empty' +import { DropdownSort } from '@/components/table-issues/filters' +import { useDebounce } from '@/hooks/use-debounce' +import { useIntersectionObserver } from '@/hooks/use-intersection-observer' +import { RenderIfVisible } from '@/hooks/use-render-if-visible' import { InsightsLayout } from '@/layouts/insights-layout' +import { GET_BURNUP, GET_EPIC_LINKS } from '@/lib/burnup' +import { api } from '@/lib/graphql' +import { Order_By } from '@/lib/graphql/generated/schemas' +import type { DropdownSortProps } from '@/components/table-issues/filters/dropdown-sort' +import type { + GetBurnupQuery, + GetBurnupQueryVariables, + GetEpicMenuLinksQuery, + GetEpicMenuLinksQueryVariables, +} from '@/lib/graphql/generated/operations' import type { DateRange } from '@status-im/components/src/calendar/calendar' import type { Page } from 'next' -export const epics = [ +type Props = { + links: string[] +} + +const LIMIT = 3 + +const sortOptions: DropdownSortProps['data'] = [ { - id: '1', - title: 'Communities protocol', - description: 'Support Encrypted Communities', + id: Order_By.Asc, + name: 'Ascending', }, { - id: '5155', - title: 'Keycard', - description: - 'Detecting keycard reader removal for the beginning of each flow', + id: Order_By.Desc, + name: 'Descending', }, ] -const EpicsPage: Page = () => { +const EpicsPage: Page = props => { + const { links } = props + const [selectedFilters, setSelectedFilters] = useState([ + 'In Progress', + ]) + + const [orderByValue, setOrderByValue] = useState(Order_By.Desc) + + const [searchFilter, setSearchFilter] = useState('') + const debouncedSearchFilter = useDebounce(searchFilter) + const [selectedDates, setSelectedDates] = useState() + const handleFilter = (filter: string) => { + if (selectedFilters.includes(filter)) { + setSelectedFilters(selectedFilters.filter(f => f !== filter)) + } else { + setSelectedFilters([...selectedFilters, filter]) + } + } + + const { + data, + isFetchedAfterMount, + fetchNextPage, + hasNextPage, + isFetching, + isFetchingNextPage, + } = useInfiniteQuery( + [ + 'getEpicsOverview', + orderByValue, + debouncedSearchFilter, + selectedDates, + selectedFilters, + ], + async ({ pageParam = 0 }) => { + const result = await api< + GetEpicMenuLinksQuery, + GetEpicMenuLinksQueryVariables + >(GET_EPIC_LINKS, { + where: { + status: { + _in: + selectedFilters.length > 0 + ? selectedFilters + : ['In Progress', 'Closed'], + }, + epic_name: { _ilike: `%${debouncedSearchFilter}%` }, + }, + limit: LIMIT, + offset: pageParam, + orderBy: { + epic_name: orderByValue || Order_By.Asc, + }, + }) + + const burnup = await api( + GET_BURNUP, + { + epicNames: result?.gh_epics.map(epic => epic.epic_name || '') || [], + from: selectedDates?.from || '2018-05-01', + to: selectedDates?.to || format(new Date(), 'yyyy-MM-dd'), + } + ) + + const differenceBetweenSelectedDates = differenceInCalendarDays( + selectedDates?.to || new Date(), + selectedDates?.from || new Date() + ) + + const rate = 50 // 1 sample per 50 days + + let samplingRate = rate // Use the default rate as the initial value + + if (differenceBetweenSelectedDates > 0) { + // Calculate the ratio between the difference in days and the desired sampling rate + const ratio = differenceBetweenSelectedDates / rate + + // Calculate the sampling rate based on the ratio + samplingRate = Math.ceil(1 / ratio) + } + + // Downsampling the burnup data + const downsampledData: GetBurnupQuery['gh_burnup'] = [] + + burnup?.gh_burnup.forEach((dataPoint, index) => { + if (index % samplingRate === 0) { + downsampledData.push(dataPoint) + } + }) + + return ( + result?.gh_epics.map(epic => { + const burnupData = downsampledData?.filter( + b => b.epic_name === epic.epic_name + ) + + return { + title: epic.epic_name, + description: epic.epic_description, + color: epic.epic_color ? `#${epic.epic_color}` : '#4360df', + burnup: + burnupData.length > 0 + ? burnupData + : [ + { + date: selectedDates?.from, + total_closed_issues: 0, + total_open_issues: 0, + }, + { + date: selectedDates?.to, + total_closed_issues: 0, + total_open_issues: 0, + }, + ], + } + }) || [] + ) + }, + { + getNextPageParam: (lastPage, pages) => { + if (lastPage.length < LIMIT) { + return undefined + } + + return pages.length * LIMIT + }, + } + ) + + const epics = useMemo(() => { + return data?.pages.flatMap(page => page) || [] + }, [data]) + + const endOfPageRef = useRef(null) + const entry = useIntersectionObserver(endOfPageRef, {}) + const isVisible = !!entry?.isIntersecting + + useEffect(() => { + if (isVisible && !isFetchingNextPage && hasNextPage) { + fetchNextPage() + } + }, [fetchNextPage, hasNextPage, isFetchingNextPage, isVisible]) + return ( -
- - Epics - + +
+
+ + Epics + -
-
- - - -
- -
- } /> - } /> +
+
+ handleFilter('In Progress')} + /> + handleFilter('Closed')} + /> +
+ +
+ } + size={32} + value={searchFilter} + onChangeText={setSearchFilter} + /> + +
+
+ +
+ {epics.map(epic => ( + +
+ +
+ + } + > + + + +
+ ))} +
+ + {(isFetching || isFetchingNextPage || hasNextPage) && ( + +
+ +
+
+ )} + + {!isFetching && !isFetchingNextPage && epics.length === 0 && ( +
+ +
+ )} +
+
- -
- {epics.map(epic => ( - - - - ))} -
- -
+ ) } -EpicsPage.getLayout = function getLayout(page) { - return {page} +export async function getServerSideProps() { + const epics = await api< + GetEpicMenuLinksQuery, + GetEpicMenuLinksQueryVariables + >(GET_EPIC_LINKS) + + return { + props: { + links: + epics?.gh_epics + .filter(epic => epic.status === 'In Progress') + .map(epic => epic.epic_name) || [], + }, + } } export default EpicsPage diff --git a/apps/website/src/pages/insights/orphans.tsx b/apps/website/src/pages/insights/orphans.tsx index 6f0b79c8..2214c72f 100644 --- a/apps/website/src/pages/insights/orphans.tsx +++ b/apps/website/src/pages/insights/orphans.tsx @@ -1,24 +1,205 @@ +import { useEffect, useMemo, useRef, useState } from 'react' + import { Text } from '@status-im/components' +import { useInfiniteQuery } from '@tanstack/react-query' import { TableIssues } from '@/components' +import { useDebounce } from '@/hooks/use-debounce' +import { useIntersectionObserver } from '@/hooks/use-intersection-observer' import { InsightsLayout } from '@/layouts/insights-layout' +import { + GET_EPIC_LINKS, + GET_FILTERS_FOR_ORPHANS, + GET_ORPHANS, + GET_ORPHANS_COUNT, +} from '@/lib/burnup' +import { api } from '@/lib/graphql' +import { useGetOrphansCountQuery } from '@/lib/graphql/generated/hooks' +import { Order_By } from '@/lib/graphql/generated/schemas' +import type { + GetEpicMenuLinksQuery, + GetEpicMenuLinksQueryVariables, + GetFiltersForOrphansQuery, + GetFiltersForOrphansQueryVariables, + GetOrphansCountQuery, + GetOrphansCountQueryVariables, + GetOrphansQuery, + GetOrphansQueryVariables, +} from '@/lib/graphql/generated/operations' import type { Page } from 'next' -const OrphansPage: Page = () => { - return ( -
- - Orphans - +type Props = { + orphans: GetOrphansQuery + filters: GetFiltersForOrphansQuery + links: string[] +} - -
+const LIMIT = 50 + +const OrphansPage: Page = props => { + const { links } = props + + const [activeTab, setActiveTab] = useState<'open' | 'closed'>('open') + const [selectedAuthors, setSelectedAuthors] = useState([]) + const [selectedAssignees, setSelectedAssignees] = useState([]) + const [selectedRepos, setSelectedRepos] = useState([]) + const [orderByValue, setOrderByValue] = useState(Order_By.Desc) + + const [searchFilter, setSearchFilter] = useState('') + const debouncedSearchFilter = useDebounce(searchFilter) + + const { data, isFetching, fetchNextPage, hasNextPage, isFetchingNextPage } = + useInfiniteQuery( + [ + 'getOrphans', + activeTab, + selectedAssignees, + selectedRepos, + selectedAuthors, + orderByValue, + debouncedSearchFilter, + ], + async ({ pageParam = 0 }) => { + const result = await api( + GET_ORPHANS, + { + where: { + stage: { _eq: activeTab }, + ...(selectedAuthors.length > 0 && { + author: { _in: selectedAuthors }, + }), + ...(selectedAssignees.length > 0 && { + assignee: { _in: selectedAssignees }, + }), + ...(selectedRepos.length > 0 && { + repository: { _in: selectedRepos }, + }), + title: { _ilike: `%${debouncedSearchFilter}%` }, + }, + limit: LIMIT, + offset: pageParam, + orderBy: orderByValue, + } + ) + + return result?.gh_orphans || [] + }, + { + getNextPageParam: (lastPage, pages) => { + if (lastPage.length < LIMIT) { + return undefined + } + + return pages.length * LIMIT + }, + } + ) + + const { data: dataCounter } = useGetOrphansCountQuery({ + where: { + ...(selectedAuthors.length > 0 && { + author: { _in: selectedAuthors }, + }), + ...(selectedAssignees.length > 0 && { + assignee: { _in: selectedAssignees }, + }), + ...(selectedRepos.length > 0 && { + repository: { _in: selectedRepos }, + }), + title: { _ilike: `%${debouncedSearchFilter}%` }, + }, + }) + + const count = { + total: dataCounter?.gh_orphans.length, + closed: dataCounter?.gh_orphans.filter(issue => issue.closed_at).length, + open: dataCounter?.gh_orphans.filter(issue => !issue.closed_at).length, + } + + const orphans = useMemo( + () => data?.pages.flatMap(page => page) || [], + [data?.pages] + ) + + const endOfPageRef = useRef(null) + const entry = useIntersectionObserver(endOfPageRef, { + rootMargin: '800px', + threshold: 0, + }) + const isVisible = !!entry?.isIntersecting + + useEffect(() => { + if (isVisible && !isFetchingNextPage && hasNextPage) { + fetchNextPage() + } + }, [fetchNextPage, hasNextPage, isFetchingNextPage, isVisible]) + + return ( + +
+ + Orphans + + +
+
+ ) } -OrphansPage.getLayout = function getLayout(page) { - return {page} +export async function getServerSideProps() { + const [links, repos, filters, resultIssuesCount] = await Promise.all([ + api(GET_EPIC_LINKS), + api(GET_ORPHANS, { + where: { + stage: { _eq: 'open' }, + }, + limit: LIMIT, + offset: 0, + orderBy: Order_By.Desc, + }), + api( + GET_FILTERS_FOR_ORPHANS + ), + api( + GET_ORPHANS_COUNT, + { + where: { + stage: { _eq: 'open' }, + }, + } + ), + ]) + + return { + props: { + links: + links?.gh_epics + .filter(epic => epic.status === 'In Progress') + .map(epic => epic.epic_name) || [], + repos: repos.gh_orphans || [], + filters, + count: resultIssuesCount, + }, + } } export default OrphansPage diff --git a/apps/website/src/pages/insights/repos.tsx b/apps/website/src/pages/insights/repos.tsx deleted file mode 100644 index 4f164371..00000000 --- a/apps/website/src/pages/insights/repos.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import { Shadow, Text } from '@status-im/components' -import { OpenIcon, UnlockedIcon } from '@status-im/icons' - -import { Link } from '@/components/link' -import { InsightsLayout } from '@/layouts/insights-layout' - -import type { Page } from 'next' - -const repos = [ - { - name: 'status-web', - description: 'a free (libre) open source, mobile OS for Ethereum.', - issues: 10, - stars: 5, - }, - { - name: 'status-mobile', - description: 'a free (libre) open source, mobile OS for Ethereum.', - issues: 10, - stars: 5, - }, - { - name: 'status-desktop', - description: 'a free (libre) open source, mobile OS for Ethereum.', - issues: 10, - stars: 5, - }, - { - name: 'status-go', - description: 'a free (libre) open source, mobile OS for Ethereum.', - issues: 10, - stars: 5, - }, - { - name: 'nim-waku', - description: 'a free (libre) open source, mobile OS for Ethereum.', - issues: 10, - stars: 5, - }, - { - name: 'go-waku', - description: 'a free (libre) open source, mobile OS for Ethereum.', - issues: 10, - stars: 5, - }, - { - name: 'js-waku', - description: 'a free (libre) open source, mobile OS for Ethereum.', - issues: 10, - stars: 5, - }, - { - name: 'nimbus-eth2', - description: 'a free (libre) open source, mobile OS for Ethereum.', - issues: 10, - stars: 5, - }, - { - name: 'help.status.im', - description: 'help.status.im', - issues: 10, - stars: 5, - }, -] - -const ReposPage: Page = () => { - return ( -
-
- - Repos - -
- -
- {repos.map(repo => ( - - -
- - {repo.name} - - - {repo.description} - -
- -
-
-
- -
- - Public - -
-
-
- -
- - 42 issues - -
-
-
- -
- - 32 - -
-
- -
- ))} -
-
- ) -} - -ReposPage.getLayout = function getLayout(page) { - return {page} -} - -export default ReposPage diff --git a/apps/website/src/pages/insights/repos/index.tsx b/apps/website/src/pages/insights/repos/index.tsx new file mode 100644 index 00000000..5e08c6cb --- /dev/null +++ b/apps/website/src/pages/insights/repos/index.tsx @@ -0,0 +1,139 @@ +import { Shadow, Text } from '@status-im/components' +import { OpenIcon, UnlockedIcon } from '@status-im/icons' + +import { Link } from '@/components/link' +import { LoadingSkeleton } from '@/components/repos/loading-skeleton' +import { InsightsLayout } from '@/layouts/insights-layout' +import { GET_EPIC_LINKS, GET_REPOS } from '@/lib/burnup' +import { api } from '@/lib/graphql' +import { useGetRepositoriesQuery } from '@/lib/graphql/generated/hooks' + +import type { + GetEpicMenuLinksQuery, + GetEpicMenuLinksQueryVariables, + GetRepositoriesQuery, + GetRepositoriesQueryVariables, +} from '@/lib/graphql/generated/operations' +import type { Page } from 'next' + +type Props = { + repos: GetRepositoriesQuery + links: string[] +} + +const capitalizeString = (word: string) => + word.charAt(0).toUpperCase() + word.slice(1) + +const ReposPage: Page = props => { + const { data, isLoading } = useGetRepositoriesQuery(undefined, { + initialData: props.repos, + }) + + if (isLoading) { + return + } + + const repos = data?.gh_repositories || [] + + return ( + +
+
+ + Repos + +
+
+ {repos.map(repo => ( + + +
+ + {repo.name} + + + {repo.description} + +
+ +
+
+
+ +
+ + {repo.visibility && capitalizeString(repo.visibility)} + +
+
+
+ +
+ + {repo.open_issues_count} Issues + +
+
+
+ {/* TODO Change the correct star icon when available */} + + + + + + + + + + +
+ + {repo.stargazers_count} Stars + +
+
+ +
+ ))} +
+
+
+ ) +} + +export async function getServerSideProps() { + const result = await api( + GET_REPOS, + undefined + ) + + const links = await api< + GetEpicMenuLinksQuery, + GetEpicMenuLinksQueryVariables + >(GET_EPIC_LINKS) + + return { + props: { + links: + links?.gh_epics + .filter(epic => epic.status === 'In Progress') + .map(epic => epic.epic_name) || [], + repos: result.gh_repositories || [], + }, + } +} + +export default ReposPage diff --git a/yarn.lock b/yarn.lock index 7d73ec7d..7bef8c76 100644 --- a/yarn.lock +++ b/yarn.lock @@ -53,6 +53,36 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@ardatan/relay-compiler@12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" + integrity sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + chalk "^4.0.0" + fb-watchman "^2.0.0" + fbjs "^3.0.0" + glob "^7.1.1" + immutable "~3.7.6" + invariant "^2.2.4" + nullthrows "^1.1.1" + relay-runtime "12.0.0" + signedsource "^1.0.0" + yargs "^15.3.1" + +"@ardatan/sync-fetch@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@ardatan/sync-fetch/-/sync-fetch-0.0.1.tgz#3385d3feedceb60a896518a1db857ec1e945348f" + integrity sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA== + dependencies: + node-fetch "^2.6.1" + "@aw-web-design/x-default-browser@1.4.88": version "1.4.88" resolved "https://registry.yarnpkg.com/@aw-web-design/x-default-browser/-/x-default-browser-1.4.88.tgz#33d869cb2a537cd6d2a8369d4dc8ea4988d4be89" @@ -239,6 +269,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.18.13", "@babel/generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/generator@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.6.tgz#9ab2d46d3cbf631f0e80f72e72874a04c3fc12a9" @@ -268,16 +308,6 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" - integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== - dependencies: - "@babel/types" "^7.22.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -796,6 +826,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== +"@babel/parser@^7.16.8", "@babel/parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" + integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== + "@babel/parser@^7.18.10": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.4.tgz#03c4339d2b8971eb3beca5252bafd9b9f79db3dc" @@ -816,11 +851,6 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== -"@babel/parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -2063,6 +2093,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.16.8", "@babel/traverse@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" + integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + "@babel/traverse@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.6.tgz#a228562d2f46e89258efa4ddd0416942e2fd671d" @@ -2111,22 +2157,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" - integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - debug "^4.1.0" - globals "^11.1.0" - "@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.18.9", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.4.4": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" @@ -2136,6 +2166,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.16.8", "@babel/types@^7.18.13", "@babel/types@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7" @@ -2172,15 +2211,6 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" - integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" @@ -3621,7 +3651,483 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@graphql-typed-document-node/core@^3.1.0": +"@graphql-codegen/add@^3.2.1": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-3.2.3.tgz#f1ecee085987e7c21841edc4b1fd48877c663e1a" + integrity sha512-sQOnWpMko4JLeykwyjFTxnhqjd/3NOG2OyMuvK76Wnnwh8DRrNf2VEs2kmSvLl7MndMlOj7Kh5U154dVcvhmKQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^3.1.1" + tslib "~2.4.0" + +"@graphql-codegen/cli@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-4.0.1.tgz#2bd494d55aaef0dfe86eefe1fa42bff81f5147fe" + integrity sha512-/H4imnGOl3hoPXLKmIiGUnXpmBmeIClSZie/YHDzD5N59cZlGGJlIOOrUlOTDpJx5JNU1MTQcRjyTToOYM5IfA== + dependencies: + "@babel/generator" "^7.18.13" + "@babel/template" "^7.18.10" + "@babel/types" "^7.18.13" + "@graphql-codegen/core" "^4.0.0" + "@graphql-codegen/plugin-helpers" "^5.0.0" + "@graphql-tools/apollo-engine-loader" "^8.0.0" + "@graphql-tools/code-file-loader" "^8.0.0" + "@graphql-tools/git-loader" "^8.0.0" + "@graphql-tools/github-loader" "^8.0.0" + "@graphql-tools/graphql-file-loader" "^8.0.0" + "@graphql-tools/json-file-loader" "^8.0.0" + "@graphql-tools/load" "^8.0.0" + "@graphql-tools/prisma-loader" "^8.0.0" + "@graphql-tools/url-loader" "^8.0.0" + "@graphql-tools/utils" "^10.0.0" + "@parcel/watcher" "^2.1.0" + "@whatwg-node/fetch" "^0.8.0" + chalk "^4.1.0" + cosmiconfig "^8.1.3" + debounce "^1.2.0" + detect-indent "^6.0.0" + graphql-config "^5.0.2" + inquirer "^8.0.0" + is-glob "^4.0.1" + jiti "^1.17.1" + json-to-pretty-yaml "^1.2.2" + listr2 "^4.0.5" + log-symbols "^4.0.0" + micromatch "^4.0.5" + shell-quote "^1.7.3" + string-env-interpolation "^1.0.1" + ts-log "^2.2.3" + tslib "^2.4.0" + yaml "^1.10.0" + yargs "^17.0.0" + +"@graphql-codegen/core@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-4.0.0.tgz#b29c911746a532a675e33720acb4eb2119823e01" + integrity sha512-JAGRn49lEtSsZVxeIlFVIRxts2lWObR+OQo7V2LHDJ7ohYYw3ilv7nJ8pf8P4GTg/w6ptcYdSdVVdkI8kUHB/Q== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.0" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "~2.5.0" + +"@graphql-codegen/import-types-preset@^2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/import-types-preset/-/import-types-preset-2.2.6.tgz#aab292d93f79bffc09bc12a51843c3272b526475" + integrity sha512-Lo2ITOln3UVdyyEPiijj8bVhVg0Ghp/JzHXA2LXxrJVCRbXizQhVC2vjiaWTjMskPt9Zub0yIoce4+RrbsXKcg== + dependencies: + "@graphql-codegen/add" "^3.2.1" + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-codegen/visitor-plugin-common" "2.13.1" + tslib "~2.4.0" + +"@graphql-codegen/plugin-helpers@^2.7.2": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz#6544f739d725441c826a8af6a49519f588ff9bed" + integrity sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg== + dependencies: + "@graphql-tools/utils" "^8.8.0" + change-case-all "1.0.14" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.4.0" + +"@graphql-codegen/plugin-helpers@^3.0.0", "@graphql-codegen/plugin-helpers@^3.1.1": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz#69a2e91178f478ea6849846ade0a59a844d34389" + integrity sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg== + dependencies: + "@graphql-tools/utils" "^9.0.0" + change-case-all "1.0.15" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.4.0" + +"@graphql-codegen/plugin-helpers@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.0.tgz#40c18217454af5cf8317e5f46cf4d38e8cc78ae4" + integrity sha512-suL2ZMkBAU2a4YbBHaZvUPsV1z0q3cW6S96Z/eYYfkRIsJoe2vN+wNZ9Xdzmqx0JLmeeFCBSoBGC0imFyXlkDQ== + dependencies: + "@graphql-tools/utils" "^10.0.0" + change-case-all "1.0.15" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.5.0" + +"@graphql-codegen/schema-ast@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-4.0.0.tgz#5d60996c87b64f81847da8fcb2d8ef50ede89755" + integrity sha512-WIzkJFa9Gz28FITAPILbt+7A8+yzOyd1NxgwFh7ie+EmO9a5zQK6UQ3U/BviirguXCYnn+AR4dXsoDrSrtRA1g== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "~2.5.0" + +"@graphql-codegen/typescript-operations@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.0.1.tgz#930af3e2d2ae8ff06de696291be28fe7046a2fef" + integrity sha512-GpUWWdBVUec/Zqo23aFLBMrXYxN2irypHqDcKjN78JclDPdreasAEPcIpMfqf4MClvpmvDLy4ql+djVAwmkjbw== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.0" + "@graphql-codegen/typescript" "^4.0.1" + "@graphql-codegen/visitor-plugin-common" "4.0.1" + auto-bind "~4.0.0" + tslib "~2.5.0" + +"@graphql-codegen/typescript-react-query@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-react-query/-/typescript-react-query-4.1.0.tgz#42dc8a90472c259f9bbacfdf944899c6e0cebcc9" + integrity sha512-+3Hk+ws6HfCAZl7+5Q4LBkFh3y+2ISuahMYRHIqzqpwNnrthftg8xNx11VH5sabqqjqEmjY3UaP8glP93itPWQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^3.0.0" + "@graphql-codegen/visitor-plugin-common" "2.13.1" + auto-bind "~4.0.0" + change-case-all "1.0.15" + tslib "~2.4.0" + +"@graphql-codegen/typescript@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.1.tgz#7481d68f59bea802dd10e278dce73c8a1552b2a4" + integrity sha512-3YziQ21dCVdnHb+Us1uDb3pA6eG5Chjv0uTK+bt9dXeMlwYBU8MbtzvQTo4qvzWVC1AxSOKj0rgfNu1xCXqJyA== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.0" + "@graphql-codegen/schema-ast" "^4.0.0" + "@graphql-codegen/visitor-plugin-common" "4.0.1" + auto-bind "~4.0.0" + tslib "~2.5.0" + +"@graphql-codegen/visitor-plugin-common@2.13.1": + version "2.13.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.1.tgz#2228660f6692bcdb96b1f6d91a0661624266b76b" + integrity sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-tools/optimize" "^1.3.0" + "@graphql-tools/relay-operation-optimizer" "^6.5.0" + "@graphql-tools/utils" "^8.8.0" + auto-bind "~4.0.0" + change-case-all "1.0.14" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.4.0" + +"@graphql-codegen/visitor-plugin-common@4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-4.0.1.tgz#64e293728b3c186f6767141e41fcdb310e50d367" + integrity sha512-Bi/1z0nHg4QMsAqAJhds+ForyLtk7A3HQOlkrZNm3xEkY7lcBzPtiOTLBtvziwopBsXUxqeSwVjOOFPLS5Yw1Q== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.0" + "@graphql-tools/optimize" "^2.0.0" + "@graphql-tools/relay-operation-optimizer" "^7.0.0" + "@graphql-tools/utils" "^10.0.0" + auto-bind "~4.0.0" + change-case-all "1.0.15" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.5.0" + +"@graphql-tools/apollo-engine-loader@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.0.tgz#ac1f351cbe41508411784f25757f5557b0f27489" + integrity sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg== + dependencies: + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/utils" "^10.0.0" + "@whatwg-node/fetch" "^0.9.0" + tslib "^2.4.0" + +"@graphql-tools/batch-execute@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-9.0.0.tgz#9aba67c235dfa8e28e17d204ccb74998064eaec3" + integrity sha512-lT9/1XmPSYzBcEybXPLsuA6C5E0t8438PVUELABcqdvwHgZ3VOOx29MLBEqhr2oewOlDChH6PXNkfxoOoAuzRg== + dependencies: + "@graphql-tools/utils" "^10.0.0" + dataloader "^2.2.2" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/code-file-loader@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-8.0.1.tgz#86ab699cc8ed76010b2f0401e8a4a149338b759e" + integrity sha512-pmg81lsIXGW3uW+nFSCIG0lFQIxWVbgDjeBkSWlnP8CZsrHTQEkB53DT7t4BHLryoxDS4G4cPxM52yNINDSL8w== + dependencies: + "@graphql-tools/graphql-tag-pluck" "8.0.1" + "@graphql-tools/utils" "^10.0.0" + globby "^11.0.3" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/delegate@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-10.0.0.tgz#c9da70811de8efbf630a74188698941cdc618ccf" + integrity sha512-ZW5/7Q0JqUM+guwn8/cM/1Hz16Zvj6WR6r3gnOwoPO7a9bCbe8QTCk4itT/EO+RiGT8RLUPYaunWR9jxfNqqOA== + dependencies: + "@graphql-tools/batch-execute" "^9.0.0" + "@graphql-tools/executor" "^1.0.0" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + dataloader "^2.2.2" + tslib "^2.5.0" + value-or-promise "^1.0.12" + +"@graphql-tools/executor-graphql-ws@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.0.1.tgz#d0ff56518ae2ff2087f35f91b07a03f137905bc9" + integrity sha512-mcOEYr+p+Mex03cGtQ+QG4ofh83BxLlVAegkBoNIzb06KH3c7FgmlkRysiEaDtr8L4FjKzNo8LVfzgqaYRRylg== + dependencies: + "@graphql-tools/utils" "^10.0.0" + "@repeaterjs/repeater" "3.0.4" + "@types/ws" "^8.0.0" + graphql-ws "5.14.0" + isomorphic-ws "5.0.0" + tslib "^2.4.0" + ws "8.13.0" + +"@graphql-tools/executor-http@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-1.0.0.tgz#3d7f1ce70dcc40432fb92b970bd1ab4dd1c37b12" + integrity sha512-7R9IWRN1Iszyayd4qgguITLLTmRUZ3wSS5umK0xwShB8mFQ5cSsVx6rewPhGIwGEenN6e9ahwcGX9ytuLlw55g== + dependencies: + "@graphql-tools/utils" "^10.0.0" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/fetch" "^0.9.0" + dset "^3.1.2" + extract-files "^11.0.0" + meros "^1.2.1" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/executor-legacy-ws@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.1.tgz#49764812fc93f401cb3f3ef32b2d6db4a9cd8db5" + integrity sha512-PQrTJ+ncHMEQspBARc2lhwiQFfRAX/z/CsOdZTFjIljOHgRWGAA1DAx7pEN0j6PflbLCfZ3NensNq2jCBwF46w== + dependencies: + "@graphql-tools/utils" "^10.0.0" + "@types/ws" "^8.0.0" + isomorphic-ws "5.0.0" + tslib "^2.4.0" + ws "8.13.0" + +"@graphql-tools/executor@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-1.1.0.tgz#bafddb7c56d8250c5eda83437c10664e702109a8" + integrity sha512-+1wmnaUHETSYxiK/ELsT60x584Rw3QKBB7F/7fJ83HKPnLifmE2Dm/K9Eyt6L0Ppekf1jNUbWBpmBGb8P5hAeg== + dependencies: + "@graphql-tools/utils" "^10.0.0" + "@graphql-typed-document-node/core" "3.2.0" + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/git-loader@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-8.0.1.tgz#ca1aed6342d4f636f75aacced48713c5ebdde80d" + integrity sha512-ivNtxD+iEfpPONYKip0kbpZMRdMCNR3HrIui8NCURmUdvBYGaGcbB3VrGMhxwZuzc+ybhs2ralPt1F8Oxq2jLA== + dependencies: + "@graphql-tools/graphql-tag-pluck" "8.0.1" + "@graphql-tools/utils" "^10.0.0" + is-glob "4.0.3" + micromatch "^4.0.4" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/github-loader@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-8.0.0.tgz#683195800618364701cfea9bc6f88674486f053b" + integrity sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA== + dependencies: + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/executor-http" "^1.0.0" + "@graphql-tools/graphql-tag-pluck" "^8.0.0" + "@graphql-tools/utils" "^10.0.0" + "@whatwg-node/fetch" "^0.9.0" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/graphql-file-loader@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.0.tgz#a2026405bce86d974000455647511bf65df4f211" + integrity sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg== + dependencies: + "@graphql-tools/import" "7.0.0" + "@graphql-tools/utils" "^10.0.0" + globby "^11.0.3" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/graphql-tag-pluck@8.0.1", "@graphql-tools/graphql-tag-pluck@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.0.1.tgz#480d804a0fd7576f5ee06460528f1ee2b426f50e" + integrity sha512-4sfBJSoXxVB4rRCCp2GTFhAYsUJgAPSKxSV+E3Voc600mK52JO+KsHCCTnPgCeyJFMNR9l94J6+tqxVKmlqKvw== + dependencies: + "@babel/parser" "^7.16.8" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + +"@graphql-tools/import@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-7.0.0.tgz#a6a91a90a707d5f46bad0fd3fde2f407b548b2be" + integrity sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw== + dependencies: + "@graphql-tools/utils" "^10.0.0" + resolve-from "5.0.0" + tslib "^2.4.0" + +"@graphql-tools/json-file-loader@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-8.0.0.tgz#9b1b62902f766ef3f1c9cd1c192813ea4f48109c" + integrity sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg== + dependencies: + "@graphql-tools/utils" "^10.0.0" + globby "^11.0.3" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/load@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-8.0.0.tgz#62e00f48c39b4085167a096f66ba6c21fb3fc796" + integrity sha512-Cy874bQJH0FP2Az7ELPM49iDzOljQmK1PPH6IuxsWzLSTxwTqd8dXA09dcVZrI7/LsN26heTY2R8q2aiiv0GxQ== + dependencies: + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + p-limit "3.1.0" + tslib "^2.4.0" + +"@graphql-tools/merge@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.0.tgz#b0a3636c82716454bff88e9bb40108b0471db281" + integrity sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q== + dependencies: + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + +"@graphql-tools/optimize@^1.3.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-1.4.0.tgz#20d6a9efa185ef8fc4af4fd409963e0907c6e112" + integrity sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/optimize@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-2.0.0.tgz#7a9779d180824511248a50c5a241eff6e7a2d906" + integrity sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/prisma-loader@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-8.0.1.tgz#0a013c69b04e0779b5be15757173d458cdf94e35" + integrity sha512-bl6e5sAYe35Z6fEbgKXNrqRhXlCJYeWKBkarohgYA338/SD9eEhXtg3Cedj7fut3WyRLoQFpHzfiwxKs7XrgXg== + dependencies: + "@graphql-tools/url-loader" "^8.0.0" + "@graphql-tools/utils" "^10.0.0" + "@types/js-yaml" "^4.0.0" + "@types/json-stable-stringify" "^1.0.32" + "@whatwg-node/fetch" "^0.9.0" + chalk "^4.1.0" + debug "^4.3.1" + dotenv "^16.0.0" + graphql-request "^6.0.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + jose "^4.11.4" + js-yaml "^4.0.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.20" + scuid "^1.1.0" + tslib "^2.4.0" + yaml-ast-parser "^0.0.43" + +"@graphql-tools/relay-operation-optimizer@^6.5.0": + version "6.5.18" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.18.tgz#a1b74a8e0a5d0c795b8a4d19629b654cf66aa5ab" + integrity sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg== + dependencies: + "@ardatan/relay-compiler" "12.0.0" + "@graphql-tools/utils" "^9.2.1" + tslib "^2.4.0" + +"@graphql-tools/relay-operation-optimizer@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.0.tgz#24367666af87bc5a81748de5e8e9b3c523fd4207" + integrity sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw== + dependencies: + "@ardatan/relay-compiler" "12.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + +"@graphql-tools/schema@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.0.tgz#7b5f6b6a59f51c927de8c9069bde4ebbfefc64b3" + integrity sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg== + dependencies: + "@graphql-tools/merge" "^9.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/url-loader@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-8.0.0.tgz#8d952d5ebb7325e587cb914aaebded3dbd078cf6" + integrity sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA== + dependencies: + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/delegate" "^10.0.0" + "@graphql-tools/executor-graphql-ws" "^1.0.0" + "@graphql-tools/executor-http" "^1.0.0" + "@graphql-tools/executor-legacy-ws" "^1.0.0" + "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/wrap" "^10.0.0" + "@types/ws" "^8.0.0" + "@whatwg-node/fetch" "^0.9.0" + isomorphic-ws "^5.0.0" + tslib "^2.4.0" + value-or-promise "^1.0.11" + ws "^8.12.0" + +"@graphql-tools/utils@^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.0.1.tgz#52e6c0ce920b57473823e487184f5017974fe4c4" + integrity sha512-i1FozbDGHgdsFA47V/JvQZ0FE8NAy0Eiz7HGCJO2MkNdZAKNnwei66gOq0JWYVFztwpwbVQ09GkKhq7Kjcq5Cw== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + tslib "^2.4.0" + +"@graphql-tools/utils@^8.8.0": + version "8.13.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.13.1.tgz#b247607e400365c2cd87ff54654d4ad25a7ac491" + integrity sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/utils@^9.0.0", "@graphql-tools/utils@^9.2.1": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.2.1.tgz#1b3df0ef166cfa3eae706e3518b17d5922721c57" + integrity sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + tslib "^2.4.0" + +"@graphql-tools/wrap@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-10.0.0.tgz#573ab111482387d4acf4757d5fb7f9553a504bc1" + integrity sha512-HDOeUUh6UhpiH0WPJUQl44ODt1x5pnMUbOJZ7GjTdGQ7LK0AgVt3ftaAQ9duxLkiAtYJmu5YkULirfZGj4HzDg== + dependencies: + "@graphql-tools/delegate" "^10.0.0" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-typed-document-node/core@3.2.0", "@graphql-typed-document-node/core@^3.1.0", "@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== @@ -4730,6 +5236,43 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.13.0.tgz#0290398b3eaebc6029c348988a78c3b688fe9219" integrity sha512-LMGqfSZkaMQXqewO0o1wvWr/2fQdCh4a3Sqlxka/UsJCe0cfLulh6x2aqnKLnsrSGiCq5rSCwvINd152i0nCqw== +"@parcel/watcher@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.1.0.tgz#5f32969362db4893922c526a842d8af7a8538545" + integrity sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw== + dependencies: + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" + +"@peculiar/asn1-schema@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" + integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.2" + tslib "^2.4.0" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.4.0": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz#078b3e8f598e847b78683dc3ba65feb5029b93a7" + integrity sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.3.2" + tslib "^2.5.0" + webcrypto-core "^1.7.7" + "@pkgr/utils@^2.3.1": version "2.3.1" resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" @@ -5599,6 +6142,11 @@ "@react-spring/shared" "~9.7.2" "@react-spring/types" "~9.7.2" +"@repeaterjs/repeater@3.0.4", "@repeaterjs/repeater@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" + integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== + "@resvg/resvg-wasm@2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@resvg/resvg-wasm/-/resvg-wasm-2.4.1.tgz#88f7a08107bf5ea691b016e55e6db955c85d845c" @@ -8167,6 +8715,11 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/js-yaml@^4.0.0": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" + integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== + "@types/json-schema@^7.0.8": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -8177,6 +8730,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json-stable-stringify@^1.0.32": + version "1.0.34" + resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz#c0fb25e4d957e0ee2e497c1f553d7f8bb668fd75" + integrity sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -8405,6 +8963,13 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/ws@^8.0.0": + version "8.5.5" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -9071,6 +9636,57 @@ loupe "^2.3.6" pretty-format "^27.5.1" +"@whatwg-node/events@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.3.tgz#13a65dd4f5893f55280f766e29ae48074927acad" + integrity sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA== + +"@whatwg-node/events@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.1.1.tgz#0ca718508249419587e130da26d40e29d99b5356" + integrity sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w== + +"@whatwg-node/fetch@^0.8.0": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.8.tgz#48c6ad0c6b7951a73e812f09dd22d75e9fa18cae" + integrity sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg== + dependencies: + "@peculiar/webcrypto" "^1.4.0" + "@whatwg-node/node-fetch" "^0.3.6" + busboy "^1.6.0" + urlpattern-polyfill "^8.0.0" + web-streams-polyfill "^3.2.1" + +"@whatwg-node/fetch@^0.9.0": + version "0.9.7" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.9.7.tgz#86b5cda576581beea300191d5c1f626fc7abfff7" + integrity sha512-heClS5ctTmoEvVbFd+6ztX0SyQduI3/Q+77vtNApDU/+Mwajy6ugxaoDGgSzJUoQ37McSV09kcGCt1Jcc6z9lQ== + dependencies: + "@whatwg-node/node-fetch" "^0.4.6" + urlpattern-polyfill "^9.0.0" + +"@whatwg-node/node-fetch@^0.3.6": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.6.tgz#e28816955f359916e2d830b68a64493124faa6d0" + integrity sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA== + dependencies: + "@whatwg-node/events" "^0.0.3" + busboy "^1.6.0" + fast-querystring "^1.1.1" + fast-url-parser "^1.1.3" + tslib "^2.3.1" + +"@whatwg-node/node-fetch@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.4.6.tgz#97de52731c15420115a31a82b22033bdfc62e17a" + integrity sha512-9oLD57yW0WWfu4ZtEmybBrx1JfkO4TzDpD2zXlp2Ue3UJplifQRap+MbE0PxRlVWtR4KWsIRamhn7J44DkwoyA== + dependencies: + "@whatwg-node/events" "^0.1.0" + busboy "^1.6.0" + fast-querystring "^1.1.1" + fast-url-parser "^1.1.3" + tslib "^2.3.1" + "@xmldom/xmldom@~0.7.0", "@xmldom/xmldom@~0.7.7": version "0.7.10" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.10.tgz#b1f4a7dc63ac35b2750847644d5dacf5b4ead12f" @@ -9168,6 +9784,13 @@ agent-base@6: dependencies: debug "4" +agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -9502,6 +10125,15 @@ asap@~2.0.3, asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +asn1js@^3.0.1, asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + assert@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" @@ -9588,6 +10220,11 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +auto-bind@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== + autoprefixer@^10.4.14: version "10.4.14" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" @@ -10068,6 +10705,13 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + byte-access@^1.0.0, byte-access@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/byte-access/-/byte-access-1.0.1.tgz#84badd99be3671c03f0dd6a039a9c963983724af" @@ -10231,6 +10875,15 @@ caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.300014 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz#9bbd35ee44c2480a1e3a3b9f4496f5066817164a" integrity sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ== +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + ccount@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" @@ -10272,7 +10925,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -10280,6 +10933,56 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-case-all@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.14.tgz#bac04da08ad143278d0ac3dda7eccd39280bfba1" + integrity sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA== + dependencies: + change-case "^4.1.2" + is-lower-case "^2.0.2" + is-upper-case "^2.0.2" + lower-case "^2.0.2" + lower-case-first "^2.0.2" + sponge-case "^1.0.1" + swap-case "^2.0.2" + title-case "^3.0.3" + upper-case "^2.0.2" + upper-case-first "^2.0.2" + +change-case-all@1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.15.tgz#de29393167fc101d646cd76b0ef23e27d09756ad" + integrity sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ== + dependencies: + change-case "^4.1.2" + is-lower-case "^2.0.2" + is-upper-case "^2.0.2" + lower-case "^2.0.2" + lower-case-first "^2.0.2" + sponge-case "^1.0.1" + swap-case "^2.0.2" + title-case "^3.0.3" + upper-case "^2.0.2" + upper-case-first "^2.0.2" + +change-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== + dependencies: + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" + character-entities-html4@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" @@ -10438,6 +11141,11 @@ cli-truncate@^3.1.0: slice-ansi "^5.0.0" string-width "^5.0.0" +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -10566,6 +11274,11 @@ colorette@^1.0.7: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + colorette@^2.0.19: version "2.0.19" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" @@ -10649,6 +11362,11 @@ comment-json@^4.2.3: has-own-prop "^2.0.0" repeat-string "^1.6.1" +common-tags@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -10719,6 +11437,15 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -10818,6 +11545,16 @@ cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + cosmiconfig@^8.1.3: version "8.1.3" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" @@ -11212,6 +11949,11 @@ data-uri-to-buffer@^4.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== +dataloader@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" + integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== + datastore-core@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/datastore-core/-/datastore-core-8.0.1.tgz#13dc8496b1cc756a481fa77031715b8b50b19860" @@ -11242,7 +11984,7 @@ dayjs@^1.8.15: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debounce@^1.2.1: +debounce@^1.2.0, debounce@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== @@ -11471,6 +12213,11 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +dependency-graph@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + dequal@^2.0.0, dequal@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -11647,6 +12394,11 @@ dotenv@^16.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== +dset@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" + integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== + duplexify@^3.5.0, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -12812,7 +13564,7 @@ extendable-error@^0.1.5: resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== -external-editor@^3.1.0: +external-editor@^3.0.3, external-editor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== @@ -12835,6 +13587,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-files@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" + integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ== + extract-zip@^1.6.6: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" @@ -12845,6 +13602,11 @@ extract-zip@^1.6.6: mkdirp "^0.5.4" yauzl "^2.10.0" +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -12892,6 +13654,20 @@ fast-loops@^1.1.3: resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.3.tgz#ce96adb86d07e7bf9b4822ab9c6fac9964981f75" integrity sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== +fast-querystring@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.2.tgz#a6d24937b4fc6f791b4ee31dcb6f53aeafb89f53" + integrity sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg== + dependencies: + fast-decode-uri-component "^1.0.1" + +fast-url-parser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -12976,6 +13752,13 @@ figma-api@^1.11.0: "@types/node" "12.0.2" axios "^0.21.1" +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -13603,7 +14386,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -13672,7 +14455,7 @@ globalyzer@0.1.0: resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== -globby@^11.0.0, globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: +globby@^11.0.0, globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -13727,13 +14510,43 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -graphql-tag@^2.10.1: +graphql-config@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-5.0.2.tgz#7e962f94ccddcc2ee0aa71d75cf4491ec5092bdb" + integrity sha512-7TPxOrlbiG0JplSZYCyxn2XQtqVhXomEjXUmWJVSS5ET1nPhOJSsIb/WTwqWhcYX6G0RlHXSj9PLtGTKmxLNGg== + dependencies: + "@graphql-tools/graphql-file-loader" "^8.0.0" + "@graphql-tools/json-file-loader" "^8.0.0" + "@graphql-tools/load" "^8.0.0" + "@graphql-tools/merge" "^9.0.0" + "@graphql-tools/url-loader" "^8.0.0" + "@graphql-tools/utils" "^10.0.0" + cosmiconfig "^8.1.0" + jiti "^1.18.2" + minimatch "^4.2.3" + string-env-interpolation "^1.0.1" + tslib "^2.4.0" + +graphql-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" + integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== + dependencies: + "@graphql-typed-document-node/core" "^3.2.0" + cross-fetch "^3.1.5" + +graphql-tag@^2.10.1, graphql-tag@^2.11.0: version "2.12.6" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== dependencies: tslib "^2.1.0" +graphql-ws@5.14.0: + version "5.14.0" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.14.0.tgz#766f249f3974fc2c48fae0d1fb20c2c4c79cd591" + integrity sha512-itrUTQZP/TgswR4GSSYuwWUzrE/w5GhbwM2GX3ic2U7aw33jgEsayfIlvaj7/GcIvZgNMzsPTrE5hqPuFUiE5g== + graphql@15.8.0: version "15.8.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" @@ -14050,6 +14863,14 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + hermes-estree@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.8.0.tgz#530be27243ca49f008381c1f3e8b18fb26bf9ec0" @@ -14156,6 +14977,14 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + https-proxy-agent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" @@ -14172,6 +15001,14 @@ https-proxy-agent@^5.0.1: agent-base "6" debug "4" +https-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz#75cb70d04811685667183b31ab158d006750418a" + integrity sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw== + dependencies: + agent-base "^7.0.2" + debug "4" + human-id@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" @@ -14236,6 +15073,11 @@ imagescript@^1.2.16: resolved "https://registry.yarnpkg.com/imagescript/-/imagescript-1.2.16.tgz#2272f535816bdcbaec9da4448de5c89a488756bd" integrity sha512-hhy8OVNymU+cYYj8IwCbdNlXJRoMr4HRd7+efkH32eBVfybVU/5SbzDYf3ZSiiF9ye/ghfBrI/ujec/nwl+fOQ== +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + integrity sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -14252,6 +15094,11 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-from@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" + integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -14303,6 +15150,27 @@ inline-style-prefixer@^6.0.1: css-in-js-utils "^3.1.0" fast-loops "^1.1.3" +inquirer@^8.0.0: + version "8.2.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + interface-datastore@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-7.0.0.tgz#d89ff1faf0ae775e2b64fb0ef0c801470ef5b959" @@ -14405,6 +15273,14 @@ is-absolute-url@^3.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -14646,6 +15522,13 @@ is-generator-function@^1.0.7: dependencies: has-tostringtag "^1.0.0" +is-glob@4.0.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + is-glob@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -14653,13 +15536,6 @@ is-glob@^2.0.0: dependencies: is-extglob "^1.0.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - is-gzip@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" @@ -14702,6 +15578,13 @@ is-loopback-addr@^2.0.1: resolved "https://registry.yarnpkg.com/is-loopback-addr/-/is-loopback-addr-2.0.1.tgz#0b43534f0b16ff899f1f19f322b59c38bd25fa03" integrity sha512-SEsepLbdWFb13B6U0tt6dYcUM0iK/U7XOC43N70Z4Qb88WpNtp+ospyNI9ddpqncs7Z7brAEsVBTQpaqSNntIw== +is-lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-2.0.2.tgz#1c0884d3012c841556243483aa5d522f47396d2a" + integrity sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ== + dependencies: + tslib "^2.0.3" + is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" @@ -14818,6 +15701,13 @@ is-regexp@^3.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-3.1.0.tgz#0235eab9cda5b83f96ac4a263d8c32c9d5ad7422" integrity sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA== +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + is-root@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" @@ -14887,11 +15777,25 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-2.0.2.tgz#f1105ced1fe4de906a5f39553e7d3803fd804649" + integrity sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ== + dependencies: + tslib "^2.0.3" + is-valid-path@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-valid-path/-/is-valid-path-0.1.1.tgz#110f9ff74c37f663e1ec7915eb451f2db93ac9df" @@ -14919,7 +15823,7 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" -is-windows@^1.0.0, is-windows@^1.0.2: +is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -14976,6 +15880,11 @@ isomorphic-unfetch@^3.1.0: node-fetch "^2.6.1" unfetch "^4.2.0" +isomorphic-ws@5.0.0, isomorphic-ws@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" + integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" @@ -15263,7 +16172,7 @@ jimp-compact@0.16.1: resolved "https://registry.yarnpkg.com/jimp-compact/-/jimp-compact-0.16.1.tgz#9582aea06548a2c1e04dd148d7c3ab92075aefa3" integrity sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww== -jiti@^1.17.2: +jiti@^1.17.1, jiti@^1.17.2, jiti@^1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== @@ -15284,6 +16193,11 @@ join-component@^1.1.0: resolved "https://registry.yarnpkg.com/join-component/-/join-component-1.1.0.tgz#b8417b750661a392bee2c2537c68b2a9d4977cd5" integrity sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ== +jose@^4.11.4: + version "4.14.4" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.14.4.tgz#59e09204e2670c3164ee24cbfe7115c6f8bff9ca" + integrity sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g== + js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -15458,6 +16372,21 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json-stable-stringify@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" + integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== + dependencies: + jsonify "^0.0.1" + +json-to-pretty-yaml@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" + integrity sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A== + dependencies: + remedial "^1.0.7" + remove-trailing-spaces "^1.0.6" + json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -15503,6 +16432,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.2.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" @@ -15720,6 +16654,20 @@ lint-staged@^13.2.0: string-argv "^0.3.1" yaml "^2.2.1" +listr2@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" + integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.5" + through "^2.3.8" + wrap-ansi "^7.0.0" + listr2@^5.0.7: version "5.0.8" resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" @@ -15849,7 +16797,7 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== -lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@~4.17.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -15861,7 +16809,7 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -log-symbols@^4.1.0: +log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -15932,6 +16880,13 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.0" +lower-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" + integrity sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg== + dependencies: + tslib "^2.0.3" + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -16000,7 +16955,7 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.2: +map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== @@ -16411,6 +17366,11 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +meros@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/meros/-/meros-1.3.0.tgz#c617d2092739d55286bf618129280f362e6242f2" + integrity sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -17161,6 +18121,13 @@ min-indent@^1.0.0: dependencies: brace-expansion "^1.1.7" +minimatch@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.3.tgz#b4dcece1d674dee104bb0fb833ebb85a78cbbca6" + integrity sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng== + dependencies: + brace-expansion "^1.1.7" + minimatch@^5.0.1: version "5.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff" @@ -17359,6 +18326,11 @@ mutable-proxy@^1.0.0: resolved "https://registry.yarnpkg.com/mutable-proxy/-/mutable-proxy-1.0.0.tgz#3c6e6f9304c2e5a4751bb65b5a66677de9bcf3c8" integrity sha512-4OvNRr1DJpy2QuDUV74m+BWZ//n4gG4bmd21MzDSPqHEidIDWqwyOjcadU1LBMO3vXYGurVKjfBrxrSQIHFu9A== +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + mv@~2: version "2.1.1" resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" @@ -17505,6 +18477,11 @@ nocache@^3.0.1: resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== +node-addon-api@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + node-dir@^0.1.10, node-dir@^0.1.17: version "0.1.17" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" @@ -17524,7 +18501,6 @@ node-fetch-native@^1.0.1: node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" - uid "1b5d62978f2ed07b99444f64f0df39f960a6d34d" resolved "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz#1b5d62978f2ed07b99444f64f0df39f960a6d34d" node-fetch@^2.2.0, node-fetch@^2.6.0: @@ -17548,6 +18524,11 @@ node-forge@^1.1.0, node-forge@^1.2.1, node-forge@^1.3.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +node-gyp-build@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -17588,6 +18569,13 @@ normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -17973,6 +18961,13 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== +p-limit@3.1.0, p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -17980,13 +18975,6 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-limit@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" @@ -18120,6 +19108,15 @@ parse-entities@^4.0.0: is-decimal "^2.0.0" is-hexadecimal "^2.0.0" +parse-filepath@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -18206,6 +19203,14 @@ path-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -18241,6 +19246,18 @@ path-parse@^1.0.5, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== + dependencies: + path-root-regex "^0.1.0" + path-scurry@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.6.1.tgz#dab45f7bb1d3f45a0e271ab258999f4ab7e23132" @@ -18781,6 +19798,11 @@ pumpify@^1.3.3: inherits "^2.0.3" pump "^2.0.0" +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -18802,6 +19824,18 @@ puppeteer-core@^2.1.1: rimraf "^2.6.1" ws "^6.1.0" +pvtsutils@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" + integrity sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ== + dependencies: + tslib "^2.4.0" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + qrcode-terminal@0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz#ffc6c28a2fc0bfb47052b47e23f4f446a5fbdb9e" @@ -19460,6 +20494,15 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== +relay-runtime@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" + integrity sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.0" + invariant "^2.2.4" + remark-breaks@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/remark-breaks/-/remark-breaks-3.0.3.tgz#660e6c995e954e5abdd95bf77df6f1402cb911ef" @@ -19591,11 +20634,26 @@ remark@^14.0.3: remark-stringify "^10.0.0" unified "^10.0.0" +remedial@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" + integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + remove-trailing-slash@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz#be2285a59f39c74d1bce4f825950061915e3780d" integrity sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA== +remove-trailing-spaces@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz#4354d22f3236374702f58ee373168f6d6887ada7" + integrity sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA== + renderkid@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" @@ -19651,6 +20709,11 @@ reselect@^4.0.0: resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -19661,11 +20724,6 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-pkg-maps@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" @@ -19819,6 +20877,11 @@ rollup@^3.18.0: optionalDependencies: fsevents "~2.3.2" +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -19826,6 +20889,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + rxjs@^7.8.0: version "7.8.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" @@ -19941,6 +21011,11 @@ schema-utils@^4.0.0, schema-utils@^4.0.1: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +scuid@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" + integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -20009,6 +21084,15 @@ send@0.18.0, send@^0.18.0: range-parser "~1.2.1" statuses "2.0.1" +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + serialize-error@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-6.0.0.tgz#ccfb887a1dd1c48d6d52d7863b92544331fd752b" @@ -20146,6 +21230,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signedsource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" + integrity sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww== + simple-plist@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" @@ -20241,6 +21330,14 @@ smartwrap@^2.0.2: wcwidth "^1.0.1" yargs "^15.1.0" +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -20390,6 +21487,13 @@ split@^1.0.1: dependencies: through "2" +sponge-case@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sponge-case/-/sponge-case-1.0.1.tgz#260833b86453883d974f84854cdb63aecc5aef4c" + integrity sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA== + dependencies: + tslib "^2.0.3" + sprintf-js@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" @@ -20502,6 +21606,11 @@ stream-transform@^2.1.3: dependencies: mixme "^0.5.1" +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -20512,6 +21621,11 @@ string-argv@^0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== +string-env-interpolation@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz#ad4397ae4ac53fe6c91d1402ad6f6a52862c7152" + integrity sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg== + "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -20825,6 +21939,13 @@ svgo@^3.0.2: csso "^5.0.5" picocolors "^1.0.0" +swap-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-2.0.2.tgz#671aedb3c9c137e2985ef51c51f9e98445bf70d9" + integrity sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw== + dependencies: + tslib "^2.0.3" + synchronous-promise@^2.0.15: version "2.0.16" resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.16.tgz#669b75e86b4295fdcc1bb0498de9ac1af6fd51a9" @@ -21132,7 +22253,7 @@ through2@^2.0.1, through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, through@^2.3.8: +through@2, through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -21184,6 +22305,13 @@ tinyspy@^1.0.2: resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-1.1.1.tgz#0cb91d5157892af38cb2d217f5c7e8507a5bf092" integrity sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g== +title-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" + integrity sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA== + dependencies: + tslib "^2.0.3" + title@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/title/-/title-3.5.3.tgz#b338d701a3d949db6b49b2c86f409f9c2f36cd91" @@ -21300,6 +22428,11 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-log@^2.2.3: + version "2.2.5" + resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.2.5.tgz#aef3252f1143d11047e2cb6f7cfaac7408d96623" + integrity sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA== + ts-pattern@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ts-pattern/-/ts-pattern-4.3.0.tgz#7a995b39342f1b00d1507c2d2f3b90ea16e178a6" @@ -21325,7 +22458,7 @@ tslib@^1.0.0, tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1: +tslib@^2.0.0, tslib@^2.0.1, tslib@~2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== @@ -21340,6 +22473,11 @@ tslib@^2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@^2.3.1, tslib@~2.5.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + tslib@^2.4.1: version "2.5.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" @@ -21602,6 +22740,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -21803,6 +22946,13 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unixify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg== + dependencies: + normalize-path "^2.1.1" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -21847,6 +22997,20 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -21881,6 +23045,16 @@ url-parse@^1.5.9: querystringify "^2.1.1" requires-port "^1.0.0" +urlpattern-polyfill@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz#99f096e35eff8bf4b5a2aa7d58a1523d6ebc7ce5" + integrity sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ== + +urlpattern-polyfill@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz#bc7e386bb12fd7898b58d1509df21d3c29ab3460" + integrity sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g== + use-callback-ref@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" @@ -22033,6 +23207,11 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +value-or-promise@^1.0.11, value-or-promise@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" + integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== + varint@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" @@ -22187,11 +23366,22 @@ web-namespaces@^2.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== -web-streams-polyfill@^3.0.3: +web-streams-polyfill@^3.0.3, web-streams-polyfill@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== +webcrypto-core@^1.7.7: + version "1.7.7" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.7.tgz#06f24b3498463e570fed64d7cab149e5437b162c" + integrity sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/json-schema" "^1.1.12" + asn1js "^3.0.1" + pvtsutils "^1.3.2" + tslib "^2.4.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -22394,6 +23584,11 @@ write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@8.13.0, ws@^8.12.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + ws@8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" @@ -22494,6 +23689,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml-ast-parser@^0.0.43: + version "0.0.43" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" + integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== + yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" @@ -22552,7 +23752,7 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.7.1, yargs@^17.7.2: +yargs@^17.0.0, yargs@^17.7.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==