1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-06-30 07:36:38 -04:00
* gymnastics to make theme script work with react 18 hydration

* try next 12.1.3 canary to fix SSG head tags?

* revert theme script changes

* next 12.1.3-canary.3

* double-revert some of the use-theme.tsx changes

* separate theme restoration script & move to _document

* bump next

* bump next (again)

* clean up some theme stuff

* use hashed image URLs in webmanifest and feeds

* text experimental react config

* Update ThemeScript.tsx

* switch selfie image to `layout="raw"`

* use `layout="raw"` for all non-imported images

* revert raw images in some places, messes up responsiveness

* fix nitpicky "no divs inside buttons" html validation error

* fix react-player hydration errors

* fix hydration errors from server/client time zone differences

* clean up hydration fixes

* Update format-date.ts

* last-minute cleanup
This commit is contained in:
2022-04-06 09:37:16 -04:00
committed by GitHub
parent 0a741b4282
commit eccf2108c7
29 changed files with 575 additions and 541 deletions

View File

@ -1,6 +1,6 @@
import { forwardRef, useState, useEffect } from "react";
import copy from "copy-to-clipboard";
import innerText from "react-innertext";
import copy from "copy-to-clipboard";
import { ClipboardOcticon, CheckOcticon } from "../Icons";
import { styled } from "../../lib/styles/stitches.config";
import type { ReactNode, Ref } from "react";

View File

@ -1,5 +1,5 @@
import Image, { CustomImageProps } from "../Image";
import innerText from "react-innertext";
import Image, { CustomImageProps } from "../Image";
import { styled } from "../../lib/styles/stitches.config";
import type { PropsWithChildren } from "react";

View File

