From 2e3e282aa822841b99b2b608b9988719f7eae9ba Mon Sep 17 00:00:00 2001 From: Oliver Dudgeon <22367286+OliverDudgeon@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:44:58 +0100 Subject: [PATCH] feat(viewers): add SDF file viewer --- components/MolCard/CalculationsTable.tsx | 61 ++ components/MolCard/DepictMolecule.tsx | 65 +++ components/MolCard/MolCard.tsx | 60 ++ components/MolCard/index.ts | 1 + components/ScatterPlot/ScatterPlot.tsx | 197 +++++++ .../ViewFilePopover/FileViewersList.tsx | 4 + .../ViewFilePopover/SDFViewerListItem.tsx | 49 ++ features/SDFViewer.tsx | 170 ++++++ next.config.mjs | 2 +- package.json | 1 + pages/project/file.tsx | 4 +- pages/viewer/sdf.tsx | 64 +++ pnpm-lock.yaml | 536 ++++++++++++------ types/nextjs-routes.d.ts | 3 +- utils/api/fetchHelpers.ts | 4 + utils/api/plaintextViewerSSR.ts | 3 +- utils/app/routes.ts | 3 + 17 files changed, 1038 insertions(+), 189 deletions(-) create mode 100644 components/MolCard/CalculationsTable.tsx create mode 100644 components/MolCard/DepictMolecule.tsx create mode 100644 components/MolCard/MolCard.tsx create mode 100644 components/MolCard/index.ts create mode 100644 components/ScatterPlot/ScatterPlot.tsx create mode 100644 components/ViewFilePopover/SDFViewerListItem.tsx create mode 100644 features/SDFViewer.tsx create mode 100644 pages/viewer/sdf.tsx create mode 100644 utils/api/fetchHelpers.ts diff --git a/components/MolCard/CalculationsTable.tsx b/components/MolCard/CalculationsTable.tsx new file mode 100644 index 000000000..c129edbff --- /dev/null +++ b/components/MolCard/CalculationsTable.tsx @@ -0,0 +1,61 @@ +import { Table, TableBody, TableCell, TableRow, Tooltip, Typography } from "@mui/material"; + +export interface CalculationsTableProps { + properties: { name: string; value: string | undefined }[]; + tableWidth?: number; + calcs?: { [key: string]: string }; + blacklist?: string[]; + fontSize?: number | string; +} + +const CalculationsTable = ({ + calcs, + blacklist = [], + properties, + fontSize, + tableWidth, +}: CalculationsTableProps) => { + return ( + + + {properties + .filter((property) => !blacklist.includes(property.name)) + .map(({ name, value = "" }, index) => { + // TODO: round number-like value to 2 sf + const displayName = calcs?.[name] ?? name; + return ( + + + + {displayName} + + + + + + {value} + + + + + ); + })} + +
+ ); +}; + +export default CalculationsTable; diff --git a/components/MolCard/DepictMolecule.tsx b/components/MolCard/DepictMolecule.tsx new file mode 100644 index 000000000..ab83e68b6 --- /dev/null +++ b/components/MolCard/DepictMolecule.tsx @@ -0,0 +1,65 @@ +import { styled } from "@mui/styles"; + +export interface DepictMoleculeProps { + smiles: string; + width?: number; + height?: number; + margin?: number; + expand?: boolean; + background?: string; + colorScheme?: string; + explicitHOnly?: boolean; + highlightAtoms?: number[]; + highlightColor?: string; + outerGlow?: boolean; + mcs?: string; + mcsColor?: string; + noStereo?: boolean; + alt?: string; + fragnet_server?: string; + depict_route?: string; +} + +export const DepictMolecule = (props: DepictMoleculeProps) => { + const { + smiles, + width, + height, + margin = 0, + expand = true, + noStereo = false, + mcs = "", + mcsColor = "0xFFAAAAAA", + fragnet_server = "https://squonk.informaticsmatters.org", + depict_route = "/fragnet-depict-api/fragnet-depict/moldepict", + } = props; + + const params = { + mol: smiles, + m: String(margin), + expand: String(expand), + mcs: String(mcs), + noStereo: String(noStereo), + mcsColor, + }; + const searchParams = Object.keys(params).map( + (key) => `${key}=${encodeURIComponent(params[key as keyof typeof params])}`, + ); + + return ( + {smiles + ); +}; + +const Image = styled("img")({ + overflow: "hidden", + display: "inline-block", + maxWidth: "100%", + height: "auto", +}); diff --git a/components/MolCard/MolCard.tsx b/components/MolCard/MolCard.tsx new file mode 100644 index 000000000..e68bdfe14 --- /dev/null +++ b/components/MolCard/MolCard.tsx @@ -0,0 +1,60 @@ +import { Children, useState } from "react"; + +import type { CardActionsProps, CardProps } from "@mui/material"; +import { Card, CardActions, CardContent } from "@mui/material"; + +import { DepictMolecule } from "./DepictMolecule"; + +export interface MolCardProps extends CardProps { + smiles: string; + children?: React.ReactNode; + depictNoStereo?: boolean; + depictWidth?: number; + depictHeight?: number; + depictmcs?: string; + bgColor?: string; + actions?: (hover?: boolean) => React.ReactNode; + actionsProps?: CardActionsProps; + onClick?: () => void; +} + +/* Generic card rendering molecule depiction with optional content and actions. */ +export const MolCard = ({ + children, + smiles, + depictNoStereo = false, + depictWidth, + depictHeight, + depictmcs, + bgColor, + actions = () => undefined, + actionsProps, + onClick, + ...cardProps +}: MolCardProps) => { + const [hover, setHover] = useState(false); + + return ( + setHover(true)} + onMouseLeave={() => setHover(false)} + > + + + {Children.only(children)} + + + {actions(hover)} + + + ); +}; diff --git a/components/MolCard/index.ts b/components/MolCard/index.ts new file mode 100644 index 000000000..9cb38f3ee --- /dev/null +++ b/components/MolCard/index.ts @@ -0,0 +1 @@ +export * from "./MolCard"; diff --git a/components/ScatterPlot/ScatterPlot.tsx b/components/ScatterPlot/ScatterPlot.tsx new file mode 100644 index 000000000..75572ec1e --- /dev/null +++ b/components/ScatterPlot/ScatterPlot.tsx @@ -0,0 +1,197 @@ +import type { Dispatch, SetStateAction } from "react"; +import { useState } from "react"; +import type { PlotParams } from "react-plotly.js"; + +import { + Box, + CircularProgress, + MenuItem, + Switch, + TextField, + Tooltip, + Typography, +} from "@mui/material"; +import dynamic from "next/dynamic"; +import type { PlotDatum } from "plotly.js-basic-dist"; + +import type { Molecule } from "../../features/SDFViewer"; + +const Plot = dynamic( + () => import("../../components/viz/Plot").then((mod) => mod.Plot), + { + ssr: false, // Plotly only works when browser APIs are in scope + loading: () => , + }, +); + +// Utils + +export const isNumber = (x: unknown): x is number => typeof x === "number"; + +const getPropArrayFromMolecules = (molecules: Molecule[], prop: string | null) => { + if (prop === "id") { + return molecules.map((molecule) => molecule.id); + } + return molecules.map((molecule) => (prop ? molecule.properties[prop] ?? null : null)); +}; + +type AxisSeries = ReturnType; + +const scaleToSize = (sizeaxis: AxisSeries) => { + const sx = sizeaxis + .filter((value): value is string => value !== null) + .map((value) => Number.parseFloat(value)); + const min = Math.min(...sx); + const max = Math.max(...sx); + + const scaledSizes = sx.map((v) => (45 * (v - min)) / max + 5); + + if (min >= max) { + return { sizes: 10 }; + } + + return { sizes: scaledSizes, min, max }; +}; + +const validateColours = (colouraxis: AxisSeries) => { + const cx = colouraxis + .filter((value): value is string => value !== null) + .map((value) => Number.parseFloat(value)); + + const min = Math.min(...cx); + const max = Math.max(...cx); + + if (min >= max) { + return { colours: 1 }; + } + + return { colours: colouraxis, min, max }; +}; + +export interface ScatterPlotProps { + molecules: Molecule[]; + properties: string[]; + selectPoints: (ids: string[]) => void; + width: number; +} + +export const ScatterPlot = ({ molecules, properties, selectPoints, width }: ScatterPlotProps) => { + // const selectedPoints = selection.map((id) => molecules.findIndex((m) => m.id === id)); + + const [showColourBar, setShowColourBar] = useState(true); + + const [xprop, setXprop] = useState(properties[0]); + const [yprop, setYprop] = useState(properties[1]); + const [cprop, setCprop] = useState(properties[2]); + const [sprop, setSprop] = useState(properties[3]); + + const xaxis = getPropArrayFromMolecules(molecules, xprop); + const yaxis = getPropArrayFromMolecules(molecules, yprop); + + const colouraxis = getPropArrayFromMolecules(molecules, cprop); + const sizeaxis = getPropArrayFromMolecules(molecules, sprop); + + const { sizes, ...sizeExtent } = scaleToSize(sizeaxis); + const { colours } = validateColours(colouraxis); + + return ( + <> + m.id), // Add custom data for use in selection + // selectedpoints: selectedPoints.length ? selectedPoints : undefined, // null or undefined? + type: "scatter", + mode: "markers", + marker: { + color: colours, + size: sizes, + colorscale: "Bluered", + colorbar: showColourBar ? {} : undefined, + }, + }, + ]} + layout={{ + width, + height: width, + margin: { t: 10, r: 10, b: 50, l: 50 }, + dragmode: "select", + selectionrevision: 1, + hovermode: "closest", + xaxis: { title: xprop }, + yaxis: { title: yprop }, + }} + onDeselect={() => selectPoints([])} + onSelected={(event) => { + // @types is wrong here, we need `?.` as points can be undefined (double click event) + const points = event.points as PlotDatum[] | undefined; + points?.length && selectPoints(points.map((p) => p.customdata) as string[]); + }} + /> + +
+ + x-axis + + +
+
+ + y-axis + + +
+
+ + colour-axis + + + + setShowColourBar(!showColourBar)} /> + + {/*
+ ({colourExtent.min !== undefined && `${colourExtent.min}–${colourExtent.max}`}) +
*/} +
+
+ + size-axis + + +
+ ({sizeExtent.min !== undefined && `${sizeExtent.min}–${sizeExtent.max}`}) +
+
+
+ + ); +}; + +interface AxisSelectorProps { + properties: string[]; + prop: string; + onPropChange: Dispatch>; +} + +const AxisSelector = ({ properties, prop = "", onPropChange }: AxisSelectorProps) => { + return ( + onPropChange(event.target.value)}> + {properties.map((property) => ( + + {property} + + ))} + + ); +}; diff --git a/components/ViewFilePopover/FileViewersList.tsx b/components/ViewFilePopover/FileViewersList.tsx index dde1ea6d4..1fa8ff400 100644 --- a/components/ViewFilePopover/FileViewersList.tsx +++ b/components/ViewFilePopover/FileViewersList.tsx @@ -3,6 +3,7 @@ import { List } from "@mui/material"; import { useCurrentProjectId } from "../../hooks/projectHooks"; import { BrowserViewerListItem } from "./BrowserViewerListItem"; import { FilePlainTextViewerListItem } from "./FilePlainTextViewerListItem"; +import { SDFViewerListItem } from "./SDFViewerListItem"; export interface FileViewersListProps { fileName: string; @@ -24,6 +25,9 @@ export const FileViewersList = ({ fileName, path, onClick }: FileViewersListProp onClick={onClick} /> )} + {(fileName.endsWith(".sdf") || fileName.endsWith(".sdf.gz")) && ( + + )} ); }; diff --git a/components/ViewFilePopover/SDFViewerListItem.tsx b/components/ViewFilePopover/SDFViewerListItem.tsx new file mode 100644 index 000000000..80f8c0439 --- /dev/null +++ b/components/ViewFilePopover/SDFViewerListItem.tsx @@ -0,0 +1,49 @@ +import { Description as DescriptionIcon } from "@mui/icons-material"; +import { ListItemButton, ListItemIcon, ListItemText } from "@mui/material"; +import A from "next/link"; +import { useRouter } from "next/router"; + +import { useProjectBreadcrumbs } from "../../hooks/projectPathHooks"; + +export interface SDFViewerListItemProps { + fileName: string; + path?: string; + onClick: () => void; +} + +export const SDFViewerListItem = ({ fileName, path, onClick }: SDFViewerListItemProps) => { + const router = useRouter(); + + const breadcrumbs = useProjectBreadcrumbs(); + path === undefined && (path = breadcrumbs.join("/")); + + return ( + + onClick()} + > + + + + + + + ); +}; diff --git a/features/SDFViewer.tsx b/features/SDFViewer.tsx new file mode 100644 index 000000000..62e305d82 --- /dev/null +++ b/features/SDFViewer.tsx @@ -0,0 +1,170 @@ +import { useEffect, useMemo, useState, useTransition } from "react"; + +import type { SDFRecord } from "@squonk/sdf-parser"; +import { createSDFTransformer } from "@squonk/sdf-parser"; + +import { Box, LinearProgress, Typography } from "@mui/material"; +import { nanoid } from "nanoid"; + +import { MolCard } from "../components/MolCard"; +import CalculationsTable from "../components/MolCard/CalculationsTable"; +import { ScatterPlot } from "../components/ScatterPlot/ScatterPlot"; +import { isResponseJson } from "../utils/api/fetchHelpers"; +import { API_ROUTES } from "../utils/app/routes"; + +const getCards = (molecules: Must[]) => { + return molecules.slice(0, 50).map((molecule) => { + const smiles = molecule.molFile.split(/\r?\n/)[0]; + const properties = Object.entries(molecule.properties).map((property) => ({ + name: property[0], + value: property[1], + })); + return ( + + { + acc[key] = key; + return acc; + }, {} as Record)} + fontSize="0.7rem" + properties={properties} + /> + + ); + }); +}; + +const getPropArrayFromRecords = (molecules: Molecule[] | SDFRecord[]): string[] => { + return molecules.reduce((properties, molecule) => { + Object.keys(molecule.properties).forEach((key) => { + if (!properties.includes(key)) { + properties.push(key); + } + }); + return properties; + }, []); +}; + +const useSDFRecords = (projectId: string, path: string, fileName: string) => { + const [records, setRecords] = useState([]); + const [isFetching, setIsFetching] = useState(false); + const [isPending, startTransition] = useTransition(); + const [error, setError] = useState(); + + useEffect(() => { + const compressed = fileName.endsWith(".gz"); + const fetchFile = async () => { + setIsFetching(true); + + let response: Response; + + try { + response = await fetch(API_ROUTES.projectFile(projectId, path, fileName, "/api/dm-api")); + } catch { + throw new Error("Unable to fetch file due to a network error. Try again."); + } + + if (response.ok) { + if (response.body !== null) { + let stream: ReadableStream = response.body; + if (compressed) { + stream = response.body.pipeThrough(new DecompressionStream("gzip")); + } + await stream + .pipeThrough(new TextDecoderStream()) + .pipeThrough(createSDFTransformer()) + .pipeTo( + new WritableStream({ + write(chunk) { + startTransition(() => { + setRecords((prev) => [...prev, chunk]); + }); + }, + }), + ); + } else { + throw new Error("No stream from response"); + } + + setIsFetching(false); + } else { + const isJson = isResponseJson(response); + const data = isJson ? await response.json() : null; + const error = (data && data.message) || response.status; + throw new Error(error); + } + }; + + fetchFile().catch((err) => { + setError(err.message); + }); + }, [fileName, path, projectId]); + + return { records, isFetching, isPending, error }; +}; + +export interface Molecule extends SDFRecord { + id: string; +} + +export type Must = { + [P in keyof T]-?: NonNullable; +}; + +export const recordsToMolecules = (records: SDFRecord[]): Must[] => { + return records + .filter((record): record is Must => !!record.molFile) + .map((record) => ({ + id: nanoid(), + ...record, + })); +}; + +export interface SDFViewerProps { + project: string; + path: string; + file: string; +} + +export const SDFViewer = ({ project, path, file }: SDFViewerProps) => { + const { records, isPending, isFetching } = useSDFRecords(project, path, file); + + const molecules = useMemo(() => recordsToMolecules(records), [records]); + const properties = useMemo(() => getPropArrayFromRecords(records), [records]); + + const [selection, setSelection] = useState([]); + + if (isPending || isFetching) { + return ( + <> + Loading and parsing data + + + ); + } + + return ( + theme.spacing(2), + alignItems: "start", + }} + > + + setSelection(points)} + width={600} + /> + + {getCards( + selection + .map((id) => molecules.find((molecule) => molecule.id === id)) + .filter((molecule): molecule is Must => !!molecule), + )} + + ); +}; diff --git a/next.config.mjs b/next.config.mjs index 52fc6d873..7fb84ae2f 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -31,7 +31,7 @@ let nextConfig = { // reactStrictMode: true, // TODO: Blocked by @rjsf Form using UNSAFE_componentWillReceiveProps pageExtensions: ["js", "ts", "jsx", "tsx", "mdx"], basePath: process.env.NEXT_PUBLIC_BASE_PATH || undefined, - transpilePackages: process.env.MONOREPO ? ["@squonk/mui-theme"] : [], + transpilePackages: process.env.MONOREPO ? ["@squonk/mui-theme", "@squonk/sdf-parser"] : [], modularizeImports: { "@mui/icons-material": { transform: "@mui/icons-material/{{member}}" }, }, diff --git a/package.json b/package.json index 563f5f8b3..1c109dbb1 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "@squonk/account-server-client": "2.0.6", "@squonk/data-manager-client": "1.1.10", "@squonk/mui-theme": "3.0.2", + "@squonk/sdf-parser": "1.0.4", "@tanstack/match-sorter-utils": "8.8.4", "@tanstack/react-query": "4.32.0", "@tanstack/react-query-devtools": "4.32.0", diff --git a/pages/project/file.tsx b/pages/project/file.tsx index 6c9d1b895..8a6e9aeeb 100644 --- a/pages/project/file.tsx +++ b/pages/project/file.tsx @@ -11,7 +11,7 @@ import type { NotSuccessful, Successful } from "../../utils/api/plaintextViewerS import { plaintextViewerSSR } from "../../utils/api/plaintextViewerSSR"; import { createErrorProps } from "../../utils/api/serverSidePropsError"; import { pathFromQuery } from "../../utils/app/paths"; -import { API_ROUTES } from "../../utils/app/routes"; +import { projectFileURL } from "../../utils/app/routes"; import { getFullReturnTo } from "../../utils/next/ssr"; export type FileProps = Successful | NotSuccessful; @@ -38,7 +38,7 @@ export const getServerSideProps: GetServerSideProps = async (ctx) => compressed = true; } - const url = process.env.DATA_MANAGER_API_SERVER + API_ROUTES.projectFile(project, path, file); + const url = projectFileURL(project, path, file); return await plaintextViewerSSR(req, res, { url, compressed }); }, diff --git a/pages/viewer/sdf.tsx b/pages/viewer/sdf.tsx new file mode 100644 index 000000000..468ad8bf6 --- /dev/null +++ b/pages/viewer/sdf.tsx @@ -0,0 +1,64 @@ +import { withPageAuthRequired as withPageAuthRequiredCSR } from "@auth0/nextjs-auth0/client"; +import { Container, Typography } from "@mui/material"; +import Head from "next/head"; +import { useRouter } from "next/router"; + +import { RoleRequired } from "../../components/auth/RoleRequired"; +import { CenterLoader } from "../../components/CenterLoader"; +import { AS_ROLES, DM_ROLES } from "../../constants/auth"; +import type { SDFViewerProps } from "../../features/SDFViewer"; +import { SDFViewer } from "../../features/SDFViewer"; +import Layout from "../../layouts/Layout"; + +const SDF = () => { + const { query } = useRouter(); + + const { project, path, file } = query; + + return ( + <> + + Squonk | SDF Viewer + + + + + + {typeof project !== "string" || + typeof path !== "string" || + typeof file !== "string" ? ( + + ) : ( + + )} + + + + + + ); +}; + +const SDFView = ({ project, path, file }: SDFViewerProps) => { + // path and file to display + const filePath = path === "" ? file : path + "/" + file; + + // normalise path for request + if (!path.startsWith("/")) { + path = "/" + path; + } + + return ( + <> + + Squonk | {filePath} + + + {filePath} + + + + ); +}; + +export default withPageAuthRequiredCSR(SDF); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e806231aa..02b76fea8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,6 +25,7 @@ specifiers: '@squonk/data-manager-client': 1.1.10 '@squonk/eslint-config': 0.5.0 '@squonk/mui-theme': 3.0.2 + '@squonk/sdf-parser': 1.0.4 '@tanstack/match-sorter-utils': 8.8.4 '@tanstack/react-query': 4.32.0 '@tanstack/react-query-devtools': 4.32.0 @@ -97,6 +98,7 @@ dependencies: '@squonk/account-server-client': 2.0.6_2ayegm275zmfehdiuggn4nwj24 '@squonk/data-manager-client': 1.1.10_2ayegm275zmfehdiuggn4nwj24 '@squonk/mui-theme': 3.0.2_@mui+material@5.14.2 + '@squonk/sdf-parser': 1.0.4 '@tanstack/match-sorter-utils': 8.8.4 '@tanstack/react-query': 4.32.0_biqbaboplfbrettd7655fr4n2y '@tanstack/react-query-devtools': 4.32.0_xzqwv52z3lkencxda3hsqynkyy @@ -1035,8 +1037,8 @@ packages: rollup: 2.78.0 dev: false - /@rushstack/eslint-patch/1.3.2: - resolution: {integrity: sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==} + /@rushstack/eslint-patch/1.4.0: + resolution: {integrity: sha512-cEjvTPU32OM9lUFegJagO0mRnIn+rbqrG89vV8/xLnLFX0DoR0r1oy5IlTga71Q7uT3Qus7qm7wgeiMT/+Irlg==} dev: true /@sentry-internal/tracing/7.69.0: @@ -1230,15 +1232,15 @@ packages: eslint: '>=8' typescript: '>=4.7' dependencies: - '@rushstack/eslint-patch': 1.3.2 - '@types/node': 16.18.38 + '@rushstack/eslint-patch': 1.4.0 + '@types/node': 16.18.52 '@typescript-eslint/eslint-plugin': 5.62.0_pv3pg3japumrjsd4wswxrcr33u '@typescript-eslint/parser': 5.62.0_w2g2uv42be7wag4oipwkfv43p4 eslint: 8.48.0 - eslint-config-prettier: 8.8.0_eslint@8.48.0 - eslint-plugin-import: 2.27.5_ean2qamlavtp6bo3zeco4caumq - eslint-plugin-prettier: 4.2.1_dc4mrvje5to4473kpnk3n6hx24 - eslint-plugin-react: 7.32.2_eslint@8.48.0 + eslint-config-prettier: 8.10.0_eslint@8.48.0 + eslint-plugin-import: 2.28.1_ean2qamlavtp6bo3zeco4caumq + eslint-plugin-prettier: 4.2.1_b7j5i5eung22avfvwixh6yzuzu + eslint-plugin-react: 7.33.2_eslint@8.48.0 eslint-plugin-react-hooks: 4.6.0_eslint@8.48.0 eslint-plugin-simple-import-sort: 8.0.0_eslint@8.48.0 eslint-plugin-unused-imports: 2.0.0_m7ntmvvsl23lhh7l7avroviwwe @@ -1258,6 +1260,10 @@ packages: '@mui/material': 5.14.2_mcyaowhjtk6juxjmabqaayfcxi dev: false + /@squonk/sdf-parser/1.0.4: + resolution: {integrity: sha512-sNtUojjkqQsT7BnwecP9Y5m0tSXO3okaJfOFi8z+CJFSKpk8vAcQBpgRhOcUESOybRj5Vw7f4oV5D6q+lIgJzA==} + dev: false + /@swc/helpers/0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: @@ -1378,8 +1384,8 @@ packages: '@types/node': 18.17.17 dev: false - /@types/json-schema/7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + /@types/json-schema/7.0.13: + resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} dev: true /@types/json5/0.0.29: @@ -1414,8 +1420,8 @@ packages: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: false - /@types/node/16.18.38: - resolution: {integrity: sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==} + /@types/node/16.18.52: + resolution: {integrity: sha512-sm2aph6cRSsTMFYFgI+RpPLunXO9ClJkpizUVdT7KmGeyfQ14xnjTMT/f3MHcfKqevXqGT6BgVFzW8wcEoDUtA==} dev: true /@types/node/18.17.17: @@ -1485,8 +1491,8 @@ packages: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} dev: false - /@types/semver/7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + /@types/semver/7.5.2: + resolution: {integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==} dev: true /@types/unist/2.0.6: @@ -1602,8 +1608,8 @@ packages: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.2.0_eslint@8.48.0 - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 + '@types/json-schema': 7.0.13 + '@types/semver': 7.5.2 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0_typescript@5.2.2 @@ -1737,14 +1743,14 @@ packages: is-array-buffer: 3.0.2 dev: true - /array-includes/3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + /array-includes/3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.3 - get-intrinsic: 1.2.0 + define-properties: 1.2.1 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 is-string: 1.0.7 dev: true @@ -1753,34 +1759,58 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.flat/1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + /array.prototype.findlastindex/1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.3 + define-properties: 1.2.1 + es-abstract: 1.22.2 es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 dev: true - /array.prototype.flatmap/1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + /array.prototype.flat/1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.3 + define-properties: 1.2.1 + es-abstract: 1.22.2 es-shim-unscopables: 1.0.0 dev: true - /array.prototype.tosorted/1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + /array.prototype.flatmap/1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.3 + define-properties: 1.2.1 + es-abstract: 1.22.2 es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.0 + dev: true + + /array.prototype.tosorted/1.1.2: + resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: true + + /arraybuffer.prototype.slice/1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 dev: true /asap/1.0.0: @@ -1810,6 +1840,12 @@ packages: hasBin: true dev: false + /asynciterator.prototype/1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false @@ -1843,7 +1879,7 @@ packages: dependencies: '@babel/runtime': 7.22.6 cosmiconfig: 7.0.1 - resolve: 1.22.1 + resolve: 1.22.6 dev: false /bail/2.0.2: @@ -1910,7 +1946,7 @@ packages: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -2288,20 +2324,21 @@ packages: engines: {node: '>=0.10.0'} dev: false - /define-properties/1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + /define-data-property/1.1.0: + resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} engines: {node: '>= 0.4'} dependencies: + get-intrinsic: 1.2.1 + gopd: 1.0.1 has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - /define-properties/1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + /define-properties/1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: + define-data-property: 1.1.0 has-property-descriptors: 1.0.0 object-keys: 1.1.1 - dev: true /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} @@ -2425,16 +2462,17 @@ packages: is-arrayish: 0.2.1 dev: false - /es-abstract/1.21.3: - resolution: {integrity: sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==} + /es-abstract/1.22.2: + resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 call-bind: 1.0.2 es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 + function.prototype.name: 1.1.6 get-intrinsic: 1.2.1 get-symbol-description: 1.0.0 globalthis: 1.0.3 @@ -2450,20 +2488,42 @@ packages: is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 - is-typed-array: 1.1.10 + is-typed-array: 1.1.12 is-weakref: 1.0.2 object-inspect: 1.12.3 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 typed-array-byte-offset: 1.0.0 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.10 + which-typed-array: 1.1.11 + dev: true + + /es-iterator-helpers/1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + es-set-tostringtag: 2.0.1 + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.2 + safe-array-concat: 1.0.1 dev: true /es-set-tostringtag/2.0.1: @@ -2503,8 +2563,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-prettier/8.8.0_eslint@8.48.0: - resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} + /eslint-config-prettier/8.10.0_eslint@8.48.0: + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -2512,17 +2572,17 @@ packages: eslint: 8.48.0 dev: true - /eslint-import-resolver-node/0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + /eslint-import-resolver-node/0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 - is-core-module: 2.11.0 - resolve: 1.22.1 + is-core-module: 2.13.0 + resolve: 1.22.6 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils/2.8.0_7kwk4726s7ymcw2fyzp2x64fdi: + /eslint-module-utils/2.8.0_n4v6wwusattt7fppostwrfgz5a: resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -2546,13 +2606,13 @@ packages: '@typescript-eslint/parser': 5.62.0_w2g2uv42be7wag4oipwkfv43p4 debug: 3.2.7 eslint: 8.48.0 - eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import/2.27.5_ean2qamlavtp6bo3zeco4caumq: - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + /eslint-plugin-import/2.28.1_ean2qamlavtp6bo3zeco4caumq: + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2562,20 +2622,22 @@ packages: optional: true dependencies: '@typescript-eslint/parser': 5.62.0_w2g2uv42be7wag4oipwkfv43p4 - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.48.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0_7kwk4726s7ymcw2fyzp2x64fdi + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0_n4v6wwusattt7fppostwrfgz5a has: 1.0.3 - is-core-module: 2.11.0 + is-core-module: 2.13.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.1 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: @@ -2584,7 +2646,7 @@ packages: - supports-color dev: true - /eslint-plugin-prettier/4.2.1_dc4mrvje5to4473kpnk3n6hx24: + /eslint-plugin-prettier/4.2.1_b7j5i5eung22avfvwixh6yzuzu: resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2596,7 +2658,7 @@ packages: optional: true dependencies: eslint: 8.48.0 - eslint-config-prettier: 8.8.0_eslint@8.48.0 + eslint-config-prettier: 8.10.0_eslint@8.48.0 prettier: 2.8.8 prettier-linter-helpers: 1.0.0 dev: true @@ -2610,28 +2672,29 @@ packages: eslint: 8.48.0 dev: true - /eslint-plugin-react/7.32.2_eslint@8.48.0: - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + /eslint-plugin-react/7.33.2_eslint@8.48.0: + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 + es-iterator-helpers: 1.0.15 eslint: 8.48.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.4 + jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 prop-types: 15.8.1 resolve: 2.0.0-next.4 semver: 6.3.1 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.10 dev: true /eslint-plugin-simple-import-sort/8.0.0_eslint@8.48.0: @@ -2843,8 +2906,8 @@ packages: resolution: {integrity: sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==} dev: false - /fast-glob/3.3.0: - resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + /fast-glob/3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3077,13 +3140,13 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /function.prototype.name/1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + /function.prototype.name/1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.3 + define-properties: 1.2.1 + es-abstract: 1.22.2 functions-have-names: 1.2.3 dev: true @@ -3096,13 +3159,6 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: false - /get-intrinsic/1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - /get-intrinsic/1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: @@ -3110,7 +3166,6 @@ packages: has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 - dev: true /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} @@ -3190,7 +3245,7 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 dev: true /globby/11.1.0: @@ -3199,7 +3254,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.0 + fast-glob: 3.3.1 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -3214,7 +3269,7 @@ packages: /gopd/1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 /graceful-fs/4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3251,12 +3306,11 @@ packages: /has-property-descriptors/1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 /has-proto/1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} - dev: true /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} @@ -3440,7 +3494,7 @@ packages: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 has: 1.0.3 side-channel: 1.0.4 dev: true @@ -3484,7 +3538,7 @@ packages: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 - is-typed-array: 1.1.10 + is-typed-array: 1.1.12 dev: true /is-arrayish/0.2.1: @@ -3495,6 +3549,13 @@ packages: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: false + /is-async-function/2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -3525,8 +3586,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - /is-core-module/2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + /is-core-module/2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: has: 1.0.3 @@ -3549,6 +3610,12 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finalizationregistry/1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.2 + dev: true + /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -3563,7 +3630,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: false /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -3583,12 +3649,16 @@ packages: resolution: {integrity: sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==} dev: false + /is-map/2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + /is-nan/1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.1 dev: false /is-negative-zero/2.0.2: @@ -3637,6 +3707,10 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-set/2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + /is-shared-array-buffer/1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: @@ -3662,15 +3736,15 @@ packages: has-symbols: 1.0.3 dev: true - /is-typed-array/1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + /is-typed-array/1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 + which-typed-array: 1.1.11 + + /is-weakmap/2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true /is-weakref/1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} @@ -3678,6 +3752,13 @@ packages: call-bind: 1.0.2 dev: true + /is-weakset/2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + /is-what/4.1.8: resolution: {integrity: sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==} engines: {node: '>=12.13'} @@ -3691,9 +3772,23 @@ packages: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: false + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /iterator.prototype/1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 + dev: true + /joi/17.8.4: resolution: {integrity: sha512-jjdRHb5WtL+KgSHvOULQEPPv4kcl+ixd1ybOFQq3rWLgEEqc03QMmilodL0GVJE14U/SQDXkUhQUSZANGDH/AA==} dependencies: @@ -3850,14 +3945,14 @@ packages: tiny-warning: 1.0.3 dev: false - /jsx-ast-utils/3.3.4: - resolution: {integrity: sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==} + /jsx-ast-utils/3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 object.assign: 4.1.4 - object.values: 1.1.6 + object.values: 1.1.7 dev: true /just-compare/2.3.0: @@ -3960,7 +4055,7 @@ packages: dev: true /lie/3.1.1: - resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + resolution: {integrity: sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=} dependencies: immediate: 3.0.6 dev: false @@ -4964,7 +5059,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.1 dev: false /object-keys/0.4.0: @@ -4980,43 +5075,52 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true - /object.entries/1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + /object.entries/1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.3 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true - /object.fromentries/2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + /object.fromentries/2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.3 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true - /object.hasown/1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + /object.groupby/1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: - define-properties: 1.1.4 - es-abstract: 1.21.3 + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 dev: true - /object.values/1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + /object.hasown/1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.22.2 + dev: true + + /object.values/1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.3 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true /oidc-token-hash/5.0.1: @@ -5562,17 +5666,29 @@ packages: '@babel/runtime': 7.22.6 dev: false + /reflect.getprototypeof/1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + /regenerator-runtime/0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: false - /regexp.prototype.flags/1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + /regexp.prototype.flags/1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 + define-properties: 1.2.1 + set-function-name: 2.0.1 dev: true /remark-gfm/1.0.0: @@ -5669,11 +5785,11 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - /resolve/1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + /resolve/1.22.6: + resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -5681,7 +5797,7 @@ packages: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -5737,6 +5853,16 @@ packages: mri: 1.2.0 dev: false + /safe-array-concat/1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: false @@ -5781,6 +5907,15 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false + /set-function-name/2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.0 + dev: true + /setimmediate/1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: false @@ -5835,7 +5970,7 @@ packages: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 object-inspect: 1.12.3 dev: true @@ -5971,42 +6106,43 @@ packages: strip-ansi: 7.0.1 dev: true - /string.prototype.matchall/4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + /string.prototype.matchall/4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.3 - get-intrinsic: 1.2.0 + define-properties: 1.2.1 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 has-symbols: 1.0.3 internal-slot: 1.0.5 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 side-channel: 1.0.4 dev: true - /string.prototype.trim/1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + /string.prototype.trim/1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.3 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true - /string.prototype.trimend/1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + /string.prototype.trimend/1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.3 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true - /string.prototype.trimstart/1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + /string.prototype.trimstart/1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.3 + define-properties: 1.2.1 + es-abstract: 1.22.2 dev: true /string_decoder/0.10.31: @@ -6276,6 +6412,25 @@ packages: engines: {node: '>=12.20'} dev: false + /typed-array-buffer/1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length/1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + /typed-array-byte-offset/1.0.0: resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} engines: {node: '>= 0.4'} @@ -6284,7 +6439,7 @@ packages: call-bind: 1.0.2 for-each: 0.3.3 has-proto: 1.0.1 - is-typed-array: 1.1.10 + is-typed-array: 1.1.12 dev: true /typed-array-length/1.0.4: @@ -6292,7 +6447,7 @@ packages: dependencies: call-bind: 1.0.2 for-each: 0.3.3 - is-typed-array: 1.1.10 + is-typed-array: 1.1.12 dev: true /typescript-compare/0.0.2: @@ -6488,8 +6643,8 @@ packages: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 - is-typed-array: 1.1.10 - which-typed-array: 1.1.9 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 dev: false /uvu/0.5.3: @@ -6610,24 +6765,39 @@ packages: is-symbol: 1.0.4 dev: true - /which-module/2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} - dev: false - - /which-typed-array/1.1.10: - resolution: {integrity: sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==} + /which-builtin-type/1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 + function.prototype.name: 1.1.6 has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.11 dev: true - /which-typed-array/1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + /which-collection/1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-module/2.0.0: + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + dev: false + + /which-typed-array/1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 @@ -6635,8 +6805,6 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 - dev: false /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} diff --git a/types/nextjs-routes.d.ts b/types/nextjs-routes.d.ts index da315d3fb..087b6c232 100644 --- a/types/nextjs-routes.d.ts +++ b/types/nextjs-routes.d.ts @@ -42,7 +42,8 @@ declare module "nextjs-routes" { | DynamicRoute<"/results/instance/[instanceId]", { "instanceId": string }> | DynamicRoute<"/results/task/[taskId]", { "taskId": string }> | StaticRoute<"/results"> - | DynamicRoute<"/unit/[unitId]/charges", { "unitId": string }>; + | DynamicRoute<"/unit/[unitId]/charges", { "unitId": string }> + | StaticRoute<"/viewer/sdf">; interface StaticRoute { pathname: Pathname; diff --git a/utils/api/fetchHelpers.ts b/utils/api/fetchHelpers.ts new file mode 100644 index 000000000..889e726b1 --- /dev/null +++ b/utils/api/fetchHelpers.ts @@ -0,0 +1,4 @@ +import type { Response as NFResponse } from "node-fetch"; + +export const isResponseJson = (response: Response | NFResponse) => + !!response.headers.get("content-type")?.includes("application/json"); diff --git a/utils/api/plaintextViewerSSR.ts b/utils/api/plaintextViewerSSR.ts index b3f169920..8d7931662 100644 --- a/utils/api/plaintextViewerSSR.ts +++ b/utils/api/plaintextViewerSSR.ts @@ -4,6 +4,7 @@ import type { IncomingMessage, ServerResponse } from "node:http"; import { createGunzip } from "node:zlib"; import fetch from "node-fetch"; +import { isResponseJson } from "./fetchHelpers"; import { createErrorProps } from "./serverSidePropsError"; const MAX_BYTES = 100_000; @@ -74,7 +75,7 @@ export const plaintextViewerSSR = async ( } if (!response.ok) { - const isJson = response.headers.get("content-type")?.includes("application/json"); + const isJson = isResponseJson(response); const data = isJson ? await response.json() : null; const error = (data && (data as any).message) || response.status; captureException(error); diff --git a/utils/app/routes.ts b/utils/app/routes.ts index e434f89b5..0637e2c59 100644 --- a/utils/app/routes.ts +++ b/utils/app/routes.ts @@ -13,6 +13,9 @@ export const API_ROUTES = { `${proxy}/dataset/${datasetId}/${version}`, }; +export const projectFileURL: (typeof API_ROUTES)["projectFile"] = (project, path, file) => + process.env.DATA_MANAGER_API_SERVER + API_ROUTES.projectFile(project, path, file); + export const projectURL = (projectId: string) => window.location.origin + (process.env.NEXT_PUBLIC_BASE_PATH ?? "") +