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 (
+
+ );
+};
+
+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[]);
+ }}
+ />
+
+
+
+
+
+ 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) => (
+
+ ))}
+
+ );
+};
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 ?? "") +