@ -1,6 +1,7 @@
import useSWR from "swr";
import Loading from "../Loading";
import { fetcher } from "../../lib/helpers/fetcher";
import { siteLocale } from "../../lib/config";
export type HitCounterProps = {
slug: string;
@ -27,8 +28,11 @@ const HitCounter = ({ slug, className }: HitCounterProps) => {
// we have data!
return (
<span title={`${data.hits.toLocaleString("en-US")} ${data.hits === 1 ? "view" : "views"}`} className={className}>
{data.hits.toLocaleString("en-US")}
<span
title={`${data.hits.toLocaleString(siteLocale)} ${data.hits === 1 ? "view" : "views"}`}
className={className}
>
{data.hits.toLocaleString(siteLocale)}
</span>
);
} catch (error) {

View File

@ -36,8 +36,8 @@ const CustomImage = ({
}: CustomImageProps) => {
// passed directly into next/image: https://nextjs.org/docs/api-reference/next/image
const imageProps: Partial<NextImageProps> = {
width: typeof width === "string" ? Number.parseInt(width) : width,
height: typeof height === "string" ? Number.parseInt(height) : height,
width: typeof width === "string" ? Number.parseInt(width.replace("px", "")) : width,
height: typeof height === "string" ? Number.parseInt(height.replace("px", "")) : height,
alt: alt || "",
layout: layout || "intrinsic",
quality: quality || 65,

View File

@ -2,7 +2,8 @@ import Head from "next/head";
import Header from "../Header";
import Footer from "../Footer";
import { useTheme } from "../../hooks/use-theme";
import { styled, theme, darkTheme } from "../../lib/styles/stitches.config";
import { styled } from "../../lib/styles/stitches.config";
import { themeColors } from "../../lib/styles/helpers/themes";
import type { ComponentProps } from "react";
const Flex = styled("div", {
@ -39,10 +40,7 @@ const Layout = ({ container = true, stickyHeader = true, children, ...rest }: La
<>
<Head>
{/* dynamically set browser theme color to match the background color; default to light for SSR */}
<meta
name="theme-color"
content={(resolvedTheme === "dark" ? darkTheme : theme).colors.backgroundOuter?.value}
/>
<meta name="theme-color" content={themeColors[resolvedTheme === "dark" ? "dark" : "light"]} />
</Head>
<Flex {...rest}>

View File

@ -1,8 +1,8 @@
import Link from "next/link";
import { format } from "date-fns";
import HitCounter from "../HitCounter";
import NoteTitle from "../NoteTitle";
import { DateIcon, TagIcon, EditIcon, ViewsIcon } from "../Icons";
import { formatDateTZ } from "../../lib/helpers/format-date";
import { styled } from "../../lib/styles/stitches.config";
import * as config from "../../lib/config";
import type { NoteType } from "../../types";
@ -66,7 +66,7 @@ const NoteMeta = ({ slug, date, title, htmlTitle, tags = [] }: NoteMetaProps) =>
<span>
<Icon as={DateIcon} />
</span>
<span title={format(new Date(date), "PPppp")}>{format(new Date(date), "MMMM d, yyyy")}</span>
<span title={formatDateTZ(date)}>{formatDateTZ(date, "MMMM d, yyyy")}</span>
</MetaLink>
</Link>
</MetaItem>

View File

@ -1,5 +1,5 @@
import { format } from "date-fns";
import Link from "../Link";
import { formatDateTZ } from "../../lib/helpers/format-date";
import { styled } from "../../lib/styles/stitches.config";
import type { NoteType } from "../../types";
@ -67,7 +67,7 @@ const NotesList = ({ notesByYear }: NotesListProps) => {
<List>
{notes.map(({ slug, date, htmlTitle }) => (
<Post key={slug}>
<PostDate>{format(new Date(date), "MMM d")}</PostDate>
<PostDate title={formatDateTZ(date)}>{formatDateTZ(date, "MMM d")}</PostDate>
<span>
<Link
href={{

View File

@ -1,7 +1,9 @@
import { intlFormat, formatDistanceToNowStrict } from "date-fns";
import Link from "../Link";
import { StarOcticon, ForkOcticon } from "../Icons";
import { useHasMounted } from "../../hooks/use-has-mounted";
import { formatDateTZ, formatTimeAgo } from "../../lib/helpers/format-date";
import { styled } from "../../lib/styles/stitches.config";
import { siteLocale } from "../../lib/config";
import type { RepositoryType } from "../../types";
const Wrapper = styled("div", {
@ -80,68 +82,58 @@ const RepositoryCard = ({
forks,
updatedAt,
className,
}: RepositoryCardProps) => (
<Wrapper className={className}>
<Name href={url}>{name}</Name>
}: RepositoryCardProps) => {
const hasMounted = useHasMounted();
{description && <Description>{description}</Description>}
return (
<Wrapper className={className}>
<Name href={url}>{name}</Name>
<Meta>
{language && (
<MetaItem>
<LanguageCircle css={{ backgroundColor: language.color }} />
<span>{language.name}</span>
</MetaItem>
)}
{description && <Description>{description}</Description>}
{stars > 0 && (
<MetaItem>
<MetaLink
href={`${url}/stargazers`}
title={`${stars.toLocaleString("en-US")} ${stars === 1 ? "star" : "stars"}`}
target="_blank"
rel="noopener noreferrer"
>
<MetaIcon as={StarOcticon} />
<span>{stars.toLocaleString("en-US")}</span>
</MetaLink>
</MetaItem>
)}
{forks > 0 && (
<MetaItem>
<MetaLink
href={`${url}/network/members`}
title={`${forks.toLocaleString("en-US")} ${forks === 1 ? "fork" : "forks"}`}
target="_blank"
rel="noopener noreferrer"
>
<MetaIcon as={ForkOcticon} />
<span>{forks.toLocaleString("en-US")}</span>
</MetaLink>
</MetaItem>
)}
<MetaItem
title={intlFormat(
new Date(updatedAt),
{
year: "numeric",
month: "short",
day: "numeric",
hour: "numeric",
minute: "numeric",
timeZoneName: "short",
},
{
locale: "en-US",
}
<Meta>
{language && (
<MetaItem>
<LanguageCircle css={{ backgroundColor: language.color }} />
<span>{language.name}</span>
</MetaItem>
)}
>
<span>Updated {formatDistanceToNowStrict(new Date(updatedAt), { addSuffix: true })}</span>
</MetaItem>
</Meta>
</Wrapper>
);
{stars > 0 && (
<MetaItem>
<MetaLink
href={`${url}/stargazers`}
title={`${stars.toLocaleString(siteLocale)} ${stars === 1 ? "star" : "stars"}`}
target="_blank"
rel="noopener noreferrer"
>
<MetaIcon as={StarOcticon} />
<span>{stars.toLocaleString(siteLocale)}</span>
</MetaLink>
</MetaItem>
)}
{forks > 0 && (
<MetaItem>
<MetaLink
href={`${url}/network/members`}
title={`${forks.toLocaleString(siteLocale)} ${forks === 1 ? "fork" : "forks"}`}
target="_blank"
rel="noopener noreferrer"
>
<MetaIcon as={ForkOcticon} />
<span>{forks.toLocaleString(siteLocale)}</span>
</MetaLink>
</MetaItem>
)}
{/* only use relative "time ago" on client side, since it'll be outdated via SSG and cause hydration errors */}
<MetaItem title={formatDateTZ(updatedAt)}>
<span>Updated {hasMounted ? formatTimeAgo(updatedAt) : `on ${formatDateTZ(updatedAt, "PP")}`}</span>
</MetaItem>
</Meta>
</Wrapper>
);
};
export default RepositoryCard;

View File

@ -6,23 +6,16 @@ import type { ComponentProps } from "react";
import selfieJpg from "../../public/static/images/selfie.jpg";
const ConstrainImage = styled("div", {
const Image = styled(NextImage, {
display: "block",
width: "50px",
height: "50px",
lineHeight: 0,
padding: 0,
"@medium": {
width: "70px",
height: "70px",
},
});
const Image = styled(NextImage, {
border: "1px solid $light !important",
borderRadius: "50%",
"@medium": {
width: "70px",
height: "70px",
borderWidth: "2px !important",
},
});
@ -60,17 +53,7 @@ export type SelfieProps = ComponentProps<typeof Link>;
const Selfie = ({ ...rest }: SelfieProps) => (
<NextLink href="/" passHref={true}>
<Link {...rest}>
<ConstrainImage>
<Image
src={selfieJpg}
alt="Photo of Jake Jarvis"
width={70}
height={70}
quality={60}
layout="intrinsic"
priority
/>
</ConstrainImage>
<Image src={selfieJpg} alt="Photo of Jake Jarvis" width={50} height={50} quality={60} layout="raw" priority />
<Name>Jake Jarvis</Name>
</Link>
</NextLink>

View File

@ -0,0 +1,62 @@
import { darkModeQuery, themeStorageKey, themeClassNames } from "../../lib/styles/helpers/themes";
// comments are up here to avoid having them inside the actual client output:
// - `p` is the user's saved preference
// - `c` is the map of theme -> classname
// - `l` is the list of <html>'s current class(es), which the `cn` values are removed to start fresh
// - `q` is always the CSS media query for prefers dark mode
// - `m` is the listener which tests that media query
// - `try/catch` is in case I messed something up here bigly... (will default to light theme)
/* eslint-disable no-empty, no-var, one-var */
const clientScript = () => {
try {
var p = localStorage.getItem("__STORAGE_KEY__"),
c = "__CLASS_NAMES__",
l = document.documentElement.classList;
l.remove("__LIST_OF_CLASSES__");
if (!p || p === "system") {
var q = "__MEDIA_QUERY__",
m = window.matchMedia(q);
m.media !== q || m.matches ? l.add(c["dark"]) : l.add(c["light"]);
} else {
l.add(c[p]);
}
} catch (e) {}
};
/* eslint-enable no-empty, no-var, one-var */
// since the function above will end up being injected as a plain dumb string, we need to set the dynamic values here:
const prepareScript = (script: unknown) => {
const functionString = String(script)
.replace('"__MEDIA_QUERY__"', `"${darkModeQuery}"`)
.replace('"__STORAGE_KEY__"', `"${themeStorageKey}"`)
.replace('"__CLASS_NAMES__"', JSON.stringify(themeClassNames))
.replace(
'"__LIST_OF_CLASSES__"',
Object.values(themeClassNames)
.map((t: string) => `"${t}"`)
.join(",")
);
// somewhat "minify" the final code by removing tabs/newlines:
// https://github.com/sindresorhus/condense-whitespace/blob/main/index.js
// .replace(/\s{2,}/gu, "")
// .trim();
// make it an IIFE:
return `(${functionString})()`;
};
// the script tag injected manually into `<head>` in _document.tsx.
// even though it's the proper method, using next/script with `strategy="beforeInteractive"` still causes flash of
// white on load. injecting a normal script tag lets us prioritize setting `<html>` attributes even more.
const ThemeScript = () => (
<script
key="restore-theme"
dangerouslySetInnerHTML={{
__html: prepareScript(clientScript),
}}
/>
);
export default ThemeScript;

View File

@ -0,0 +1,2 @@
export * from "./ThemeScript";
export { default } from "./ThemeScript";

View File

@ -92,10 +92,10 @@ const ThemeToggle = ({ id = "nav", className }: ThemeToggleProps) => {
config: springProperties.springConfig,
});
// render a dummy button until we're fully mounted and self-aware
// render a blank div of the same size to avoid layout shifting until we're fully mounted and self-aware
if (!hasMounted) {
return (
<Button aria-hidden={true} disabled={true}>
<Button as="div" aria-hidden={true}>
<div className={className} />
</Button>
);

View File

@ -1,16 +1,17 @@
import ReactPlayer from "react-player/file";
import { useHasMounted } from "../../hooks/use-has-mounted";
import { styled } from "../../lib/styles/stitches.config";
import type { FilePlayerProps } from "react-player/file";
const Wrapper = styled("div", {
position: "relative",
paddingTop: "56.25%",
});
"& > div": {
position: "absolute",
top: 0,
left: 0,
},
const Player = styled(ReactPlayer, {
position: "absolute",
top: 0,
left: 0,
"& video": {
borderRadius: "$rounded",
@ -30,6 +31,9 @@ export type VideoProps = Partial<FilePlayerProps> & {
};
const Video = ({ src, thumbnail, subs, autoplay, className, ...rest }: VideoProps) => {
// fix hydration issues: https://github.com/cookpete/react-player/issues/1428
const hasMounted = useHasMounted();
const url = [
src.webm && {
src: src.webm,
@ -73,15 +77,17 @@ const Video = ({ src, thumbnail, subs, autoplay, className, ...rest }: VideoProp
return (
<Wrapper className={className}>
<ReactPlayer
width="100%"
height="100%"
url={url}
controls={!autoplay}
// @ts-ignore
config={config}
{...rest}
/>
{hasMounted && (
<Player
width="100%"
height="100%"
url={url}
controls={!autoplay}
// @ts-ignore
config={config}
{...rest}
/>
)}
</Wrapper>
);
};

View File

@ -1,17 +1,19 @@
import ReactPlayer from "react-player/youtube";
import { useHasMounted } from "../../hooks/use-has-mounted";
import { styled } from "../../lib/styles/stitches.config";
import type { YouTubePlayerProps } from "react-player/youtube";
const Wrapper = styled("div", {
position: "relative",
paddingTop: "56.25%",
});
"& > div": {
position: "absolute",
top: 0,
left: 0,
},
const Player = styled(ReactPlayer, {
position: "absolute",
top: 0,
left: 0,
// target both the lazy thumbnail preview *and* the actual YouTube embed
"& .react-player__preview, & iframe": {
borderRadius: "$rounded",
},
@ -22,17 +24,24 @@ export type YouTubeEmbedProps = Partial<YouTubePlayerProps> & {
className?: string;
};
const YouTubeEmbed = ({ id, className, ...rest }: YouTubeEmbedProps) => (
<Wrapper className={className}>
<ReactPlayer
width="100%"
height="100%"
url={`https://www.youtube-nocookie.com/watch?v=${id}`}
light={`https://i.ytimg.com/vi/${id}/hqdefault.jpg`}
controls
{...rest}
/>
</Wrapper>
);
const YouTubeEmbed = ({ id, className, ...rest }: YouTubeEmbedProps) => {
// fix hydration issues: https://github.com/cookpete/react-player/issues/1428
const hasMounted = useHasMounted();
return (
<Wrapper className={className}>
{hasMounted && (
<Player
width="100%"
height="100%"
url={`https://www.youtube-nocookie.com/watch?v=${id}`}
light={`https://i.ytimg.com/vi/${id}/hqdefault.jpg`}
controls
{...rest}
/>
)}
</Wrapper>
);
};
export default YouTubeEmbed;

View File

@ -1,33 +1,17 @@
// forked & modified from pacocoursey/next-themes as of v0.0.15:
// https://github.com/pacocoursey/next-themes/tree/b5c2bad50de2d61ad7b52a9c5cdc801a78507d7a
import { createContext, useCallback, useContext, useEffect, useState, useRef, memo } from "react";
import NextHead from "next/head";
import { createContext, useCallback, useContext, useEffect, useState, useRef } from "react";
import { darkModeQuery, colorSchemes, themeStorageKey } from "../lib/styles/helpers/themes";
import type { PropsWithChildren } from "react";
// https://web.dev/prefers-color-scheme/#the-prefers-color-scheme-media-query
const MEDIA = "(prefers-color-scheme: dark)";
// default to a simple light or dark binary option
const colorSchemes = ["light", "dark"];
interface AttributeValuesMap {
[themeName: string]: string;
}
export interface ThemeProviderProps {
/** Mapping of theme name to HTML attribute value. Object where key is the theme name and value is the attribute value */
classNames: { [themeName: string]: string };
/** List of all available theme names */
themes?: string[];
/** Whether to indicate to browsers which color scheme is used (dark or light) for built-in UI like inputs and buttons */
enableColorScheme?: boolean;
/** Key used to store theme setting in localStorage */
storageKey?: string;
/** Default theme name (for v0.0.12 and lower the default was light). If `enableSystem` is false, the default theme is light */
defaultTheme?: string;
/** HTML attribute modified based on the active theme. Accepts `class` and `data-*` (meaning any data attribute, `data-mode`, `data-color`, etc.) */
attribute?: string | "class";
/** Mapping of theme name to HTML attribute value. Object where key is the theme name and value is the attribute value */
value?: AttributeValuesMap;
}
export interface UseThemeProps {
@ -45,7 +29,7 @@ export interface UseThemeProps {
const getTheme = (key: string, fallback?: string) => {
if (typeof window === "undefined") return undefined;
let theme;
let theme: string;
try {
theme = localStorage.getItem(key) || undefined;
} catch (e) {} // eslint-disable-line no-empty
@ -56,7 +40,7 @@ const getTheme = (key: string, fallback?: string) => {
// get the user's prefered theme as set via their OS/browser settings
const getSystemTheme = (e?: MediaQueryList) => {
if (!e) {
e = window.matchMedia(MEDIA);
e = window.matchMedia(darkModeQuery);
}
const isDark = e.matches;
@ -72,82 +56,15 @@ const ThemeContext = createContext<UseThemeProps>({
});
export const useTheme = () => useContext(ThemeContext);
// the script tag injected manually into `<head>` by provider below
const ThemeScript = memo(function ThemeScript({
storageKey,
attribute,
defaultTheme,
value,
attrs,
}: {
storageKey: string;
attribute?: string;
defaultTheme: string;
value?: AttributeValuesMap;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
attrs: any;
}) {
const setDocumentVar = (() => {
if (attribute === "class") {
const removeClasses = `d.remove(${attrs.map((t: string) => `"${t}"`).join(",")})`;
// `d` is the class list of the `<html>` tag
return `var d=document.documentElement.classList;${removeClasses};`;
} else {
// `d` is the entire document, used to set custom attribute of the `<html>` tag (probably `data-*`)
return `var d=document.documentElement;`;
}
})();
const updateDOM = (name: string, literal?: boolean) => {
name = value?.[name] || name;
const val = literal ? name : `"${name}"`;
// mirrors above logic from setDocumentVar()
if (attribute === "class") {
return `d.add(${val})`;
} else {
return `d.setAttribute("${attribute}", ${val})`;
}
};
// is the default theme still `system`? (it should be...)
const defaultSystem = defaultTheme === "system";
// even though it's the proper method, using next/script with `strategy="beforeInteractive"` still causes flash of
// white on load. injecting a normal script tag lets us prioritize setting `<html>` attributes even more.
return (
<NextHead>
<script
key="next-themes-script"
dangerouslySetInnerHTML={{
__html: `!function(){try{${setDocumentVar}var e=localStorage.getItem("${storageKey}");${
!defaultSystem ? updateDOM(defaultTheme) + ";" : ""
}if("system"===e||(!e&&${defaultSystem})){var t="${MEDIA}",m=window.matchMedia(t);m.media!==t||m.matches?${updateDOM(
"dark"
)}:${updateDOM("light")}}else if(e){${value ? `var x=${JSON.stringify(value)}` : ""}}${updateDOM(
value ? "x[e]" : "e",
true
)}}catch(e){}}()`,
}}
/>
</NextHead>
);
});
// provider used once in _app.tsx to wrap entire app
export const ThemeProvider = ({
enableColorScheme = true,
storageKey = "theme",
classNames,
themes = [...colorSchemes],
defaultTheme = "system",
attribute = "data-theme",
value,
enableColorScheme = true,
children,
}: PropsWithChildren<ThemeProviderProps>) => {
const [theme, setThemeState] = useState(() => getTheme(storageKey, defaultTheme));
const [resolvedTheme, setResolvedTheme] = useState(() => getTheme(storageKey));
const attrs = !value ? themes : Object.values(value);
const [theme, setThemeState] = useState(() => getTheme(themeStorageKey, "system"));
const [resolvedTheme, setResolvedTheme] = useState(() => getTheme(themeStorageKey));
const handleMediaQuery = useCallback(
(e?) => {
@ -163,28 +80,25 @@ export const ThemeProvider = ({
mediaListener.current = handleMediaQuery;
const changeTheme = useCallback((theme, updateStorage = true, updateDOM = true) => {
let name = value?.[theme] || theme;
let name = classNames?.[theme] || theme;
if (updateStorage) {
try {
localStorage.setItem(storageKey, theme);
localStorage.setItem(themeStorageKey, theme);
} catch (e) {} // eslint-disable-line no-empty
}
if (theme === "system") {
const resolved = getSystemTheme();
name = value?.[resolved] || resolved;
name = classNames?.[resolved] || resolved;
}
if (updateDOM) {
// remove all theme classes first to start fresh
const all = Object.values(classNames);
const d = document.documentElement;
if (attribute === "class") {
d.classList.remove(...attrs);
d.classList.add(name);
} else {
d.setAttribute(attribute, name);
}
d.classList.remove(...all);
d.classList.add(name);
}
}, []); // eslint-disable-line react-hooks/exhaustive-deps
@ -193,7 +107,7 @@ export const ThemeProvider = ({
const handler = (...args: any) => mediaListener.current(...args);
// Always listen to System preference
const media = window.matchMedia(MEDIA);
const media = window.matchMedia(darkModeQuery);
// Intentionally use deprecated listener methods to support iOS & old browsers
media.addListener(handler);
@ -213,12 +127,12 @@ export const ThemeProvider = ({
// localStorage event handling
useEffect(() => {
const handleStorage = (e: StorageEvent) => {
if (e.key !== storageKey) {
if (e.key !== themeStorageKey) {
return;
}
// If default theme set, use it if localstorage === null (happens on local storage manual deletion)
const theme = e.newValue || defaultTheme;
// use default theme if localstorage === null (happens on local storage manual deletion)
const theme = e.newValue || "system";
setTheme(theme);
};
@ -253,16 +167,6 @@ export const ThemeProvider = ({
setTheme,
}}
>
<ThemeScript
{...{
storageKey,
attribute,
value,
defaultTheme,
attrs,
}}
/>
{children}
</ThemeContext.Provider>
);

View File

@ -3,7 +3,8 @@ module.exports = {
// Site info
siteName: "Jake Jarvis",
siteDomain: "jarv.is",
siteLocale: "en_us",
siteLocale: "en-US",
timeZone: "America/New_York", // https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
baseUrl:
process.env.NEXT_PUBLIC_VERCEL_ENV === "production"
? "https://jarv.is"

View File

@ -1,10 +1,16 @@
import * as config from ".";
// favicons (some used here, some re-exported and used elsewhere)
import faviconIco from "../../public/static/favicons/favicon.ico";
import faviconPng from "../../public/static/favicons/favicon.png";
import appleTouchIconPng from "../../public/static/favicons/apple-touch-icon.png";
import chrome512Png from "../../public/static/favicons/android-chrome-512x512.png";
import chrome192Png from "../../public/static/favicons/android-chrome-192x192.png";
import maskable512Png from "../../public/static/favicons/maskable-512x512.png";
import maskable192Png from "../../public/static/favicons/maskable-192x192.png";
import meJpg from "../../public/static/images/me.jpg";
import type { StaticImageData } from "next/image";
import type { DefaultSeoProps, SocialProfileJsonLdProps, ArticleJsonLdProps } from "next-seo";
// Most of this file simply takes the data already defined in ./config.js and translates it into objects that are
@ -17,7 +23,7 @@ export const defaultSeo: DefaultSeoProps = {
openGraph: {
site_name: config.siteName,
title: `${config.siteName} ${config.shortDescription}`,
locale: config.siteLocale,
locale: config.siteLocale?.replace("-", "_"),
type: "website",
images: [
{
@ -126,3 +132,15 @@ export const articleJsonLd: Pick<ArticleJsonLdProps, "authorName" | "publisherNa
publisherName: config.siteName,
publisherLogo: `${config.baseUrl}${meJpg.src}`,
};
// Re-export icons to use their static image data elsewhere
export const favicons: Record<string, StaticImageData> = {
faviconIco,
faviconPng,
appleTouchIconPng,
chrome512Png,
chrome192Png,
maskable512Png,
maskable192Png,
meJpg,
};

View File

@ -2,6 +2,7 @@ import { Feed } from "feed";
import { getAllNotes } from "./parse-notes";
import * as config from "../config";
import { RELEASE_DATE } from "../config/constants";
import { favicons } from "../config/seo";
import type { GetServerSidePropsContext, PreviewData } from "next";
import type { ParsedUrlQuery } from "querystring";
@ -22,7 +23,7 @@ export const buildFeed = (
description: config.longDescription,
copyright: "https://creativecommons.org/licenses/by/4.0/",
updated: new Date(RELEASE_DATE),
image: `${config.baseUrl}/static/images/me.jpg`,
image: `${config.baseUrl}${favicons.meJpg.src}`,
feedLinks: {
rss: `${config.baseUrl}/feed.xml`,
atom: `${config.baseUrl}/feed.atom`,

View File

@ -0,0 +1,15 @@
import { formatDistanceToNowStrict } from "date-fns";
import { formatInTimeZone } from "date-fns-tz";
import enUS from "date-fns/locale/en-US";
import { timeZone } from "../config";
// normalize timezone across the site, both server and client side, to prevent hydration errors.
// format defaults to "Apr 4, 2022, 3:04 PM EDT", see https://date-fns.org/v2.28.0/docs/format
export const formatDateTZ = (date: string | number | Date, formatStr = "PPp zzz", options = {}) => {
return formatInTimeZone(new Date(date), timeZone, formatStr, { locale: enUS, ...options });
};
// returns "5 minutes ago", "1 year ago", etc.
export const formatTimeAgo = (date: string | number | Date, options = {}) => {
return formatDistanceToNowStrict(new Date(date), { addSuffix: true, locale: enUS, ...options });
};

View File

@ -0,0 +1,22 @@
import { theme, darkTheme } from "../stitches.config";
// theme classnames are generated dynamically by stitches, so have ThemeProvider pull them from there
export const themeClassNames = {
light: theme.className,
dark: darkTheme.className,
};
// colors used for `<meta name="theme-color" .../>` (see components/Layout/Layout.tsx)
export const themeColors = {
light: theme.colors.backgroundOuter?.value,
dark: darkTheme.colors.backgroundOuter?.value,
};
// default to a simple light or dark binary option
export const colorSchemes = ["light", "dark"];
// https://web.dev/prefers-color-scheme/#the-prefers-color-scheme-media-query
export const darkModeQuery = "(prefers-color-scheme: dark)";
// local storage key
export const themeStorageKey = "theme";

View File

@ -1,7 +1,7 @@
import { createStitches, defaultThemeMap } from "@stitches/react";
// modified modern-normalize.css in object form:
// https://github.com/jakejarvis/stitches-normalize/blob/main/index.js
// https://github.com/jakejarvis/stitches-normalize/blob/main/src/index.ts
import normalizeCss from "stitches-normalize";
// web fonts

View File

@ -33,6 +33,13 @@ module.exports = (phase, { defaultConfig }) => {
formats: ["image/avif", "image/webp"],
minimumCacheTTL: 43200,
},
experimental: {
reactRoot: true, // 18
images: {
// allow forgoing the mess of `<span>`s around statically imported images
layoutRaw: true,
},
},
webpack: (config) => {
// this lets us statically import webfonts like we would images, allowing cool things like preloading them
config.module.rules.push({
@ -98,6 +105,7 @@ module.exports = (phase, { defaultConfig }) => {
],
rewrites: async () => [
{ source: "/favicon.ico", destination: "/static/favicons/favicon.ico" },
{ source: "/favicon.png", destination: "/static/favicons/favicon.png" },
{ source: "/apple-touch-icon.png", destination: "/static/favicons/apple-touch-icon.png" },
{ source: "/apple-touch-icon-precomposed.png", destination: "/static/favicons/apple-touch-icon.png" },
],

View File

@ -27,12 +27,12 @@
"@octokit/graphql": "^4.8.0",
"@primer/octicons": "^17.0.0",
"@react-spring/web": "^9.4.4",
"@sentry/node": "^6.19.3",
"@sentry/tracing": "^6.19.3",
"@sentry/node": "^6.19.4",
"@sentry/tracing": "^6.19.4",
"@stitches/react": "^1.2.7",
"copy-to-clipboard": "^3.3.1",
"date-fns": "^2.28.0",
"escape-goat": "^4.0.0",
"date-fns-tz": "^1.3.3",
"fathom-client": "^3.4.1",
"faunadb": "^4.5.4",
"feather-icons": "^4.29.0",
@ -41,22 +41,22 @@
"gray-matter": "^4.0.3",
"is-absolute-url": "^4.0.1",
"markdown-to-jsx": "^7.1.7",
"next": "12.1.2",
"next": "12.1.5-canary.2",
"next-compose-plugins": "^2.2.1",
"next-mdx-remote": "^4.0.2",
"next-seo": "^5.3.0",
"next-sitemap": "^2.5.17",
"next-mdx-remote": "4.0.1",
"next-seo": "^5.4.0",
"next-sitemap": "^2.5.18",
"next-transpile-modules": "^9.0.0",
"node-fetch": "^3.2.3",
"p-retry": "^5.1.0",
"prop-types": "^15.8.1",
"query-string": "^7.1.1",
"react": "17.0.2",
"react-dom": "17.0.2",
"react": "18.0.0",
"react-dom": "18.0.0",
"react-gist": "^1.2.4",
"react-innertext": "^1.1.5",
"react-intersection-observer": "^8.33.1",
"react-is": "17.0.2",
"react-is": "18.0.0",
"react-player": "^2.10.0",
"react-textarea-autosize": "^8.3.3",
"react-twitter-embed": "^4.0.4",
@ -72,7 +72,7 @@
},
"devDependencies": {
"@jakejarvis/eslint-config": "*",
"@next/bundle-analyzer": "12.1.2",
"@next/bundle-analyzer": "12.1.5-canary.2",
"@svgr/webpack": "^6.2.1",
"@types/node": "*",
"@types/prop-types": "^15.7.4",
@ -81,11 +81,11 @@
"@types/react-is": "^17.0.3",
"@types/remove-markdown": "^0.3.1",
"@types/sanitize-html": "^2.6.2",
"@typescript-eslint/eslint-plugin": "^5.17.0",
"@typescript-eslint/parser": "^5.17.0",
"@typescript-eslint/eslint-plugin": "^5.18.0",
"@typescript-eslint/parser": "^5.18.0",
"cross-env": "^7.0.3",
"eslint": "~8.12.0",
"eslint-config-next": "12.1.2",
"eslint-config-next": "12.1.5-canary.2",
"eslint-config-prettier": "~8.5.0",
"eslint-plugin-mdx": "~1.17.0",
"eslint-plugin-prettier": "~4.0.0",

View File

@ -4,9 +4,10 @@ import { DefaultSeo, SocialProfileJsonLd } from "next-seo";
import * as Fathom from "fathom-client";
import { ThemeProvider } from "../hooks/use-theme";
import Layout from "../components/Layout";
import { globalStyles, theme, darkTheme } from "../lib/styles/stitches.config";
import * as config from "../lib/config";
import { defaultSeo, socialProfileJsonLd } from "../lib/config/seo";
import { themeClassNames } from "../lib/styles/helpers/themes";
import { globalStyles } from "../lib/styles/stitches.config";
import type { ReactElement, ReactNode } from "react";
import type { NextPage } from "next";
import type { AppProps as NextAppProps } from "next/app";
@ -55,14 +56,7 @@ const App = ({ Component, pageProps }: AppProps) => {
const getLayout = Component.getLayout || ((page) => <Layout>{page}</Layout>);
return (
<ThemeProvider
// theme classnames are generated dynamically by stitches, so have ThemeProvider pull them from there
attribute="class"
value={{
light: theme.className,
dark: darkTheme.className,
}}
>
<ThemeProvider classNames={themeClassNames}>
{/* all SEO config is in ../lib/config/seo.ts except for canonical URLs, which require access to next router */}
<DefaultSeo
{...defaultSeo}

View File

@ -1,12 +1,16 @@
import { Html, Head, Main, NextScript } from "next/document";
import ThemeScript from "../components/ThemeScript/ThemeScript";
import { getCssText, fonts } from "../lib/styles/stitches.config";
import * as config from "../lib/config";
// https://nextjs.org/docs/advanced-features/custom-document
const Document = () => {
return (
<Html lang={config.siteLocale?.replace("_", "-")}>
<Html lang={config.siteLocale}>
<Head>
{/* inject a small script to set/restore the user's theme ASAP */}
<ThemeScript />
{/* preload highest priority fonts defined in ../lib/styles/fonts/ */}
{fonts.preloadUrls.map((relativeUrl, index) => (
<link

View File

@ -1,7 +1,6 @@
import { InView } from "react-intersection-observer";
import { NextSeo, ArticleJsonLd } from "next-seo";
import { MDXRemote } from "next-mdx-remote";
import { htmlEscape } from "escape-goat";
import Content from "../../components/Content";
import NoteMeta from "../../components/NoteMeta";
import Comments from "../../components/Comments";
@ -42,8 +41,8 @@ const Note = ({ frontMatter, source }: NoteType) => {
/>
<ArticleJsonLd
url={frontMatter.permalink}
title={htmlEscape(frontMatter.title)}
description={htmlEscape(frontMatter.description)}
title={frontMatter.title}
description={frontMatter.description}
datePublished={frontMatter.date}
dateModified={frontMatter.date}
images={frontMatter.image && [`${config.baseUrl}${frontMatter.image}`]}

View File

@ -1,8 +1,8 @@
import { NextSeo } from "next-seo";
import { format } from "date-fns";
import Content from "../../components/Content";
import NotesList, { NotesListProps } from "../../components/NotesList";
import { getAllNotes } from "../../lib/helpers/parse-notes";
import { formatDateTZ } from "../../lib/helpers/format-date";
import type { GetStaticProps } from "next";
const Notes = ({ notesByYear }: NotesListProps) => (
@ -26,7 +26,7 @@ export const getStaticProps: GetStaticProps = async () => {
const notesByYear: NotesListProps["notesByYear"] = {};
getAllNotes().map((note) => {
const year = format(new Date(note.date), "yyyy");
const year = formatDateTZ(note.date, "yyyy");
(notesByYear[year] || (notesByYear[year] = [])).push(note);
});

View File

@ -1,4 +1,5 @@
import * as config from "../lib/config";
import { favicons } from "../lib/config/seo";
import type { GetServerSideProps } from "next";
export const getServerSideProps: GetServerSideProps = async (context) => {
@ -8,10 +9,30 @@ export const getServerSideProps: GetServerSideProps = async (context) => {
description: config.longDescription,
lang: config.siteLocale,
icons: [
{ src: "/static/favicons/android-chrome-512x512.png", sizes: "512x512", type: "image/png", purpose: "any" },
{ src: "/static/favicons/android-chrome-192x192.png", sizes: "192x192", type: "image/png", purpose: "any" },
{ src: "/static/favicons/maskable-512x512.png", sizes: "512x512", type: "image/png", purpose: "maskable" },
{ src: "/static/favicons/maskable-192x192.png", sizes: "192x192", type: "image/png", purpose: "maskable" },
{
src: favicons.chrome512Png.src,
sizes: `${favicons.chrome512Png.width}x${favicons.chrome512Png.height}`,
type: "image/png",
purpose: "any",
},
{
src: favicons.chrome192Png.src,
sizes: `${favicons.chrome192Png.width}x${favicons.chrome192Png.height}`,
type: "image/png",
purpose: "any",
},
{
src: favicons.maskable512Png.src,
sizes: `${favicons.maskable512Png.width}x${favicons.maskable512Png.height}`,
type: "image/png",
purpose: "maskable",
},
{
src: favicons.maskable192Png.src,
sizes: `${favicons.maskable192Png.width}x${favicons.maskable192Png.height}`,
type: "image/png",
purpose: "maskable",
},
],
display: "browser",
start_url: "/",

505
yarn.lock
View File

@ -1120,9 +1120,9 @@
integrity sha512-nOJARIr3pReqK3hfFCSW2Zg/kFcFsSAlIE7z4a0C9D2dPrgD/YSn3ZP2ET/rxKB65SXyG7jJbkynBRm+tGlacw==
"@mdx-js/mdx@^2.0.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.1.0.tgz#a984cee27a378619a82d193288031a7b83a54b26"
integrity sha512-AuZGNLSGrytOd7a81E2SsWAOYg/eV5I51BlUPc11PPmPwhpovu7mwfyQ8PH1jxhdH0Is6aRtXHERuDxon0TluQ==
version "2.1.1"
resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.1.1.tgz#6d8b9b75456d7685a52c3812b1c3e4830c7458fb"
integrity sha512-SXC18cChut3F2zkVXwsb2no0fzTQ1z6swjK13XwFbF5QU/SFQM0orAItPypSdL3GvqYyzVJtz8UofzJhPEQtMw==
dependencies:
"@types/estree-jsx" "^0.0.1"
"@types/mdx" "^2.0.0"
@ -1143,9 +1143,9 @@
vfile "^5.0.0"
"@mdx-js/react@^2.0.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.1.0.tgz#2aca56d3d9d6f1bbee9f3c44bd26890331419953"
integrity sha512-RlPnY2WcVe91pOilf3Rmu1pArKj7gSK03uoaMFKjPWTyh9t6t1VYGSX40twlpChNSPmbcQ29D0xvSBOVMWA6yw==
version "2.1.1"
resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.1.1.tgz#c59d844fd61b776fea8673fb77405d4e14db48c5"
integrity sha512-7zlZDf5xmWH8I0kFE4DG91COOkxjaW9DX5f1HWztZpFcVua2gJgMYfIkFaDpO/DH/tWi6Mz+OheW4194r15igg==
dependencies:
"@types/mdx" "^2.0.0"
"@types/react" ">=16"
@ -1155,84 +1155,84 @@
resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b"
integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==
"@next/bundle-analyzer@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-12.1.2.tgz#53e9f3595bd25404479b7a40a85a846b328af12b"
integrity sha512-JRDgfEERWXFtwCjiue/SgI/33Z/Dpmt3tKazbf2BIi+uEmxOjuwaN9+TGPEX/P0QWyuhu8DYAex92+B/yB+93Q==
"@next/bundle-analyzer@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-12.1.5-canary.2.tgz#0862cde56de524a6d3ab48458c544939e96fd7e3"
integrity sha512-phpXYWIgEgApmlO2wbC0z3W12lM3xbQ3WgzSJbCI6L0MJ7OtB4NO1jORlLXKwrUNqkLYQl7X1zQaStDWZjEuWA==
dependencies:
webpack-bundle-analyzer "4.3.0"
"@next/env@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.2.tgz#4b0f5fd448ac60b821d2486d2987948e3a099f03"
integrity sha512-A/P4ysmFScBFyu1ZV0Mr1Y89snyQhqGwsCrkEpK+itMF+y+pMqBoPVIyakUf4LXqGWJGiGFuIerihvSG70Ad8Q==
"@next/env@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.5-canary.2.tgz#574f337cad8236e49661d2dc798c8d27d3ad90fb"
integrity sha512-Vnup5ewYgpuUmOjVz8gTQeBF9YYZ2ikVNHOGP6n3YqOYTnqTMKAFvCa7uqkFXraw/PtIbpb9ZMwtXd7T6HWx5Q==
"@next/eslint-plugin-next@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.1.2.tgz#5757064bbfaba467c1a5647f0ef25793514f4016"
integrity sha512-XqYRh6d98dpv2ynoOEC3VeNv99hxRGBuanRDKASfntdAZD9Zp4n+AugmNF0qwOQEHYgG1uvZW3A4Fi6Y/+kCQw==
"@next/eslint-plugin-next@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.1.5-canary.2.tgz#15f2588682379c92dcc099ceedf1770435ff5c46"
integrity sha512-tYFFv4BgvzoRd4U4T9COhVnaznaK6B4GG9xj2W0396EKakczqo0p+1OCYgoBbhqtkOp/nB3ytvncuN2b8VNS6g==
dependencies:
glob "7.1.7"
"@next/swc-android-arm-eabi@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.2.tgz#675e952d9032ac7bec02f3f413c17d33bbd90857"
integrity sha512-iwalfLBhYmCIlj09czFbovj1SmTycf0AGR8CB357wgmEN8xIuznIwSsCH87AhwQ9apfNtdeDhxvuKmhS9T3FqQ==
"@next/swc-android-arm-eabi@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.5-canary.2.tgz#3877f2cb7885047dc59137fd71a7a605927c1b51"
integrity sha512-EOeu/MWbTTq1V8I6Ehx1x0AwbGNaPPuWBjT9vB+V0alGA7vsFPyF3AnT81wRUkOCfOkP6MNtYvpr3sjnqxLLOw==
"@next/swc-android-arm64@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.2.tgz#d9710c50853235f258726b19a649df9c29a49682"
integrity sha512-ZoR0Vx7czJhTgRAcFbzTKQc2n2ChC036/uc6PbgYiI/LreEnfmsV/CiREP0pUVs5ndntOX8kBA3BSbh4zCO5tQ==
"@next/swc-android-arm64@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.5-canary.2.tgz#acf7a65766f21951cf3b938d119a903c6895a904"
integrity sha512-8xSPGDnekQTH6aulQ1fr0yy2zZ+DbuVkvui/D7WtQmfGFVnm1wsxifZDh1HWrrJcxDbdGSF8S/22iUmxMVhKQw==
"@next/swc-darwin-arm64@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.2.tgz#aadd21b711c82b3efa9b4ecf7665841259e1fa7e"
integrity sha512-VXv7lpqFjHwkK65CZHkjvBxlSBTG+l3O0Zl2zHniHj0xHzxJZvR8VFjV2zIMZCYSfVqeQ5yt2rjwuQ9zbpGtXQ==
"@next/swc-darwin-arm64@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.5-canary.2.tgz#c27ab156d62b342b258f05e348bde0a7f64dce03"
integrity sha512-WgWpb9tkTPBvAJHdLLnwdxlPx2z7bftcD5Z8EARBkJE6Y0eW2J3HG9fVov3SinS074f8PtEiE0xzwnbdtZBLbQ==
"@next/swc-darwin-x64@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.2.tgz#3b1a389828f5c88ecb828a6394692fdeaf175081"
integrity sha512-evXxJQnXEnU+heWyun7d0UV6bhBcmoiyFGR3O3v9qdhGbeXh+SXYVxRO69juuh6V7RWRdlb1KQ0rGUNa1k0XSw==
"@next/swc-darwin-x64@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.5-canary.2.tgz#8d6c128dbbb62f2aac3af5366bc4c0531857d375"
integrity sha512-uE5nKW5N6Til+i8w07SkGy+f6shwxdLCgrghsf3Aoa6PlrRubTTB7TXkeeZDaiuhxgt2891GvR0LzTwa+peH9w==
"@next/swc-linux-arm-gnueabihf@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.2.tgz#db4371ca716bf94c94d4f6b001ac3c9d08d97d79"
integrity sha512-LJV/wo6R0Ot7Y/20bZs00aBG4J333RT6H/5Q2AROE4Hnx7cenSktSnfU6WCnJgzYLSIHdbLs549LcZMULuVquw==
"@next/swc-linux-arm-gnueabihf@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.5-canary.2.tgz#c0c09a47599e05a945409a69efed9c065895a00a"
integrity sha512-Vfh4Orqzgtud/5UU2c7FfzmbOylWQYk5xQRN4XfnzHQSVkKwPVEnQnSKFHaon4Amhy5gdbxINFc1vi6lv3bZIA==
"@next/swc-linux-arm64-gnu@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.2.tgz#0e71db03b8b12ed315c8be7d15392ecefe562b7c"
integrity sha512-fjlYU1Y8kVjjRKyuyQBYLHPxjGOS2ox7U8TqAvtgKvd2PxqdsgW4sP+VDovRVPrZlGXNllKoJiqMO1OoR9fB6w==
"@next/swc-linux-arm64-gnu@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.5-canary.2.tgz#9e772be26fe7d3e5c50ead44808cbd17c37c0cc7"
integrity sha512-EzQOUFDruVVAXNnk8LPd0zEeZdegS70+pDnmheC/Ui4PCAOLpiWlxSzthOqq3NAHcNw+ThmQRZo8KcOg/mWuww==
"@next/swc-linux-arm64-musl@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.2.tgz#f1b055793da1c12167ed3b6e32aef8289721a1fb"
integrity sha512-Y1JRDMHqSjLObjyrD1hf6ePrJcOF/mkw+LbAzoNgrHL1dSuIAqcz3jYunJt8T7Yw48xSJy6LPSL9BclAHwEwOA==
"@next/swc-linux-arm64-musl@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.5-canary.2.tgz#11f7170cf0dacec683d09c297e51aa401677ce57"
integrity sha512-k6LYVBcpV86erVA+eIgm+rn/PyGXh0d3VEnAnLPheedjlFVbB5qAp2SSxo4zWrgmrGwfyRNLxcDniZiBagI8bA==
"@next/swc-linux-x64-gnu@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.2.tgz#69764ffaacb3b9b373897fff15d7dd871455efe2"
integrity sha512-5N4QSRT60ikQqCU8iHfYZzlhg6MFTLsKhMTARmhn8wLtZfN9VVyTFwZrJQWjV64dZc4JFeXDANGao8fm55y6bw==
"@next/swc-linux-x64-gnu@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.5-canary.2.tgz#b5ce502a7280e1eedd6b838fa0d3c059773c053c"
integrity sha512-HTX0gIxbBsqA4mGNszbQxhm4T73Z7QkRPqcRPy1gLIm5nspRiTDuv1p1JiewxsbIKsgl+z0u/y0CTM8kFnrqOg==
"@next/swc-linux-x64-musl@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.2.tgz#0ddaedb5ec578c01771f83be2046dafb2f70df91"
integrity sha512-b32F/xAgdYG4Pt0foFzhF+2uhvNxnEj7aJNp1R4EhZotdej2PzvFWcP/dGkc7MJl205pBz5oC3gHyILIIlW6XA==
"@next/swc-linux-x64-musl@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.5-canary.2.tgz#d797075956e2ef593bdc767cfd5a9c3f30339fd0"
integrity sha512-FuLRotgnYdix+lhFB89RU9C/RFOSpsdZa9h17eMKj+FKFQ44JfGGI14wbbxuJe+F6/52CGvOybpdIfYVkQYBcA==
"@next/swc-win32-arm64-msvc@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.2.tgz#9e17ed56d5621f8c6961193da3a0b155cea511c9"
integrity sha512-hVOcGmWDeVwO00Aclopsj6MoYhfJl5zA4vjAai9KjgclQTFZa/DC0vQjgKAHHKGT5oMHgjiq/G7L6P1/UfwYnw==
"@next/swc-win32-arm64-msvc@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.5-canary.2.tgz#82ca30d0e3d10c676e4d57ca8b1b75d22b0ce463"
integrity sha512-L9RkZqRweu16jWpJEYLi0yJAe3A+O5qMFv727cLhr6UpEgCl35YTTUm72k47IMr4N3i98Z31JihpaR1nc7TIIA==
"@next/swc-win32-ia32-msvc@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.2.tgz#ddd260cbe8bc4002fb54415b80baccf37f8db783"
integrity sha512-wnVDGIVz2pR3vIkyN6IE+1NvMSBrBj1jba11iR16m8TAPzZH/PrNsxr0a9N5VavEXXLcQpoUVvT+N7nflbRAHg==
"@next/swc-win32-ia32-msvc@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.5-canary.2.tgz#d094c84b21165d1bd38c4780544b8a71c138d725"
integrity sha512-uQdlN069FoKJbq9vupD4QklLhORJfRUU7UJV7W71JN9nkJJ84ky02FGLS8XNDz70LB2dHIfJyaC7jdikF38Yzw==
"@next/swc-win32-x64-msvc@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.2.tgz#37412a314bcf4c6006a74e1ef9764048344f3848"
integrity sha512-MLNcurEpQp0+7OU9261f7PkN52xTGkfrt4IYTIXau7DO/aHj927oK6piIJdl9EOHdX/KN5W6qlyErj170PSHtw==
"@next/swc-win32-x64-msvc@12.1.5-canary.2":
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.5-canary.2.tgz#1a90400e6cd9ff3f2cf87fc4f7243756cc57187e"
integrity sha512-4CcjiIgHjYT6otzt5VflWyqmoVKp1HljOxELoBhTROKQ87c6ytqndkQQx4wP2nvWux+biyukUqBGsV0BFOjwaQ==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@ -1373,71 +1373,71 @@
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.0.8.tgz#be3e914e84eacf16dbebd311c0d0b44aa1174c64"
integrity sha512-ZK5v4bJwgXldAUA8r3q9YKfCwOqoHTK/ZqRjSeRXQrBXWouoPnS4MQtgC4AXGiiBuUu5wxrRgTlv0ktmM4P1Aw==
"@sentry/core@6.19.3":
version "6.19.3"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.19.3.tgz#88268afc8c42716c455ad77bb4bed2bbf96abd83"
integrity sha512-RcGmYdkrE3VYBMl9Hgv4GKsC8FEVUdWYsfGIcT/btwP2YpBeUaTZl+1vV9r3Ncdl125LqzP5CKSj5otVxiEg6g==
"@sentry/core@6.19.4":
version "6.19.4"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.19.4.tgz#832d65ae32b4e2a63b9eccd6732b6dd6461620ae"
integrity sha512-LIUVqLyt9Ugj6xyQE9itrCmhFs1iQ2FOgVkmpsXu+UVwFY4xccT5k/0PAHa7sik5CeH6x7p8oRCrYgrwbktraQ==
dependencies:
"@sentry/hub" "6.19.3"
"@sentry/minimal" "6.19.3"
"@sentry/types" "6.19.3"
"@sentry/utils" "6.19.3"
"@sentry/hub" "6.19.4"
"@sentry/minimal" "6.19.4"
"@sentry/types" "6.19.4"
"@sentry/utils" "6.19.4"
tslib "^1.9.3"
"@sentry/hub@6.19.3":
version "6.19.3"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.19.3.tgz#d555c83404f19ac9b68f336b051b8e7a9d75feb0"
integrity sha512-iYbkrxEZt6CrHP3U3r54MARVZSs3YHjAMUMOTlC16s/Amz1McwV95XtI3NJaqMhwzl7R5vbGrs3xOtLg1V1Uyw==
"@sentry/hub@6.19.4":
version "6.19.4"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.19.4.tgz#81aeadceddcddc36fb4f5bb40cf6900f79e3e111"
integrity sha512-Lc9ZpKk9f8DBFvl7hm4wYvcuuobAee3X+M1eCMQPzYuk4k0mHThPv/d3GJW6Jo1IBxMbM+x3ONuf9myeJ/4H6g==
dependencies:
"@sentry/types" "6.19.3"
"@sentry/utils" "6.19.3"
"@sentry/types" "6.19.4"
"@sentry/utils" "6.19.4"
tslib "^1.9.3"
"@sentry/minimal@6.19.3":
version "6.19.3"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.19.3.tgz#b9b7f0d7f0cd2341b243318668ac01458f9d7889"
integrity sha512-xy/6ThHK8B2NJT98nWrx6V9eVgUbzq2N/8lv5/QqrKsICjxx22TRC8Q6zPg/o7BYcrY5vpugSEbIeErTnyxHDA==
"@sentry/minimal@6.19.4":
version "6.19.4"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.19.4.tgz#c98e5405eeaac1b4f6b6fdbc36abc3cf2c09a4ac"
integrity sha512-23Xwt5XoSEfswTWUJRofqtDU30bz+wzv5VLQlUsA65CD8kEDoajVFco9wnIxbauhb3xaU7+jhbyNHWO75mHnTQ==
dependencies:
"@sentry/hub" "6.19.3"
"@sentry/types" "6.19.3"
"@sentry/hub" "6.19.4"
"@sentry/types" "6.19.4"
tslib "^1.9.3"
"@sentry/node@^6.19.3":
version "6.19.3"
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.19.3.tgz#afcf106bf72acc0e4bbacbc54744de8a938cbd1c"
integrity sha512-eHreMMbaK4mMAQ45Ki2xJ6in02l66hL6xhltppy/h4m297JIvjaQAFpbQf5XLtO7W4KjdbSV5qnB45D1aOAzFA==
"@sentry/node@^6.19.4":
version "6.19.4"
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.19.4.tgz#b0c4971e0e416a7b03022eab1bac3f08923bac54"
integrity sha512-PP3xXqZq5Mt/f+j6OFHgl9Uu0oXVB9Hw9MK9SDcn7klIRwCBZpA14WA+NLVrEzBxA0baLE5sToeqmxjnCcCfpw==
dependencies:
"@sentry/core" "6.19.3"
"@sentry/hub" "6.19.3"
"@sentry/types" "6.19.3"
"@sentry/utils" "6.19.3"
"@sentry/core" "6.19.4"
"@sentry/hub" "6.19.4"
"@sentry/types" "6.19.4"
"@sentry/utils" "6.19.4"
cookie "^0.4.1"
https-proxy-agent "^5.0.0"
lru_map "^0.3.3"
tslib "^1.9.3"
"@sentry/tracing@^6.19.3":
version "6.19.3"
resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.19.3.tgz#dfdbd5019486c899bdf352b1152d5d253544ef70"
integrity sha512-3lyb4yCFH/ltEQSyKM96g2c74vvKIwByx8fLDS4FHYQQDXY+xPcs+zyK8L1Fs5PRFAUciEOK5TS9qwELom5K4w==
"@sentry/tracing@^6.19.4":
version "6.19.4"
resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.19.4.tgz#67fb3b331361fbb17d15cd294f2b1cf368f47980"
integrity sha512-ngkjX+BgoIPQaydLW+SWh2hAQgCGQZuimd5Hkwkt8GFfckZSTZtYw5X5nFk4U2L06FU8F4BmgnbyxXt5k7IziA==
dependencies:
"@sentry/hub" "6.19.3"
"@sentry/minimal" "6.19.3"
"@sentry/types" "6.19.3"
"@sentry/utils" "6.19.3"
"@sentry/hub" "6.19.4"
"@sentry/minimal" "6.19.4"
"@sentry/types" "6.19.4"
"@sentry/utils" "6.19.4"
tslib "^1.9.3"
"@sentry/types@6.19.3":
version "6.19.3"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.3.tgz#94b19da68d4d23561efb1014f72968bcea85cd0c"
integrity sha512-jHhqxp8MIWSfOc3krorirTGKTEaSFO6XrAvi+2AZhr6gvOChwOgzgrN2ZqesJcZmgCsqWV21u3usSwYeRrjOJA==
"@sentry/types@6.19.4":
version "6.19.4"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.4.tgz#4e13269daaba2edfeaa4b18a5a14fa8f4d7a85a8"
integrity sha512-fzLiQPrjJQ8HgFgA2VqnpLiEOrTJ2ItRY8RY7Cn4038HACoYWYDjrkdVJQBq6IyrxxkgWOSLZXnv85uozBQC+g==
"@sentry/utils@6.19.3":
version "6.19.3"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.19.3.tgz#0c3a3f0b86c12e3b079e56e37a44e62a1226043d"
integrity sha512-GdC9B/FK7qd0zItY43135bYbhuVSawE18bIrQDNuno8gTpDJ5OgShpTN9zR53AmMh16/lwKNnV3ZZjlpKcxuNw==
"@sentry/utils@6.19.4":
version "6.19.4"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.19.4.tgz#a104e7e9a21555190da68dbbfb925f887423ef85"
integrity sha512-f73K3NCX22KT8CVgIiRaaozIReSX5+LhY7Q4C429DZlfVAgOYw0a+kTFrHTNKGLR4II8M8ECjUsL/6O/BdPSFg==
dependencies:
"@sentry/types" "6.19.3"
"@sentry/types" "6.19.4"
tslib "^1.9.3"
"@stitches/react@^1.2.7":
@ -1714,14 +1714,14 @@
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d"
integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==
"@typescript-eslint/eslint-plugin@^5.17.0":
version "5.17.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz#704eb4e75039000531255672bf1c85ee85cf1d67"
integrity sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==
"@typescript-eslint/eslint-plugin@^5.18.0":
version "5.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz#950df411cec65f90d75d6320a03b2c98f6c3af7d"
integrity sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==
dependencies:
"@typescript-eslint/scope-manager" "5.17.0"
"@typescript-eslint/type-utils" "5.17.0"
"@typescript-eslint/utils" "5.17.0"
"@typescript-eslint/scope-manager" "5.18.0"
"@typescript-eslint/type-utils" "5.18.0"
"@typescript-eslint/utils" "5.18.0"
debug "^4.3.2"
functional-red-black-tree "^1.0.1"
ignore "^5.1.8"
@ -1739,14 +1739,14 @@
"@typescript-eslint/typescript-estree" "5.10.1"
debug "^4.3.2"
"@typescript-eslint/parser@^5.17.0":
version "5.17.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.17.0.tgz#7def77d5bcd8458d12d52909118cf3f0a45f89d5"
integrity sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==
"@typescript-eslint/parser@^5.18.0":
version "5.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.18.0.tgz#2bcd4ff21df33621df33e942ccb21cb897f004c6"
integrity sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==
dependencies:
"@typescript-eslint/scope-manager" "5.17.0"
"@typescript-eslint/types" "5.17.0"
"@typescript-eslint/typescript-estree" "5.17.0"
"@typescript-eslint/scope-manager" "5.18.0"
"@typescript-eslint/types" "5.18.0"
"@typescript-eslint/typescript-estree" "5.18.0"
debug "^4.3.2"
"@typescript-eslint/scope-manager@5.10.1":
@ -1757,20 +1757,20 @@
"@typescript-eslint/types" "5.10.1"
"@typescript-eslint/visitor-keys" "5.10.1"
"@typescript-eslint/scope-manager@5.17.0":
version "5.17.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz#4cea7d0e0bc0e79eb60cad431c89120987c3f952"
integrity sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==
"@typescript-eslint/scope-manager@5.18.0":
version "5.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz#a7d7b49b973ba8cebf2a3710eefd457ef2fb5505"
integrity sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==
dependencies:
"@typescript-eslint/types" "5.17.0"
"@typescript-eslint/visitor-keys" "5.17.0"
"@typescript-eslint/types" "5.18.0"
"@typescript-eslint/visitor-keys" "5.18.0"
"@typescript-eslint/type-utils@5.17.0":
version "5.17.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz#1c4549d68c89877662224aabb29fbbebf5fc9672"
integrity sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==
"@typescript-eslint/type-utils@5.18.0":
version "5.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz#62dbfc8478abf36ba94a90ddf10be3cc8e471c74"
integrity sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==
dependencies:
"@typescript-eslint/utils" "5.17.0"
"@typescript-eslint/utils" "5.18.0"
debug "^4.3.2"
tsutils "^3.21.0"
@ -1779,10 +1779,10 @@
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.1.tgz#dca9bd4cb8c067fc85304a31f38ec4766ba2d1ea"
integrity sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q==
"@typescript-eslint/types@5.17.0":
version "5.17.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.17.0.tgz#861ec9e669ffa2aa9b873dd4d28d9b1ce26d216f"
integrity sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==
"@typescript-eslint/types@5.18.0":
version "5.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.18.0.tgz#4f0425d85fdb863071680983853c59a62ce9566e"
integrity sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==
"@typescript-eslint/typescript-estree@5.10.1":
version "5.10.1"
@ -1797,28 +1797,28 @@
semver "^7.3.5"
tsutils "^3.21.0"
"@typescript-eslint/typescript-estree@5.17.0":
version "5.17.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz#a7cba7dfc8f9cc2ac78c18584e684507df4f2488"
integrity sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==
"@typescript-eslint/typescript-estree@5.18.0":
version "5.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz#6498e5ee69a32e82b6e18689e2f72e4060986474"
integrity sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==
dependencies:
"@typescript-eslint/types" "5.17.0"
"@typescript-eslint/visitor-keys" "5.17.0"
"@typescript-eslint/types" "5.18.0"
"@typescript-eslint/visitor-keys" "5.18.0"
debug "^4.3.2"
globby "^11.0.4"
is-glob "^4.0.3"
semver "^7.3.5"
tsutils "^3.21.0"
"@typescript-eslint/utils@5.17.0":
version "5.17.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.17.0.tgz#549a9e1d491c6ccd3624bc3c1b098f5cfb45f306"
integrity sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==
"@typescript-eslint/utils@5.18.0":
version "5.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.18.0.tgz#27fc84cf95c1a96def0aae31684cb43a37e76855"
integrity sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==
dependencies:
"@types/json-schema" "^7.0.9"
"@typescript-eslint/scope-manager" "5.17.0"
"@typescript-eslint/types" "5.17.0"
"@typescript-eslint/typescript-estree" "5.17.0"
"@typescript-eslint/scope-manager" "5.18.0"
"@typescript-eslint/types" "5.18.0"
"@typescript-eslint/typescript-estree" "5.18.0"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
@ -1830,12 +1830,12 @@
"@typescript-eslint/types" "5.10.1"
eslint-visitor-keys "^3.0.0"
"@typescript-eslint/visitor-keys@5.17.0":
version "5.17.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz#52daae45c61b0211b4c81b53a71841911e479128"
integrity sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==
"@typescript-eslint/visitor-keys@5.18.0":
version "5.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz#c7c07709823804171d569017f3b031ced7253e60"
integrity sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==
dependencies:
"@typescript-eslint/types" "5.17.0"
"@typescript-eslint/types" "5.18.0"
eslint-visitor-keys "^3.0.0"
acorn-jsx@^5.0.0, acorn-jsx@^5.3.1:
@ -1941,7 +1941,7 @@ aria-query@^4.2.2:
"@babel/runtime" "^7.10.2"
"@babel/runtime-corejs3" "^7.10.2"
array-includes@^3.1.3, array-includes@^3.1.4:
array-includes@^3.1.4:
version "3.1.4"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9"
integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==
@ -2125,9 +2125,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001283, caniuse-lite@^1.0.30001317:
version "1.0.30001322"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001322.tgz#2e4c09d11e1e8f852767dab287069a8d0c29d623"
integrity sha512-neRmrmIrCGuMnxGSoh+x7zYtQFFgnSY2jaomjU56sCkTA6JINqQrxutF459JpWcWRajvoyn95sOXq4Pqrnyjew==
version "1.0.30001325"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz#2b4ad19b77aa36f61f2eaf72e636d7481d55e606"
integrity sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==
ccount@^1.0.0:
version "1.1.0"
@ -2389,9 +2389,9 @@ css-tree@^1.1.2, css-tree@^1.1.3:
source-map "^0.6.1"
css-what@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.0.1.tgz#3be33be55b9f302f710ba3a9c3abc1e2a63fc7eb"
integrity sha512-z93ZGFLNc6yaoXAmVhqoSIb+BduplteCt1fepvwhBUQK6MNE4g6fgjpuZKJKp0esUe+vXWlIkwZZjNWoOKw0ZA==
version "6.1.0"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
csso@^4.2.0:
version "4.2.0"
@ -2415,6 +2415,11 @@ data-uri-to-buffer@^4.0.0:
resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b"
integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==
date-fns-tz@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.3.3.tgz#7884a4b3ed6cd95bfd81831d608e5ef8be500c86"
integrity sha512-Gks46gwbSauBQnV3Oofluj1wTm8J0tM7sbSJ9P+cJq/ZnTCpMohTKmmO5Tn+jQ7dyn0+b8G7cY4O2DZ5P/LXcA==
date-fns@^2.28.0:
version "2.28.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2"
@ -2557,9 +2562,9 @@ eastasianwidth@^0.2.0:
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
electron-to-chromium@^1.4.84:
version "1.4.100"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.100.tgz#da82de8a19a47ea3dcdf141dde85355942fbc4e7"
integrity sha512-pNrSE2naf8fizl6/Uxq8UbKb8hU9EiYW4OzCYswosXoLV5NTMOUVKECNzDaHiUubsPq/kAckOzZd7zd8S8CHVw==
version "1.4.104"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.104.tgz#60973b0a7d398efa877196e8ccb0c93d48b918d8"
integrity sha512-2kjoAyiG7uMyGRM9mx25s3HAzmQG2ayuYXxsFmYugHSDcwxREgLtscZvbL1JcW9S/OemeQ3f/SG6JhDwpnCclQ==
emoji-regex@^8.0.0:
version "8.0.0"
@ -2636,11 +2641,6 @@ escalade@^3.1.1:
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
escape-goat@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081"
integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@ -2656,12 +2656,12 @@ escape-string-regexp@^5.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8"
integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==
eslint-config-next@12.1.2:
version "12.1.2"
resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.1.2.tgz#be3c974598a5697bfde3f8dc19eaa85760bb871a"
integrity sha512-nJgSIB5lXoOsS2yY90i5L5ucI1uko+ykhcQkGkydXqs5GdPprY8Y1NKWW3N0OEzQvFyBcf7GHb/ohB21HoeEsg==
eslint-config-next@12.1.5-canary.2:
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.1.5-canary.2.tgz#f6e4da263a527543b62ed368b6277c08eb10445d"
integrity sha512-mS1C4hrm+k7L3qjrztwA8kc3kir7VB8uDBeEYSMnd+aMidvgHp+QPP8F04TQsvmRdozOvWoDmbLuUTqLHYUpOA==
dependencies:
"@next/eslint-plugin-next" "12.1.2"
"@next/eslint-plugin-next" "12.1.5-canary.2"
"@rushstack/eslint-patch" "1.0.8"
"@typescript-eslint/parser" "5.10.1"
eslint-import-resolver-node "0.3.4"
@ -3251,9 +3251,9 @@ globby@^11.0.4:
slash "^3.0.0"
graceful-fs@^4.2.4:
version "4.2.9"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
version "4.2.10"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
gray-matter@^4.0.3:
version "4.0.3"
@ -3595,9 +3595,9 @@ is-negative-zero@^2.0.2:
integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
is-number-object@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==
version "1.0.7"
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
dependencies:
has-tostringtag "^1.0.0"
@ -3637,9 +3637,11 @@ is-regex@^1.1.4:
has-tostringtag "^1.0.0"
is-shared-array-buffer@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
dependencies:
call-bind "^1.0.2"
is-stream@^2.0.0:
version "2.0.1"
@ -3740,11 +3742,11 @@ json5@^2.1.2:
integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b"
integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==
version "3.2.2"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz#6ab1e52c71dfc0c0707008a91729a9491fe9f76c"
integrity sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==
dependencies:
array-includes "^3.1.3"
array-includes "^3.1.4"
object.assign "^4.1.2"
kind-of@^6.0.0, kind-of@^6.0.2:
@ -4603,25 +4605,25 @@ next-compose-plugins@^2.2.1:
resolved "https://registry.yarnpkg.com/next-compose-plugins/-/next-compose-plugins-2.2.1.tgz#020fc53f275a7e719d62521bef4300fbb6fde5ab"
integrity sha512-OjJ+fV15FXO2uQXQagLD4C0abYErBjyjE0I0FHpOEIB8upw0hg1ldFP6cqHTJBH1cZqy96OeR3u1dJ+Ez2D4Bg==
next-mdx-remote@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/next-mdx-remote/-/next-mdx-remote-4.0.2.tgz#56c315819e6704dfb1fe68ce2f5ed0d315c34528"
integrity sha512-1cZM2xm+G1FyYodGt92lCXisP0owPeppVHeH5TIaXUGdt6ENBZYOxLNFaVl9fkS9wP/s2sLcC9m2c1iLH2H4rA==
next-mdx-remote@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/next-mdx-remote/-/next-mdx-remote-4.0.1.tgz#9dfdb2198cd139f8691e82912aa8125b5bf74ff1"
integrity sha512-voQce8q4uFAArDJYNvpgMcJi9KaWuXpaGKQvaBJGVSzmLGMSBZbM+3F7s8Iflg6o9phn+G0hUUpHKagbRa1BQA==
dependencies:
"@mdx-js/mdx" "^2.0.0"
"@mdx-js/react" "^2.0.0"
vfile "^5.3.0"
vfile-matter "^3.0.1"
next-seo@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-5.3.0.tgz#35a8c3ebb9898fd2ac4c8208de360feed3756bf8"
integrity sha512-ofXUGGZ4l6j4oCxu6aecTWTkNbN/g+zbYUOvLRBKl96bJrt+WWyo4riRxQqqczvk1niGH4ibN7cCEwVjlYZs2g==
next-seo@^5.4.0:
version "5.4.0"
resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-5.4.0.tgz#37a7784b30b3f70cec3fa0d77f9dde5990822d24"
integrity sha512-R9DhajPwJnR/lsF2hZ8cN8uqr5CVITsRrCG1AF5+ufcaybKYOvnH8sH9MaH4/hpkps3PQ9H71S7J7SPYixAYzQ==
next-sitemap@^2.5.17:
version "2.5.17"
resolved "https://registry.yarnpkg.com/next-sitemap/-/next-sitemap-2.5.17.tgz#1d1360a0ae188adb13ae8e3ea47351c4284805fd"
integrity sha512-L0zwaqt5WBm8FL/mraA08YbsJD+dnc2gYO1FeawBVUDvFKDXhYXQBTAT2AbkXwCnKinM94/VvBQvw3n8LC9TpA==
next-sitemap@^2.5.18:
version "2.5.18"
resolved "https://registry.yarnpkg.com/next-sitemap/-/next-sitemap-2.5.18.tgz#7542df7ad7954d9b5065e28d0a565893f8c1fe43"
integrity sha512-zFrlX0oiTA0078jWHY9KPsMfW1dkwHegi9SChUQiJCgJNwDpV/B2JWZQjZYWTRgwIWgBo/qgojKyp503vZYQTg==
dependencies:
"@corex/deepmerge" "^2.6.148"
minimist "^1.2.6"
@ -4634,29 +4636,28 @@ next-transpile-modules@^9.0.0:
enhanced-resolve "^5.7.0"
escalade "^3.1.1"
next@12.1.2:
version "12.1.2"
resolved "https://registry.yarnpkg.com/next/-/next-12.1.2.tgz#c5376a8ae17d3e404a2b691c01f94c8943306f29"
integrity sha512-JHPCsnFTBO0Z4SQxSYc611UA1WA+r/3y3Neg66AH5/gSO/oksfRnFw/zGX/FZ9+oOUHS9y3wJFawNpVYR2gJSQ==
next@12.1.5-canary.2:
version "12.1.5-canary.2"
resolved "https://registry.yarnpkg.com/next/-/next-12.1.5-canary.2.tgz#af99fe07100f370c5dc7bb3c4b01b562acb48be7"
integrity sha512-ZXsjpFqmdXon8kaK0XsGdctJhuf+ggHNdVjpNN4N5HlT8Rjx4llGqU0hrg+FakjDj3ODEFQASvYcEYQIieFRyA==
dependencies:
"@next/env" "12.1.2"
"@next/env" "12.1.5-canary.2"
caniuse-lite "^1.0.30001283"
postcss "8.4.5"
styled-jsx "5.0.1"
use-subscription "1.5.1"
optionalDependencies:
"@next/swc-android-arm-eabi" "12.1.2"
"@next/swc-android-arm64" "12.1.2"
"@next/swc-darwin-arm64" "12.1.2"
"@next/swc-darwin-x64" "12.1.2"
"@next/swc-linux-arm-gnueabihf" "12.1.2"
"@next/swc-linux-arm64-gnu" "12.1.2"
"@next/swc-linux-arm64-musl" "12.1.2"
"@next/swc-linux-x64-gnu" "12.1.2"
"@next/swc-linux-x64-musl" "12.1.2"
"@next/swc-win32-arm64-msvc" "12.1.2"
"@next/swc-win32-ia32-msvc" "12.1.2"
"@next/swc-win32-x64-msvc" "12.1.2"
"@next/swc-android-arm-eabi" "12.1.5-canary.2"
"@next/swc-android-arm64" "12.1.5-canary.2"
"@next/swc-darwin-arm64" "12.1.5-canary.2"
"@next/swc-darwin-x64" "12.1.5-canary.2"
"@next/swc-linux-arm-gnueabihf" "12.1.5-canary.2"
"@next/swc-linux-arm64-gnu" "12.1.5-canary.2"
"@next/swc-linux-arm64-musl" "12.1.5-canary.2"
"@next/swc-linux-x64-gnu" "12.1.5-canary.2"
"@next/swc-linux-x64-musl" "12.1.5-canary.2"
"@next/swc-win32-arm64-msvc" "12.1.5-canary.2"
"@next/swc-win32-ia32-msvc" "12.1.5-canary.2"
"@next/swc-win32-x64-msvc" "12.1.5-canary.2"
node-abort-controller@^3.0.1:
version "3.0.1"
@ -5013,14 +5014,13 @@ queue-microtask@^1.2.2:
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
react-dom@17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
react-dom@18.0.0:
version "18.0.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.0.0.tgz#26b88534f8f1dbb80853e1eabe752f24100d8023"
integrity sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
scheduler "^0.20.2"
scheduler "^0.21.0"
react-fast-compare@^2.0.1:
version "2.0.4"
@ -5047,10 +5047,10 @@ react-intersection-observer@^8.33.1:
resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-8.33.1.tgz#8e6442cac7052ed63056e191b7539e423e7d5c64"
integrity sha512-3v+qaJvp3D1MlGHyM+KISVg/CMhPiOlO6FgPHcluqHkx4YFCLuyXNlQ/LE6UkbODXlQcLOppfX6UMxCEkUhDLw==
react-is@17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
react-is@18.0.0:
version "18.0.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.0.0.tgz#026f6c4a27dbe33bf4a35655b9e1327c4e55e3f5"
integrity sha512-yUcBYdBBbo3QiPsgYDcfQcIkGZHfxOaoE6HLSnr1sPzMhdyxusbfKOSUbSd/ocGi32dxcj366PsTj+5oggeKKw==
react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1"
@ -5084,13 +5084,12 @@ react-twitter-embed@^4.0.4:
dependencies:
scriptjs "^2.5.9"
react@17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
react@18.0.0:
version "18.0.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96"
integrity sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
reading-time@^1.5.0:
version "1.5.0"
@ -5229,9 +5228,9 @@ remark-mdx@^1.6.22:
unified "9.2.0"
remark-mdx@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.1.0.tgz#ae29ccd4c974a39ca671cd533acf9c7560a8bba4"
integrity sha512-J6Yqw566SaEy6A9Neni1JJTaEjbjsM3OsKqL04TtCvZhevRtFi8CG8GIQPzvxIRKRCAOnWw1Vpk1AInB1OpNqA==
version "2.1.1"
resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.1.1.tgz#14021be9ecbc9ad0310f4240980221328aa7ed55"
integrity sha512-0wXdEITnFyjLquN3VvACNLzbGzWM5ujzTvfgOkONBZgSFJ7ezLLDaTWqf6H9eUgVITEP8asp6LJ0W/X090dXBg==
dependencies:
mdast-util-mdx "^2.0.0"
micromark-extension-mdxjs "^1.0.0"
@ -5402,13 +5401,12 @@ sax@^1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
scheduler@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
scheduler@^0.21.0:
version "0.21.0"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820"
integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
scriptjs@^2.5.9:
version "2.5.9"
@ -5998,9 +5996,9 @@ unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0:
"@types/unist" "^2.0.0"
unist-util-position@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.2.tgz#1915816906a3503f3e40d65b6e4fe6d41845d2e3"
integrity sha512-Y6+plxR41dOLbyyqVDLuGWgXDmxdXslCSRYQkSDagBnOT9oFsQH0J8FzhirSklUEe0xZTT0WDnAE1gXPaDFljA==
version "4.0.3"
resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.3.tgz#5290547b014f6222dff95c48d5c3c13a88fadd07"
integrity sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==
dependencies:
"@types/unist" "^2.0.0"
@ -6102,9 +6100,9 @@ use-composed-ref@^1.0.0:
integrity sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==
use-isomorphic-layout-effect@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225"
integrity sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==
version "1.1.2"
resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb"
integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==
use-latest@^1.0.0:
version "1.2.0"
@ -6113,13 +6111,6 @@ use-latest@^1.0.0:
dependencies:
use-isomorphic-layout-effect "^1.0.0"
use-subscription@1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1"
integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==
dependencies:
object-assign "^4.1.1"
util-deprecate@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"