1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-06-30 22:46:39 -04:00

update component prop types to use JSX.IntrinsicElements

This commit is contained in:
2022-02-09 09:37:20 -05:00
parent f205a14bdc
commit 885f97fa64
40 changed files with 280 additions and 275 deletions

View File

@ -12,12 +12,12 @@ I keep an ongoing list of [post ideas](https://github.com/jakejarvis/jarv.is/iss
## 🧶 Getting Started
Run `yarn install` and `yarn dev`, then open [http://localhost:3000/](http://localhost:3000/) or the outputted URL. ([Yarn must be installed](https://yarnpkg.com/en/docs/install) first; NPM _should_ also work at your own risk.) Pages will live-refresh when source files are changed.
Run `yarn install` and `yarn dev`, then open [http://localhost:3000/](http://localhost:3000/). ([Yarn must be installed](https://yarnpkg.com/en/docs/install) first; NPM _should_ also work at your own risk.) Pages will live-refresh when source files are changed.
## 🌎 Related
- [💻 /uses](https://jarv.is/uses/) Things and stuff I use.
- [🕰️ Previously on...](https://jarv.is/previously/) An embarrassing trip down this site's memory lane.
- [🕰️ Previously on...](https://jarv.is/previously/) An embarrassing trip down this site's memory lane. (Try out [/y2k](https://jarv.is/y2k/) if you want to experience the _fully_ immersive time machine...)
- [🧅 Tor (.onion) mirror](http://jarvis2i2vp4j4tbxjogsnqdemnte5xhzyi7hziiyzxwge3hzmh57zad.onion/) For an excessive level of privacy and security.
- [📈 Fathom Analytics dashboard](https://jarv.is/stats/)
- [🧮 jakejarvis/website-stats](https://github.com/jakejarvis/website-stats) Daily snapshots of the raw [hit counter](pages/api/hits.ts) data.

View File

@ -1,11 +1,10 @@
import classNames from "classnames";
import type { HTMLAttributes } from "react";
import styles from "./Blockquote.module.css";
type Props = HTMLAttributes<HTMLElement>;
type BlockquoteProps = JSX.IntrinsicElements["blockquote"];
const Blockquote = ({ className, ...rest }: Props) => (
const Blockquote = ({ className, ...rest }: BlockquoteProps) => (
<blockquote className={classNames(styles.blockquote, className)} {...rest} />
);

View File

@ -1,9 +1,9 @@
import { memo } from "react";
import css from "styled-jsx/css";
import classNames from "classnames";
import Link, { Props as CustomLinkProps } from "../Link/Link";
import Link, { CustomLinkProps } from "../Link/Link";
type Props = CustomLinkProps & {
type ColorfulLinkProps = CustomLinkProps & {
lightColor: string;
darkColor: string;
};
@ -21,7 +21,7 @@ const getLinearGradient = (hex: string, alpha = 0.4) => {
return `linear-gradient(${rgbaString},${rgbaString})`;
};
const ColorfulLink = ({ lightColor, darkColor, className, ...rest }: Props) => {
const ColorfulLink = ({ lightColor, darkColor, className, ...rest }: ColorfulLinkProps) => {
const { className: underlineClassName, styles: underlineStyles } = css.resolve`
a {
color: ${lightColor};

View File

@ -3,17 +3,17 @@ import { useTheme } from "next-themes";
import classNames from "classnames";
import { Giscus } from "@giscus/react";
import { giscusConfig } from "../../lib/config";
import type { PropsWithChildren, HTMLAttributes } from "react";
import type { PropsWithChildren } from "react";
import type { GiscusProps } from "@giscus/react";
import styles from "./Comments.module.css";
type Props = HTMLAttributes<HTMLDivElement> &
type CommentsProps = JSX.IntrinsicElements["div"] &
PropsWithChildren<{
title: string;
}>;
const Comments = ({ title, className, ...rest }: Props) => {
const Comments = ({ title, className, ...rest }: CommentsProps) => {
const { resolvedTheme } = useTheme();
return (

View File

@ -5,16 +5,11 @@ import { Formik, Form, Field } from "formik";
import HCaptcha from "@hcaptcha/react-hcaptcha";
import Link from "../Link/Link";
import { SendIcon, CheckOcticon, XOcticon } from "../Icons";
import type { FormikHelpers } from "formik";
import styles from "./ContactForm.module.css";
const cx = classNames.bind(styles);
type Props = {
className?: string;
};
type Values = {
name: string;
email: string;
@ -22,7 +17,11 @@ type Values = {
"h-captcha-response": string;
};
const ContactForm = ({ className }: Props) => {
type ContactFormProps = {
className?: string;
};
const ContactForm = ({ className }: ContactFormProps) => {
const { resolvedTheme } = useTheme();
// status/feedback:

View File

@ -1,10 +1,11 @@
import classNames from "classnames";
import type { HTMLAttributes } from "react";
import styles from "./Content.module.css";
type Props = HTMLAttributes<HTMLDivElement>;
type ContentProps = JSX.IntrinsicElements["div"];
const Content = ({ className, ...rest }: Props) => <div className={classNames(styles.content, className)} {...rest} />;
const Content = ({ className, ...rest }: ContentProps) => (
<div className={classNames(styles.content, className)} {...rest} />
);
export default Content;

View File

@ -8,14 +8,14 @@ import type { ReactNode, Ref } from "react";
import styles from "./CopyButton.module.css";
const cx = classNames.bind(styles);
type Props = {
type CopyButtonProps = {
source: ReactNode;
timeout?: number;
className?: string;
};
const CopyButton = forwardRef(function CopyButton(
{ source, timeout = 2000, className }: Props,
{ source, timeout = 2000, className }: CopyButtonProps,
ref: Ref<HTMLButtonElement>
) {
const [copied, setCopied] = useState(false);

View File

@ -6,12 +6,12 @@ import type { ImageProps as NextImageProps } from "next/image";
import styles from "./Figure.module.css";
type Props = Omit<NextImageProps, "alt"> &
type FigureProps = Omit<NextImageProps, "alt"> &
PropsWithChildren<{
alt?: string; // becomes optional -- pulled from plaintext-ified caption if missing
}>;
const Figure = ({ children, alt, className, ...imageProps }: Props) => {
const Figure = ({ children, alt, className, ...imageProps }: FigureProps) => {
return (
<figure className={classNames(styles.figure, className)}>
<Image alt={alt || innerText(children)} {...imageProps} />

View File

@ -3,13 +3,12 @@ import Link from "next/link";
import classNames from "classnames";
import { HeartIcon, NextjsLogo } from "../Icons";
import * as config from "../../lib/config";
import type { HTMLAttributes } from "react";
import styles from "./Footer.module.css";
type Props = HTMLAttributes<HTMLDivElement>;
type FooterProps = JSX.IntrinsicElements["div"];
const Footer = ({ className, ...rest }: Props) => (
const Footer = ({ className, ...rest }: FooterProps) => (
<footer className={classNames(styles.footer, className)} {...rest}>
<div className={styles.row}>
<div className={styles.license}>

View File

@ -2,13 +2,12 @@ import { memo } from "react";
import classNames from "classnames";
import Selfie from "../Selfie/Selfie";
import Menu from "../Menu/Menu";
import type { HTMLAttributes } from "react";
import styles from "./Header.module.css";
type Props = HTMLAttributes<HTMLDivElement>;
type HeaderProps = JSX.IntrinsicElements["div"];
const Header = ({ className }: Props) => (
const Header = ({ className }: HeaderProps) => (
<header className={classNames(styles.header, className)}>
<nav className={styles.nav}>
<Selfie className={styles.selfie} />

View File

@ -3,11 +3,11 @@ import type { HTMLAttributes } from "react";
import styles from "./Heading.module.css";
type Props = HTMLAttributes<HTMLHeadingElement> & {
type HeadingProps = HTMLAttributes<HTMLHeadingElement> & {
as: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
};
const Heading = ({ as: Component, id, className, children, ...rest }: Props) => {
const Heading = ({ as: Component, id, className, children, ...rest }: HeadingProps) => {
return (
<Component className={classNames(styles.heading, styles[Component], className)} id={id} {...rest}>
{children}
@ -20,11 +20,11 @@ const Heading = ({ as: Component, id, className, children, ...rest }: Props) =>
);
};
export const H1 = (props: Omit<Props, "as">) => <Heading as="h1" {...props} />;
export const H2 = (props: Omit<Props, "as">) => <Heading as="h2" {...props} />;
export const H3 = (props: Omit<Props, "as">) => <Heading as="h3" {...props} />;
export const H4 = (props: Omit<Props, "as">) => <Heading as="h4" {...props} />;
export const H5 = (props: Omit<Props, "as">) => <Heading as="h5" {...props} />;
export const H6 = (props: Omit<Props, "as">) => <Heading as="h6" {...props} />;
export const H1 = (props: Omit<HeadingProps, "as">) => <Heading as="h1" {...props} />;
export const H2 = (props: Omit<HeadingProps, "as">) => <Heading as="h2" {...props} />;
export const H3 = (props: Omit<HeadingProps, "as">) => <Heading as="h3" {...props} />;
export const H4 = (props: Omit<HeadingProps, "as">) => <Heading as="h4" {...props} />;
export const H5 = (props: Omit<HeadingProps, "as">) => <Heading as="h5" {...props} />;
export const H6 = (props: Omit<HeadingProps, "as">) => <Heading as="h6" {...props} />;
export default Heading;

View File

@ -2,12 +2,12 @@ import useSWR from "swr";
import Loading from "../Loading/Loading";
import { fetcher } from "../../lib/fetcher";
type Props = {
type HitCounterProps = {
slug: string;
className?: string;
};
const HitCounter = ({ slug, className }: Props) => {
const HitCounter = ({ slug, className }: HitCounterProps) => {
// start fetching repos from API immediately
const { data, error } = useSWR(`/api/hits/?slug=${encodeURIComponent(slug)}`, fetcher, {
// avoid double (or more) counting views

View File

@ -1,10 +1,11 @@
import classNames from "classnames";
import type { HTMLAttributes } from "react";
import styles from "./HorizontalRule.module.css";
type Props = HTMLAttributes<HTMLHRElement>;
type HorizontalRuleProps = JSX.IntrinsicElements["hr"];
const HorizontalRule = ({ className, ...rest }: Props) => <hr className={classNames(styles.hr, className)} {...rest} />;
const HorizontalRule = ({ className, ...rest }: HorizontalRuleProps) => (
<hr className={classNames(styles.hr, className)} {...rest} />
);
export default HorizontalRule;

View File

@ -1,9 +1,8 @@
import classNames from "classnames";
import { HTMLAttributes } from "react";
import styles from "./IFrame.module.css";
type Props = HTMLAttributes<HTMLIFrameElement> & {
type IFrameProps = JSX.IntrinsicElements["iframe"] & {
src: string;
height: number;
width?: number; // defaults to 100%
@ -11,7 +10,7 @@ type Props = HTMLAttributes<HTMLIFrameElement> & {
noScroll?: boolean;
};
const IFrame = ({ src, title, height, width, allowScripts, noScroll, className, ...rest }: Props) => (
const IFrame = ({ src, title, height, width, allowScripts, noScroll, className, ...rest }: IFrameProps) => (
<iframe
className={classNames(styles.frame, className)}
src={src}

View File

@ -5,16 +5,16 @@ import classNames from "classnames";
import Header from "../Header/Header";
import Footer from "../Footer/Footer";
import themes, { toCSS } from "../../lib/themes";
import type { PropsWithChildren, HTMLAttributes } from "react";
import type { PropsWithChildren } from "react";
import styles from "./Layout.module.css";
type Props = HTMLAttributes<HTMLDivElement> &
type LayoutProps = JSX.IntrinsicElements["div"] &
PropsWithChildren<{
noContainer?: boolean; // pass true to disable default `<main>` container styles with padding, etc.
}>;
const Layout = ({ noContainer, className, children, ...rest }: Props) => {
const Layout = ({ noContainer, className, children, ...rest }: LayoutProps) => {
const { resolvedTheme } = useTheme();
return (

View File

@ -1,13 +1,13 @@
import NextLink from "next/link";
import classNames from "classnames";
import isAbsoluteUrl from "is-absolute-url";
import type { AnchorHTMLAttributes, PropsWithChildren } from "react";
import type { LinkProps } from "next/link";
import type { PropsWithChildren } from "react";
import type { LinkProps as NextLinkProps } from "next/link";
import styles from "./Link.module.css";
export type Props = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "href"> &
LinkProps &
export type CustomLinkProps = Omit<JSX.IntrinsicElements["a"], "href"> &
NextLinkProps &
PropsWithChildren<{
forceNewWindow?: boolean;
}>;
@ -21,7 +21,7 @@ const CustomLink = ({
forceNewWindow,
className,
...rest
}: Props) => {
}: CustomLinkProps) => {
// this component auto-detects whether or not we should use a normal HTML anchor externally or next/link internally,
// can be overridden with `forceNewWindow={true}`.
if (forceNewWindow || isAbsoluteUrl(href.toString())) {

View File

@ -1,16 +1,15 @@
import classNames from "classnames";
import type { HTMLAttributes } from "react";
import styles from "./List.module.css";
export const UnorderedList = ({ className, ...rest }: HTMLAttributes<HTMLUListElement>) => (
export const UnorderedList = ({ className, ...rest }: JSX.IntrinsicElements["ul"]) => (
<ul className={classNames(styles.unordered, className)} {...rest} />
);
export const OrderedList = ({ className, ...rest }: HTMLAttributes<HTMLOListElement>) => (
export const OrderedList = ({ className, ...rest }: JSX.IntrinsicElements["ol"]) => (
<ol className={classNames(styles.ordered, className)} {...rest} />
);
// TODO: this is based on good faith that the children are all `<li>`s...
export const ListItem = ({ className, ...rest }: HTMLAttributes<HTMLLIElement>) => (
export const ListItem = ({ className, ...rest }: JSX.IntrinsicElements["li"]) => (
<li className={classNames(styles.item, className)} {...rest} />
);

View File

@ -3,14 +3,14 @@ import classNames from "classnames";
import styles from "./Loading.module.css";
type Props = {
type LoadingProps = {
width: number; // of entire container, in pixels
boxes?: number; // total number of boxes (default: 3)
timing?: number; // staggered timing between each box's pulse, in seconds (default: 0.1s)
className?: string;
};
const Loading = ({ width, boxes = 3, timing = 0.1, className }: Props) => {
const Loading = ({ width, boxes = 3, timing = 0.1, className }: LoadingProps) => {
// each box is just an empty div
const divs = [];

View File

@ -7,7 +7,7 @@ import { HomeIcon, NotesIcon, ProjectsIcon, ContactIcon } from "../Icons";
import styles from "./Menu.module.css";
type Props = {
type MenuProps = {
className?: string;
};
@ -34,7 +34,7 @@ const links = [
},
];
const Menu = ({ className }: Props) => {
const Menu = ({ className }: MenuProps) => {
const router = useRouter();
return (

View File

@ -5,7 +5,7 @@ import { ReactNode } from "react";
import styles from "./MenuLink.module.css";
const cx = classNames.bind(styles);
type Props = {
type MenuLinkProps = {
href: string;
icon: ReactNode;
text: string;
@ -13,7 +13,7 @@ type Props = {
className?: string;
};
const MenuLink = ({ href, icon, text, current, className }: Props) => (
const MenuLink = ({ href, icon, text, current, className }: MenuLinkProps) => (
<Link href={href} prefetch={false}>
<a className={cx(styles.link, { current: !!current }, className)}>
{icon} <span className={styles.label}>{text}</span>

View File

@ -8,9 +8,9 @@ import type { NoteMetaType } from "../../types";
import styles from "./NoteMeta.module.css";
import Link from "next/link";
type Props = Pick<NoteMetaType, "slug" | "date" | "title" | "tags">;
type NoteMetaProps = Pick<NoteMetaType, "slug" | "date" | "title" | "tags">;
const NoteMeta = ({ slug, date, title, tags = [] }: Props) => (
const NoteMeta = ({ slug, date, title, tags = [] }: NoteMetaProps) => (
<div className={styles.meta}>
<div className={styles.meta_item}>
<Link

View File

@ -1,13 +1,12 @@
import Link from "next/link";
import classNames from "classnames";
import type { HTMLAttributes } from "react";
import type { NoteMetaType } from "../../types";
import styles from "./NoteTitle.module.css";
type Props = Pick<NoteMetaType, "slug" | "htmlTitle"> & HTMLAttributes<HTMLAnchorElement>;
type NoteTitleProps = Pick<NoteMetaType, "slug" | "htmlTitle"> & JSX.IntrinsicElements["a"];
const NoteTitle = ({ slug, htmlTitle, className, ...rest }: Props) => (
const NoteTitle = ({ slug, htmlTitle, className, ...rest }: NoteTitleProps) => (
<h1 className={classNames(styles.title, className)}>
<Link
href={{

View File

@ -4,7 +4,11 @@ import type { NoteMetaType } from "../../types";
import styles from "./NotesList.module.css";
const NotesList = ({ notesByYear }) => {
type NotesListProps = {
notesByYear: Record<string, NoteMetaType[]>;
};
const NotesList = ({ notesByYear }: NotesListProps) => {
const sections = [];
Object.entries(notesByYear).forEach(([year, notes]: [string, NoteMetaType[]]) => {

View File

@ -1,14 +1,13 @@
import classNames from "classnames";
import { OctocatOcticon } from "../Icons";
import type { HTMLAttributes } from "react";
import styles from "./OctocatLink.module.css";
type Props = HTMLAttributes<HTMLAnchorElement> & {
type OctocatLinkProps = JSX.IntrinsicElements["a"] & {
repo: string;
};
const OctocatLink = ({ repo, className, ...rest }: Props) => (
const OctocatLink = ({ repo, className, ...rest }: OctocatLinkProps) => (
<a className={styles.link} href={`https://github.com/${repo}`} target="_blank" rel="noopener noreferrer" {...rest}>
<OctocatOcticon fill="currentColor" className={classNames(styles.icon, className)} />
</a>

View File

@ -2,13 +2,12 @@ import { useRouter } from "next/router";
import Link from "next/link";
import classNames from "classnames";
import { baseUrl } from "../../lib/config";
import type { HTMLAttributes } from "react";
import styles from "./PageTitle.module.css";
type Props = HTMLAttributes<HTMLHeadingElement>;
type PageTitleProps = JSX.IntrinsicElements["h1"];
const PageTitle = ({ className, children, ...rest }: Props) => {
const PageTitle = ({ className, children, ...rest }: PageTitleProps) => {
const router = useRouter();
const canonical = `${baseUrl}${router.pathname}/`;

View File

@ -6,11 +6,20 @@ import type { RepoType } from "../../types";
import styles from "./RepositoryCard.module.css";
type Props = RepoType & {
type RepositoryCardProps = RepoType & {
className?: string;
};
const RepositoryCard = ({ name, url, description, language, stars, forks, updatedAt, className }: Props) => (
const RepositoryCard = ({
name,
url,
description,
language,
stars,
forks,
updatedAt,
className,
}: RepositoryCardProps) => (
<div className={classNames(styles.card, className)}>
<Link className={styles.name} href={url}>
{name}

View File

@ -7,11 +7,11 @@ import styles from "./Selfie.module.css";
import selfieJpg from "../../public/static/images/selfie.jpg";
type Props = {
type SelfieProps = {
className?: string;
};
const Selfie = ({ className }: Props) => (
const Selfie = ({ className }: SelfieProps) => (
<Link href="/">
<a className={classNames(styles.link, className)}>
<div className={styles.selfie}>

View File

@ -1,13 +1,13 @@
import { forwardRef } from "react";
import classNames from "classnames";
import type { Ref, HTMLAttributes } from "react";
import type { Ref } from "react";
import styles from "./Terminal.module.css";
type Props = HTMLAttributes<HTMLDivElement>;
type TerminalProps = JSX.IntrinsicElements["div"];
// a DOS-style terminal box with dynamic text
const Terminal = forwardRef(function Terminal({ className, ...rest }: Props, ref: Ref<HTMLSpanElement>) {
const Terminal = forwardRef(function Terminal({ className, ...rest }: TerminalProps, ref: Ref<HTMLSpanElement>) {
return (
<div className={classNames("monospace", className, styles.terminal)} {...rest}>
<span ref={ref} /> <span className={styles.blink} />

View File

@ -4,11 +4,11 @@ import { SunIcon, MoonIcon } from "../Icons";
import styles from "./ThemeToggle.module.css";
type Props = {
type ThemeToggleProps = {
className?: string;
};
const ThemeToggle = ({ className }: Props) => {
const ThemeToggle = ({ className }: ThemeToggleProps) => {
const [mounted, setMounted] = useState(false);
const { resolvedTheme, setTheme } = useTheme();

View File

@ -1,12 +1,12 @@
import Tweet from "react-tweet-embed";
type Props = {
type TweetEmbedProps = {
id: string;
options?: object;
className?: string;
};
const TweetEmbed = ({ id, className, options }: Props) => (
const TweetEmbed = ({ id, className, options }: TweetEmbedProps) => (
<Tweet
className={className}
id={id}

View File

@ -5,11 +5,11 @@ import Terminal from "../Terminal/Terminal";
import styles from "./VNC.module.css";
type Props = {
type VNCProps = {
server: string;
};
const VNC = ({ server }: Props) => {
const VNC = ({ server }: VNCProps) => {
const router = useRouter();
// we definitely do NOT want this page to connect more than once!

View File

@ -4,7 +4,7 @@ import type { FilePlayerProps } from "react-player/file";
import styles from "./Video.module.css";
type Props = Partial<FilePlayerProps> & {
type VideoProps = Partial<FilePlayerProps> & {
webm?: string;
mp4?: string;
thumbnail?: string;
@ -13,7 +13,7 @@ type Props = Partial<FilePlayerProps> & {
className?: string;
};
const Video = ({ webm, mp4, thumbnail, subs, autoplay, className, ...rest }: Props) => {
const Video = ({ webm, mp4, thumbnail, subs, autoplay, className, ...rest }: VideoProps) => {
const url = [
webm && {
src: webm,

View File

@ -1,17 +1,17 @@
import { useEffect, useRef } from "react";
import classNames from "classnames/bind";
import type { PropsWithChildren, HTMLAttributes } from "react";
import type { PropsWithChildren } from "react";
import styles from "./Wallpaper.module.css";
const cx = classNames.bind(styles);
type Props = HTMLAttributes<HTMLDivElement> &
type WallpaperProps = JSX.IntrinsicElements["div"] &
PropsWithChildren<{
image: string;
tile?: boolean;
}>;
const Wallpaper = ({ image, tile, className, ...rest }: Props) => {
const Wallpaper = ({ image, tile, className, ...rest }: WallpaperProps) => {
const bgRef = useRef<HTMLDivElement>(null);
useEffect(() => {

View File

@ -4,12 +4,12 @@ import type { YouTubePlayerProps } from "react-player/youtube";
import styles from "./YouTubeEmbed.module.css";
type Props = Partial<YouTubePlayerProps> & {
type YouTubeEmbedProps = Partial<YouTubePlayerProps> & {
id: string;
className?: string;
};
const YouTubeEmbed = ({ id, className, ...rest }: Props) => (
const YouTubeEmbed = ({ id, className, ...rest }: YouTubeEmbedProps) => (
<div className={classNames(styles.wrapper, className)}>
<ReactPlayer
width="100%"

View File

@ -1,18 +1,17 @@
import * as config from "./config";
import type { DefaultSeoProps } from "next-seo";
import type { SocialProfileJsonLdProps } from "next-seo/lib/jsonld/socialProfile";
import type { ArticleJsonLdProps } from "next-seo/lib/jsonld/article";
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 meJpg from "../public/static/images/me.jpg";
import type { DefaultSeoProps } from "next-seo";
import type { SocialProfileJsonLdProps } from "next-seo/lib/jsonld/socialProfile";
import type { ArticleJsonLdProps } from "next-seo/lib/jsonld/article";
// Most of this file simply takes the data already defined in ./config.js and translates it into objects that are
// compatible with next-seo's props:
// https://github.com/garmeeh/next-seo#default-seo-configuration
export const defaultSeo: DefaultSeoProps = {
defaultTitle: `${config.siteName} ${config.shortDescription}`,
titleTemplate: `%s ${config.siteName}`, // appends ` siteName` to title provided by each page (except home)
@ -122,6 +121,7 @@ export const socialProfileJsonLd: SocialProfileJsonLdProps = {
],
};
// Just the basic items applicable to all notes, extended by pages/notes/[slug].tsx
// https://github.com/garmeeh/next-seo#article-1
export const articleJsonLd: Pick<ArticleJsonLdProps, "authorName" | "publisherName" | "publisherLogo"> = {
authorName: [config.authorName],

View File

@ -26,13 +26,13 @@
"@fontsource/comic-neue": "4.5.2",
"@fontsource/inter": "4.5.3",
"@fontsource/roboto-mono": "4.5.2",
"@giscus/react": "^1.1.1",
"@giscus/react": "^1.1.2",
"@hcaptcha/react-hcaptcha": "^1.1.0",
"@next/bundle-analyzer": "12.0.10",
"@novnc/novnc": "1.3.0",
"@octokit/graphql": "^4.8.0",
"@primer/octicons": "^16.3.1",
"@sentry/node": "^6.17.5",
"@sentry/node": "^6.17.6",
"classnames": "^2.3.1",
"copy-to-clipboard": "^3.3.1",
"critters": "^0.0.16",
@ -47,7 +47,7 @@
"is-absolute-url": "^4.0.1",
"markdown-to-jsx": "^7.1.6",
"modern-normalize": "^1.1.0",
"next": "12.0.11-canary.7",
"next": "12.0.11-canary.9",
"next-compose-plugins": "^2.2.1",
"next-mdx-remote": "4.0.0-rc.1",
"next-seo": "^5.1.0",
@ -104,7 +104,7 @@
"postcss-preset-env": "^7.3.1",
"prettier": "^2.5.1",
"simple-git-hooks": "^2.7.0",
"stylelint": "~14.3.0",
"stylelint": "~14.4.0",
"stylelint-config-prettier": "~9.0.3",
"stylelint-prettier": "~2.0.0",
"typescript": "^4.5.5"

View File

@ -1,10 +1,9 @@
import Document, { Html, Head, Main, NextScript } from "next/document";
import classNames from "classnames";
import * as config from "../lib/config";
import type { DocumentContext } from "next/document";
class MyDocument extends Document {
class CustomDocument extends Document {
static async getInitialProps(ctx: DocumentContext) {
const initialProps = await Document.getInitialProps(ctx);
return { ...initialProps };
@ -23,4 +22,4 @@ class MyDocument extends Document {
}
}
export default MyDocument;
export default CustomDocument;

View File

@ -33,7 +33,7 @@ const License = () => (
<HorizontalRule />
<H2>Creative Commons Attribution 4.0 International Public License</H2>
<H2 id="full-text">Creative Commons Attribution 4.0 International Public License</H2>
<p style={{ textAlign: "center", lineHeight: 0 }}>
<a

View File

@ -17,7 +17,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => {
// TODO: make this not manual (serverless functions can't see /pages at runtime)
const pages: Page[] = [
{ relUrl: "/", priority: 1.0, changeFreq: "weekly" }, // homepage
{ relUrl: "/notes/" },
{ relUrl: "/notes/", changeFreq: "weekly" },
{ relUrl: "/birthday/" },
{ relUrl: "/cli/" },
{ relUrl: "/contact/" },
@ -28,6 +28,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => {
{ relUrl: "/privacy/", priority: 0.1, changeFreq: "yearly" },
{ relUrl: "/projects/", changeFreq: "daily" },
{ relUrl: "/uses/" },
{ relUrl: "/y2k/" },
];
// push notes separately and use their metadata

329
yarn.lock
View File

@ -44,16 +44,16 @@
source-map "^0.5.0"
"@babel/core@^7.15.5":
version "7.17.0"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.0.tgz#16b8772b0a567f215839f689c5ded6bb20e864d5"
integrity sha512-x/5Ea+RO5MvF9ize5DeVICJoVrNv0Mi2RnIABrZEKYvPEpldXwauPkgvYA17cKa6WpU3LoYvYbuEMFtSNFsarA==
version "7.17.2"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.2.tgz#2c77fc430e95139d816d39b113b31bf40fb22337"
integrity sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw==
dependencies:
"@ampproject/remapping" "^2.0.0"
"@babel/code-frame" "^7.16.7"
"@babel/generator" "^7.17.0"
"@babel/helper-compilation-targets" "^7.16.7"
"@babel/helper-module-transforms" "^7.16.7"
"@babel/helpers" "^7.17.0"
"@babel/helpers" "^7.17.2"
"@babel/parser" "^7.17.0"
"@babel/template" "^7.16.7"
"@babel/traverse" "^7.17.0"
@ -276,10 +276,10 @@
"@babel/traverse" "^7.16.8"
"@babel/types" "^7.16.8"
"@babel/helpers@^7.12.5", "@babel/helpers@^7.17.0":
version "7.17.0"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.0.tgz#79cdf6c66a579f3a7b5e739371bc63ca0306886b"
integrity sha512-Xe/9NFxjPwELUvW2dsukcMZIp6XwPSbI4ojFBJuX5ramHuVE22SVcZIwqzdWo5uCgeTXW8qV97lMvSOjq+1+nQ==
"@babel/helpers@^7.12.5", "@babel/helpers@^7.17.2":
version "7.17.2"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417"
integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==
dependencies:
"@babel/template" "^7.16.7"
"@babel/traverse" "^7.17.0"
@ -983,17 +983,17 @@
"@babel/plugin-transform-typescript" "^7.16.7"
"@babel/runtime-corejs3@^7.10.2":
version "7.17.0"
resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.0.tgz#9de2f75b3ca4b68628c01bd76410b64faa4644f7"
integrity sha512-qeydncU80ravKzovVncW3EYaC1ji3GpntdPgNcJy9g7hHSY6KX+ne1cbV3ov7Zzm4F1z0+QreZPCuw1ynkmYNg==
version "7.17.2"
resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz#fdca2cd05fba63388babe85d349b6801b008fd13"
integrity sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==
dependencies:
core-js-pure "^3.20.2"
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.10.2", "@babel/runtime@^7.16.3", "@babel/runtime@^7.8.4":
version "7.17.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.0.tgz#b8d142fc0f7664fb3d9b5833fd40dcbab89276c0"
integrity sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==
version "7.17.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941"
integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==
dependencies:
regenerator-runtime "^0.13.4"
@ -1088,12 +1088,10 @@
resolved "https://registry.yarnpkg.com/@fontsource/roboto-mono/-/roboto-mono-4.5.2.tgz#3462d720b7ba0530358dd748545523a711c7428a"
integrity sha512-MoWKypBXIyZMnvExDTmaRWJSBNLQvKNaWAk2rAwXCNP5AtIa7mzawx9Yfl1LxCY/kVjhMZHPPKtt75CNQQHzQA==
"@giscus/react@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@giscus/react/-/react-1.1.1.tgz#f3c07438d47638b5e912a9a928714c4aac39b65f"
integrity sha512-rJiutdfywkflPszYootlImuhaBzPGctDOiQhaBwYP7bekcnd3YkZABLHMPhup08QJYv49Ev3j6ewWNxOtvTjyg==
dependencies:
iframe-resizer "^4.3.2"
"@giscus/react@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@giscus/react/-/react-1.1.2.tgz#c97f06aab1272c0fbe567c69ebffe3bad7206e7a"
integrity sha512-htSAAiTtoHTRE8GqSSkWmT+Iq7LJhtqSmr+HjEC1cXlNd1WeLVZXjnuiIj7+L8DOUnAdfh+1FClN304FVxIcsQ==
"@hcaptcha/react-hcaptcha@^1.1.0":
version "1.1.0"
@ -1129,9 +1127,9 @@
integrity sha512-Ht8wIW5v165atIX1p+JvKR5ONzUyF4Ac8DZIQ5kZs9zrb6M8SJNXpx1zn04rn65VjBMygRoMXcyYwNK0fT7bEg==
"@jridgewell/trace-mapping@^0.3.0":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.2.tgz#e051581782a770c30ba219634f2019241c5d3cde"
integrity sha512-9KzzH4kMjA2XmBRHfqG2/Vtl7s92l6uNDd0wW7frDE+EUvQFGqNXhWp0UGJjSkt3v2AYjzOZn1QO9XaTNJIt1Q==
version "0.3.4"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3"
integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==
dependencies:
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
@ -1179,10 +1177,10 @@
dependencies:
webpack-bundle-analyzer "4.3.0"
"@next/env@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/env/-/env-12.0.11-canary.7.tgz#3df975809a974edb3475fc448e39dcbd74efcf2b"
integrity sha512-uhOJe23+o/0b14ZCfK78ZYlIVDUr0Ae0ZAp/2j2DhAUrHYqdwJoLdRw2UuurHDF3iiMBytrDIB110P1ZINxUpg==
"@next/env@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/env/-/env-12.0.11-canary.9.tgz#d88faa19df4f210cc5f7c005693f4be835808d6b"
integrity sha512-mdpsKiYCmYSSJQepsi8cJ6WDvsUYgeHLH4BhwMJhDGcQw7updHGKERZ8CgnaCMbU0q3yf9hl2n7oN9gv2U9E4w==
"@next/eslint-plugin-next@12.0.10":
version "12.0.10"
@ -1191,60 +1189,60 @@
dependencies:
glob "7.1.7"
"@next/swc-android-arm64@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.0.11-canary.7.tgz#c50e7d07de7b9f4094b86aaa44cc2d83fc27b664"
integrity sha512-TRXKpyVImyZoJMks0lCzVpilB8Gpa3r3zJCX4tkvoqkjFc2CtQ5vK53WorNsJ7255USMX33f8GF2B9R4AdEg/w==
"@next/swc-android-arm64@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.0.11-canary.9.tgz#d70bc1b9f8f62c95030d680a36671009df0691da"
integrity sha512-9TYW6kRsNycWoP7zHp1FOdTvoupBEe4xlSiprDJQvRB19/Ms/6M1MvSJUhBLQ2DH5lExldF/jP2J6vALVkTuZg==
"@next/swc-darwin-arm64@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.11-canary.7.tgz#2db9144b6c5a6fa0432fa9f01c7cf0c3d83cd9ae"
integrity sha512-14+tRG3clWjtoL2WkJ0f/g4slBTBT73nyX/+lrKdL6Y5t6aQDkFBcxYCYvQbS+3tRi0LsC75H69fn5Fyt120QQ==
"@next/swc-darwin-arm64@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.11-canary.9.tgz#c06bcec42f5ba04af667eddb1414891d56b6fcf9"
integrity sha512-AT7LGJMwWVBoftUiIHGzD8/HKF2mHxVRJrQJ293ibMK4RMnPK1iSNn1kI/5eKMw3jCPEG/yUGEZupP7NYYI2zA==
"@next/swc-darwin-x64@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.11-canary.7.tgz#42ae3712cd2fbe300948b32c523cb250972f7051"
integrity sha512-GS+XoDu9FQaA7tYe9T17VwSlYt/F3sd5WMLRbaZ8XjSF8eyZPMvdmtMxC9cQSRJzu1fya7eGYpeOkdEAQBMAuA==
"@next/swc-darwin-x64@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.11-canary.9.tgz#8871ab0e42c7a82ccbbb355b9c8da29d62d1a244"
integrity sha512-+MER8YoermGDL7pLSteYTnvW9zz7GriLcVotnMt3ODg4QGHk7bope4X7CdW9zmItvDC1f5VGCiKjBqg8TpEGNA==
"@next/swc-linux-arm-gnueabihf@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.11-canary.7.tgz#cd7d6f2efb072e11de50ca488cb66d489b1fbe35"
integrity sha512-dY6wTTR8GeOmFFQZNv6uC0uRmPled+0dCVewRFk7wXqkYwhtIEQKkEXmulBQAIb0o5nPoKWm5yHfkUMSDxqrLg==
"@next/swc-linux-arm-gnueabihf@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.11-canary.9.tgz#afb704eaef0362951aada158320f1e85bd728b9b"
integrity sha512-2x+j+pP7Iq6IjZ1mXxxfczVg2TEaQeZJL8HBBL+JxIi7f8l178El1uMg66SLIdr/k3H6mLp25X+Abl0NP33cew==
"@next/swc-linux-arm64-gnu@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.11-canary.7.tgz#acc5744e0173ae32e083d687ef6565c075b145f6"
integrity sha512-gfKlHgZ7pzAwqp/C9TlDMs5V52M7UVh1p9C5767jzU9yQjWshFq3dS4G9dpl70XIX28k5z3IQrQFwgPRs9POgA==
"@next/swc-linux-arm64-gnu@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.11-canary.9.tgz#3c7a7f875ea9d4a3c38af8e7410c559eeb9dc5f8"
integrity sha512-02HwAx0CFVmKNTDScLqvQfLEORhDguB6IXP1Gvht+2pDkFUWfWYDqba5tPaHOIUKCeWNRfJIRR3eFy/Pp1erPA==
"@next/swc-linux-arm64-musl@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.11-canary.7.tgz#34f5c92f2a868cb4d826869a8ef05ca3f0db344a"
integrity sha512-Fv4M4ipQp8uZ4j/dfXJRY2kqLWsDfttyzicFWAsfxzZ/haTLsok/BmuDtD2qWfMrUQsXkfap1tVsZ/gJSqR0ww==
"@next/swc-linux-arm64-musl@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.11-canary.9.tgz#efafe9b522241a1c13b909305eef376134f41615"
integrity sha512-IqRWieX1hs2ovLa4Jp0XYtEiHdYPljHpqONOOaU5BuJlZcLZUdojR17jvXMCm0jTvL1tXVAV2Dez6V/LYsFrTw==
"@next/swc-linux-x64-gnu@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.11-canary.7.tgz#f87cde0c790705cec3b26b237843068859720062"
integrity sha512-hDIyf7A7JWcJx5aZ7bV+ZHOWlxGt0jnc3Fxwicq2QLfyKyi2ejCCicdAv9G4t/LMUV3Z6GcYidQQ7ircQZOBBg==
"@next/swc-linux-x64-gnu@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.11-canary.9.tgz#fbd66240353fe1553cad389e6a47cd742e31f935"
integrity sha512-J2c3fzkwmUeZgX8OtyjeM6qi4jzKZUk7L9fdDdiHhnzysUQk4Lsh7c4h2peYWwu9XAqZ52vSmeYwj2A/rmArbQ==
"@next/swc-linux-x64-musl@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.11-canary.7.tgz#f538bc058eef43d8edfce9ab55cfde551b6f96d4"
integrity sha512-mRC/k1zdtJalHIevseIxvF2Wu7MsO0cpUkTCzg8DjiEhryWJ+Z02EIDmAWcQ6spSbdAI8MfMlhajF0fH9AYBVA==
"@next/swc-linux-x64-musl@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.11-canary.9.tgz#2bb6844f3748f8c23abc029c9b2f15c26b79dbc1"
integrity sha512-CmbURYTzg70pZIC1rQGNTSY2rJnblM6bIKBTYz3RcRgxhbTEZk3/YaE7D7ttALvJfJCRaAuGYjaOet52eqvOIg==
"@next/swc-win32-arm64-msvc@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.11-canary.7.tgz#6dcdadaf42e1c105e1b7bccb536af82617c70045"
integrity sha512-rn0jynHQGkm26U42GRMYDa1vzps5+As74tFO7Xbrx4z7b31nVp6b0JjL1Tjd0hSxeyII0tVdim2zZjEiuXfqfA==
"@next/swc-win32-arm64-msvc@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.11-canary.9.tgz#6a2ee59f31fe1c4c99bd7d57d69eeb9dbedbc85f"
integrity sha512-yGBW252SDphtlrsY+s4AvhfYE6S6Y2hsUbAiTQsAGugXFOwqXNPEoM2A5G2FG1yG/TUEIpreIWAB7dUO3E7/Hg==
"@next/swc-win32-ia32-msvc@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.11-canary.7.tgz#446a18fe951ac7f9bcc68c670a712244db54fbf9"
integrity sha512-KEk0odx4wgrFYFfLTzR81kGSgXv3KBI9XOqys/9n32cCP2K86GtfE8vGtrr0jFMYMQPWhmmX0nI894VhEANPpg==
"@next/swc-win32-ia32-msvc@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.11-canary.9.tgz#a7895c03c50cfe4926d929673eaf17c5df72e3eb"
integrity sha512-E/eMBTfOKr3ya6S16jVKsSFR+UD/QuiwGyYx1qX0Jaq9pswx9gwi7rou4geU3sRdJXJqeBAQYFs6VfDLbMTIxw==
"@next/swc-win32-x64-msvc@12.0.11-canary.7":
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.11-canary.7.tgz#64fc20c272a71b88a3da2bb4da48f148b249277b"
integrity sha512-wbBffqhvHPF7tJKScUZJHL8bXm5irdNlHB7jbit8JkJ1HiXnTzi6E/Rjvm9gIk/cG8rd2Ir/FQYNGgtWcRWrTw==
"@next/swc-win32-x64-msvc@12.0.11-canary.9":
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.11-canary.9.tgz#af4f2cbeb5ce8074d04da142aab74dd44b31c51f"
integrity sha512-8+7AG45la2Yv6oDgCemuueNVOojbrDC1zXxdXfMIMkkj3JFHuaYR/T4Iphn09SOjg1TE7M/fzD9L1VCCYt8mQQ==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@ -1340,72 +1338,72 @@
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz#7f698254aadf921e48dda8c0a6b304026b8a9323"
integrity sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==
"@sentry/core@6.17.5":
version "6.17.5"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.17.5.tgz#8455e8b4ba36fc50c0d95b25eba06286389663ee"
integrity sha512-G1bYvZsWM5n0QYbnv89a24HCXex3rMWUnHWFysNqcWmw2YfiQ9RX5SakGbesewBj2Br2XpaDH0pED3QBUrC7yA==
"@sentry/core@6.17.6":
version "6.17.6"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.17.6.tgz#6ee2f2851b0bb2f2e967a10a8694d8bd98675aa5"
integrity sha512-wSNsQSqsW8vQ2HEvUEXYOJnzTyVDSWbyH4RHrWV1pQM8zqGx/qfz0sKFM5XFnE9ZeaXKL8LXV3v5i73v+z8lew==
dependencies:
"@sentry/hub" "6.17.5"
"@sentry/minimal" "6.17.5"
"@sentry/types" "6.17.5"
"@sentry/utils" "6.17.5"
"@sentry/hub" "6.17.6"
"@sentry/minimal" "6.17.6"
"@sentry/types" "6.17.6"
"@sentry/utils" "6.17.6"
tslib "^1.9.3"
"@sentry/hub@6.17.5":
version "6.17.5"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.17.5.tgz#9985ad61ac71003315ccaca2a2d42eed0e35bf6e"
integrity sha512-jBRrG0v3nHrymyj13Dv28aRS6xgQjWup45E0rljeksCxDL9frc734C0QGzGjE2MG7vZWtvd2CgP8uNbgYpwlTw==
"@sentry/hub@6.17.6":
version "6.17.6"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.17.6.tgz#af387ed1c180c05839610091de21ffb895b1403c"
integrity sha512-Ps9nk+DoFia8jhZ1lucdRE0vDx8hqXOsKXJE8a3hK/Ndki0J9jedYqBeLqSgiFG4qRjXpNFcD6TEM6tnQrv5lw==
dependencies:
"@sentry/types" "6.17.5"
"@sentry/utils" "6.17.5"
"@sentry/types" "6.17.6"
"@sentry/utils" "6.17.6"
tslib "^1.9.3"
"@sentry/minimal@6.17.5":
version "6.17.5"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.17.5.tgz#8116de3a4e8619242f4970ccbb7eea303ef88c52"
integrity sha512-WY/IQh2tb4XDkvr/2/8LB0mO8W3cgL6S2Uv+YfVRqogGJRdg5wD67aQ9zypNMq+D84cPwRuR/+51Npj6daox4w==
"@sentry/minimal@6.17.6":
version "6.17.6"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.17.6.tgz#9e6c37af869133834328889925500e0e76090cef"
integrity sha512-PLGf8WlhtdHuY6ofwYR3nyClr/TYHHAW6i0r62OZCOXTqnFPJorZpAz3VCCP2jMJmbgVbo03wN+u/xAA/zwObA==
dependencies:
"@sentry/hub" "6.17.5"
"@sentry/types" "6.17.5"
"@sentry/hub" "6.17.6"
"@sentry/types" "6.17.6"
tslib "^1.9.3"
"@sentry/node@^6.17.5":
version "6.17.5"
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.17.5.tgz#558e88a75162644d54fdd2beed69edd22cf06937"
integrity sha512-EFdrAOJKAUNjooVXpqvBF1VVUOUqXtOzjSIxNEd/dzCYDfbcycfe/XAhfiZSWqAlXMdIm1c4FHQj27qcDUQa9w==
"@sentry/node@^6.17.6":
version "6.17.6"
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.17.6.tgz#9ea8c7db089634423e3993127d6f6433535e23b6"
integrity sha512-T1s0yPbGvYpoh9pJgLvpy7s+jVwCyf0ieEoN9rSbnPwbi2vm6MfoV5wtGrE0cBHTPgnyOMv+zq4Q3ww6dfr7Pw==
dependencies:
"@sentry/core" "6.17.5"
"@sentry/hub" "6.17.5"
"@sentry/tracing" "6.17.5"
"@sentry/types" "6.17.5"
"@sentry/utils" "6.17.5"
"@sentry/core" "6.17.6"
"@sentry/hub" "6.17.6"
"@sentry/tracing" "6.17.6"
"@sentry/types" "6.17.6"
"@sentry/utils" "6.17.6"
cookie "^0.4.1"
https-proxy-agent "^5.0.0"
lru_map "^0.3.3"
tslib "^1.9.3"
"@sentry/tracing@6.17.5":
version "6.17.5"
resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.17.5.tgz#3bc25279d370b9771d1f8abe3d7d7e7a0f445c9f"
integrity sha512-SVIDFL/QbNAlv+Rhgq14TqtTBp9WGipkjQXXaD/Pbqcj3/Oil7ZHHKYesW8Z+gtKQs73oQ9a0nCgraLFcQ68PQ==
"@sentry/tracing@6.17.6":
version "6.17.6"
resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.17.6.tgz#40f6e6166e05059c7b826ced70056ba06d5722e8"
integrity sha512-+h5ov+zEm5WH9+vmFfdT4EIqBOW7Tggzh0BDz8QRStRc2JbvEiSZDs+HlsycBwWMQi/ucJs93FPtNnWjW+xvBw==
dependencies:
"@sentry/hub" "6.17.5"
"@sentry/minimal" "6.17.5"
"@sentry/types" "6.17.5"
"@sentry/utils" "6.17.5"
"@sentry/hub" "6.17.6"
"@sentry/minimal" "6.17.6"
"@sentry/types" "6.17.6"
"@sentry/utils" "6.17.6"
tslib "^1.9.3"
"@sentry/types@6.17.5":
version "6.17.5"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.17.5.tgz#3b6a591c8059d577b51ba2e71f4717aadbea923f"
integrity sha512-mn7qKuOvmZRTomJ7BiJEw6DM8femAVQcuHa8hdvK1F6ldMfFVLen5Z2LYGE7iY36GEa1Ba/AGGEKyF8D29y2/Q==
"@sentry/types@6.17.6":
version "6.17.6"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.17.6.tgz#7065df1433abfd8127462a6fe6f0538dbc307209"
integrity sha512-peGM873lDJtHd/jwW9Egr/hhxLuF0bcPIf2kMZlvEvW/G5GCbuaCR4ArQJlh7vQyma+NLn/XdojpJkC0TomKrw==
"@sentry/utils@6.17.5":
version "6.17.5"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.17.5.tgz#8034ac309d5f59ec919c748c6f35d6d831546523"
integrity sha512-MMCFCNWW73HRnqPVRGGSaMfSxtvvlNDgu1JFAOT2vnNkuf0mXvH301lyrh4pFJfntrtXOOk4bnGMhyWRlPADdA==
"@sentry/utils@6.17.6":
version "6.17.6"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.17.6.tgz#900d75f04e126f9ccb73a68cec574038375dd33e"
integrity sha512-RI797N8Ax5yuKUftVX6dc0XmXqo5CN7XqJYPFzYC8udutQ4L8ZYadtUcqNsdz1ZQxl+rp0XK9Q6wjoWmsI2RXA==
dependencies:
"@sentry/types" "6.17.5"
"@sentry/types" "6.17.6"
tslib "^1.9.3"
"@svgr/babel-plugin-add-jsx-attribute@^6.0.0":
@ -1603,9 +1601,9 @@
integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
"@types/node@*":
version "17.0.15"
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.15.tgz#97779282c09c09577120a2162e71d8380003590a"
integrity sha512-zWt4SDDv1S9WRBNxLFxFRHxdD9tvH8f5/kg5/IaLFdnSNXsDY4eL3Q3XXN+VxUnWIhyVFDwcsmAprvwXoM/ClA==
version "17.0.16"
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.16.tgz#e3733f46797b9df9e853ca9f719c8a6f7b84cd26"
integrity sha512-ydLaGVfQOQ6hI1xK2A5nVh8bl0OGoIfYMxPWHqqYe9bTkWCfqiVvZoh2I/QF2sNSkZzZyROBoTefIEI+PB6iIA==
"@types/normalize-package-data@^2.4.0":
version "2.4.1"
@ -2095,9 +2093,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001283, caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001297:
version "1.0.30001309"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001309.tgz#e0ee78b9bec0704f67304b00ff3c5c0c768a9f62"
integrity sha512-Pl8vfigmBXXq+/yUz1jUwULeq9xhMJznzdc/xwl4WclDAuebcTHVefpz8lE/bMI+UN7TOkSSe7B7RnZd6+dzjA==
version "1.0.30001310"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001310.tgz#da02cd07432c9eece6992689d1b84ca18139eea8"
integrity sha512-cb9xTV8k9HTIUA3GnPUJCk0meUnrHL5gy5QePfDjxHyNBcnzPzrHFv5GqfP7ue5b1ZyzZL0RJboD6hQlPXjhjg==
ccount@^1.0.0:
version "1.1.0"
@ -2381,6 +2379,11 @@ css-blank-pseudo@^3.0.2:
dependencies:
postcss-selector-parser "^6.0.9"
css-functions-list@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.0.0.tgz#faa770a0666aea11435efc0889935336cea564be"
integrity sha512-rfwhBOvXVFcKrSwmLxD8JQyuEEy/3g3Y9FMI2l6iV558Coeo1ucXypXb4rwrVpk5Osh5ViXp2DTgafw8WxglhQ==
css-has-pseudo@^3.0.3:
version "3.0.4"
resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73"
@ -2604,9 +2607,9 @@ eastasianwidth@^0.2.0:
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
electron-to-chromium@^1.4.17:
version "1.4.66"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.66.tgz#d7453d363dcd7b06ed1757adcde34d724e27b367"
integrity sha512-f1RXFMsvwufWLwYUxTiP7HmjprKXrqEWHiQkjAYa9DJeVIlZk5v8gBGcaV+FhtXLly6C1OTVzQY+2UQrACiLlg==
version "1.4.67"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.67.tgz#699e59d6959d05f87865e12b3055bbcf492bbbee"
integrity sha512-A6a2jEPLueEDfb7kvh7/E94RKKnIb01qL+4I7RFxtajmo+G9F5Ei7HgY5PRbQ4RDrh6DGDW66P0hD5XI2nRAcg==
emoji-regex@^8.0.0:
version "8.0.0"
@ -2619,9 +2622,9 @@ emoji-regex@^9.2.2:
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
enhanced-resolve@^5.7.0:
version "5.8.3"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0"
integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==
version "5.9.0"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz#49ac24953ac8452ed8fed2ef1340fc8e043667ee"
integrity sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
@ -3526,11 +3529,6 @@ human-signals@^2.1.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
iframe-resizer@^4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/iframe-resizer/-/iframe-resizer-4.3.2.tgz#42dd88345d18b9e377b6044dddb98c664ab0ce6b"
integrity sha512-gOWo2hmdPjMQsQ+zTKbses08mDfDEMh4NneGQNP4qwePYujY1lguqP6gnbeJkf154gojWlBhIltlgnMfYjGHWA==
ignore@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
@ -4863,28 +4861,28 @@ next-transpile-modules@^9.0.0:
enhanced-resolve "^5.7.0"
escalade "^3.1.1"
next@12.0.11-canary.7:
version "12.0.11-canary.7"
resolved "https://registry.yarnpkg.com/next/-/next-12.0.11-canary.7.tgz#65671bf3ab4b26ec3674c2b6d2ee17b85c8053f4"
integrity sha512-1bEwC2Y8OStU3eC7q9oJetWZPTNBi3ViBRd3OoQovo3sQA7+5CI4W8AV0YmNUsPfotSFPqoRFpyqqwk0btVNMw==
next@12.0.11-canary.9:
version "12.0.11-canary.9"
resolved "https://registry.yarnpkg.com/next/-/next-12.0.11-canary.9.tgz#91d3a3a26d8db08082f45923d17c8d3d5b282b8f"
integrity sha512-lsUSsBiuf3QDKX5BCYr33Nv31kZDaHjbKXmi9S299LXdsv1S8z4cQQ/DHTziwSZ7Rtp25I0NzOmBmZAj8jvBkQ==
dependencies:
"@next/env" "12.0.11-canary.7"
"@next/env" "12.0.11-canary.9"
caniuse-lite "^1.0.30001283"
postcss "8.4.5"
styled-jsx "5.0.0"
use-subscription "1.5.1"
optionalDependencies:
"@next/swc-android-arm64" "12.0.11-canary.7"
"@next/swc-darwin-arm64" "12.0.11-canary.7"
"@next/swc-darwin-x64" "12.0.11-canary.7"
"@next/swc-linux-arm-gnueabihf" "12.0.11-canary.7"
"@next/swc-linux-arm64-gnu" "12.0.11-canary.7"
"@next/swc-linux-arm64-musl" "12.0.11-canary.7"
"@next/swc-linux-x64-gnu" "12.0.11-canary.7"
"@next/swc-linux-x64-musl" "12.0.11-canary.7"
"@next/swc-win32-arm64-msvc" "12.0.11-canary.7"
"@next/swc-win32-ia32-msvc" "12.0.11-canary.7"
"@next/swc-win32-x64-msvc" "12.0.11-canary.7"
"@next/swc-android-arm64" "12.0.11-canary.9"
"@next/swc-darwin-arm64" "12.0.11-canary.9"
"@next/swc-darwin-x64" "12.0.11-canary.9"
"@next/swc-linux-arm-gnueabihf" "12.0.11-canary.9"
"@next/swc-linux-arm64-gnu" "12.0.11-canary.9"
"@next/swc-linux-arm64-musl" "12.0.11-canary.9"
"@next/swc-linux-x64-gnu" "12.0.11-canary.9"
"@next/swc-linux-x64-musl" "12.0.11-canary.9"
"@next/swc-win32-arm64-msvc" "12.0.11-canary.9"
"@next/swc-win32-ia32-msvc" "12.0.11-canary.9"
"@next/swc-win32-x64-msvc" "12.0.11-canary.9"
nice-try@^1.0.4:
version "1.0.5"
@ -4918,9 +4916,9 @@ node-fetch@^3.2.0:
formdata-polyfill "^4.0.10"
node-releases@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==
version "2.0.2"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
version "2.5.0"
@ -5540,7 +5538,7 @@ postcss@8.4.5:
picocolors "^1.0.0"
source-map-js "^1.0.1"
postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4.5, postcss@^8.4.6:
postcss@^8.3.11, postcss@^8.3.7, postcss@^8.4.6:
version "8.4.6"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.6.tgz#c5ff3c3c457a23864f32cb45ac9b741498a09ae1"
integrity sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==
@ -6004,9 +6002,9 @@ run-parallel@^1.1.9:
queue-microtask "^1.2.2"
rxjs@^7.5.2:
version "7.5.2"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.2.tgz#11e4a3a1dfad85dbf7fb6e33cbba17668497490b"
integrity sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w==
version "7.5.4"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.4.tgz#3d6bd407e6b7ce9a123e76b1e770dc5761aa368d"
integrity sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ==
dependencies:
tslib "^2.1.0"
@ -6408,14 +6406,15 @@ stylelint-prettier@~2.0.0:
dependencies:
prettier-linter-helpers "^1.0.0"
stylelint@~14.3.0:
version "14.3.0"
resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.3.0.tgz#26b62730da7b3dc320021fc469d80048d7b77ebe"
integrity sha512-PZXSwtJe4f4qBPWBwAbHL0M0Qjrv8iHN+cLpUNsffaVMS3YzpDDRI73+2lsqLAYfQEzxRwpll6BDKImREbpHWA==
stylelint@~14.4.0:
version "14.4.0"
resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.4.0.tgz#9ac2fb3681c5e84046cc0d08b6c60a115d61b5a7"
integrity sha512-F6H2frcmdpB5ZXPjvHKSZRmszuYz7bsbl2NXyE+Pn+1P6PMD3dYMKjXci6yEzj9+Yf2ZinxBMaXYvSzYjaHtog==
dependencies:
balanced-match "^2.0.0"
colord "^2.9.2"
cosmiconfig "^7.0.1"
css-functions-list "^3.0.0"
debug "^4.3.3"
execall "^2.0.0"
fast-glob "^3.2.11"
@ -6437,7 +6436,7 @@ stylelint@~14.3.0:
normalize-path "^3.0.0"
normalize-selector "^0.2.0"
picocolors "^1.0.0"
postcss "^8.4.5"
postcss "^8.4.6"
postcss-media-query-parser "^0.2.3"
postcss-resolve-nested-selector "^0.1.1"
postcss-safe-parser "^6.0.0"
@ -7122,9 +7121,9 @@ write-file-atomic@^4.0.0:
typedarray-to-buffer "^4.0.0"
ws@^7.3.1:
version "7.5.6"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b"
integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==
version "7.5.7"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67"
integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==
xml-js@^1.6.11:
version "1.6.11"