mirror of
https://github.com/jakejarvis/jarv.is.git
synced 2025-04-26 15:08:27 -04:00
dynamic opengraph images
This commit is contained in:
parent
4d2febd262
commit
e162d6a46c
@ -15,7 +15,7 @@ import "./global.css";
|
|||||||
|
|
||||||
import styles from "./layout.module.css";
|
import styles from "./layout.module.css";
|
||||||
|
|
||||||
import meJpg from "./me.jpg";
|
import meJpg from "../public/static/me.jpg";
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
metadataBase: new URL(config.baseUrl),
|
metadataBase: new URL(config.baseUrl),
|
||||||
@ -33,14 +33,6 @@ export const metadata: Metadata = {
|
|||||||
url: "/",
|
url: "/",
|
||||||
locale: config.siteLocale?.replace("-", "_"),
|
locale: config.siteLocale?.replace("-", "_"),
|
||||||
type: "website",
|
type: "website",
|
||||||
images: [
|
|
||||||
{
|
|
||||||
url: meJpg.src,
|
|
||||||
alt: `${config.siteName} – ${config.shortDescription}`,
|
|
||||||
width: meJpg.width,
|
|
||||||
height: meJpg.height,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
twitter: {
|
twitter: {
|
||||||
creator: `@${config.authorSocial?.twitter}`,
|
creator: `@${config.authorSocial?.twitter}`,
|
||||||
|
135
app/notes/[slug]/opengraph-image.tsx
Normal file
135
app/notes/[slug]/opengraph-image.tsx
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
/* eslint-disable jsx-a11y/alt-text */
|
||||||
|
|
||||||
|
import { ImageResponse } from "next/og";
|
||||||
|
import { notFound } from "next/navigation";
|
||||||
|
import path from "path";
|
||||||
|
import fs from "fs/promises";
|
||||||
|
import glob from "fast-glob";
|
||||||
|
import { getPostSlugs, getFrontMatter } from "../../../lib/helpers/posts";
|
||||||
|
|
||||||
|
export const dynamicParams = false;
|
||||||
|
export const contentType = "image/png";
|
||||||
|
export const size = {
|
||||||
|
// https://developers.facebook.com/docs/sharing/webmasters/images/
|
||||||
|
width: 1200,
|
||||||
|
height: 630,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const generateStaticParams = async () => {
|
||||||
|
const slugs = await getPostSlugs();
|
||||||
|
|
||||||
|
// map slugs into a static paths object required by next.js
|
||||||
|
return slugs.map((slug) => ({
|
||||||
|
slug,
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
const getLocalImage = async (src: string) => {
|
||||||
|
const imagePath = await glob(src);
|
||||||
|
if (imagePath.length > 0) {
|
||||||
|
const imageData = await fs.readFile(path.join(process.cwd(), imagePath[0]));
|
||||||
|
return Uint8Array.from(imageData).buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
// image doesn't exist
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const Image = async ({ params }: { params: Promise<{ slug: string }> }) => {
|
||||||
|
try {
|
||||||
|
const { slug } = await params;
|
||||||
|
|
||||||
|
// get the note's title and image filename from its frontmatter
|
||||||
|
const { title, image } = await getFrontMatter(slug);
|
||||||
|
|
||||||
|
// load the image specified in the note's frontmatter from its directory
|
||||||
|
const imageSrc = await getLocalImage(`notes/${slug}/${image}`);
|
||||||
|
|
||||||
|
// load the author avatar
|
||||||
|
const avatarSrc = await getLocalImage("public/static/me.jpg");
|
||||||
|
|
||||||
|
return new ImageResponse(
|
||||||
|
(
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
height: "100%",
|
||||||
|
width: "100%",
|
||||||
|
background: "linear-gradient(0deg, hsla(197, 14%, 57%, 1) 0%, hsla(192, 17%, 94%, 1) 100%)",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{imageSrc && (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: "flex",
|
||||||
|
height: "100%",
|
||||||
|
width: "100%",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
// @ts-expect-error
|
||||||
|
src={imageSrc}
|
||||||
|
style={{ objectFit: "cover", height: "100%", width: "100%" }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{avatarSrc && (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: "flex",
|
||||||
|
position: "absolute",
|
||||||
|
left: 42,
|
||||||
|
top: 42,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
// @ts-expect-error
|
||||||
|
src={avatarSrc}
|
||||||
|
style={{ height: 96, width: 96, borderRadius: "100%" }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: "flex",
|
||||||
|
position: "absolute",
|
||||||
|
left: 0,
|
||||||
|
bottom: 42,
|
||||||
|
padding: "12px 20px",
|
||||||
|
margin: "0 42px",
|
||||||
|
backgroundColor: "rgba(16, 16, 16, 0.85)",
|
||||||
|
fontFamily: "Geist",
|
||||||
|
fontSize: 40,
|
||||||
|
fontWeight: 600,
|
||||||
|
lineHeight: 1.4,
|
||||||
|
letterSpacing: -0.5,
|
||||||
|
color: "#fefefe",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{title}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
{
|
||||||
|
...size,
|
||||||
|
fonts: [
|
||||||
|
{
|
||||||
|
name: "Geist",
|
||||||
|
// load the Geist font directly from its npm package
|
||||||
|
data: await fs.readFile(
|
||||||
|
path.join(process.cwd(), "node_modules/geist/dist/fonts/geist-sans/Geist-SemiBold.ttf")
|
||||||
|
),
|
||||||
|
style: "normal",
|
||||||
|
weight: 600,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("[og-image] Error generating image:", error);
|
||||||
|
notFound();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Image;
|
@ -45,9 +45,10 @@ export const generateMetadata = async ({ params }: { params: Promise<{ slug: str
|
|||||||
tags: frontmatter.tags,
|
tags: frontmatter.tags,
|
||||||
publishedTime: frontmatter.date,
|
publishedTime: frontmatter.date,
|
||||||
modifiedTime: frontmatter.date,
|
modifiedTime: frontmatter.date,
|
||||||
images: frontmatter.image
|
},
|
||||||
? [{ url: frontmatter.image, alt: frontmatter.title }]
|
twitter: {
|
||||||
: defaultMetadata.openGraph?.images,
|
...defaultMetadata.twitter,
|
||||||
|
card: "summary_large_image",
|
||||||
},
|
},
|
||||||
alternates: {
|
alternates: {
|
||||||
...defaultMetadata.alternates,
|
...defaultMetadata.alternates,
|
||||||
@ -66,7 +67,6 @@ const Page = async ({ params }: { params: Promise<{ slug: string }> }) => {
|
|||||||
name: frontmatter.title,
|
name: frontmatter.title,
|
||||||
description: frontmatter.description || config.longDescription,
|
description: frontmatter.description || config.longDescription,
|
||||||
url: frontmatter.permalink,
|
url: frontmatter.permalink,
|
||||||
image: frontmatter.image,
|
|
||||||
datePublished: frontmatter.date,
|
datePublished: frontmatter.date,
|
||||||
dateModified: frontmatter.date,
|
dateModified: frontmatter.date,
|
||||||
author: {
|
author: {
|
||||||
|
18
app/page.tsx
18
app/page.tsx
@ -2,11 +2,27 @@ import hash from "@emotion/hash";
|
|||||||
import { rgba } from "polished";
|
import { rgba } from "polished";
|
||||||
import { LockIcon } from "lucide-react";
|
import { LockIcon } from "lucide-react";
|
||||||
import UnstyledLink from "../components/Link";
|
import UnstyledLink from "../components/Link";
|
||||||
|
import { metadata as defaultMetadata } from "./layout";
|
||||||
import type { ComponentPropsWithoutRef } from "react";
|
import type { ComponentPropsWithoutRef } from "react";
|
||||||
import type { Route } from "next";
|
import type { Metadata, Route } from "next";
|
||||||
|
|
||||||
import styles from "./page.module.css";
|
import styles from "./page.module.css";
|
||||||
|
|
||||||
|
import meJpg from "../public/static/me.jpg";
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
openGraph: {
|
||||||
|
...defaultMetadata.openGraph,
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: meJpg.src,
|
||||||
|
width: meJpg.width,
|
||||||
|
height: meJpg.height,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
const Link = ({
|
const Link = ({
|
||||||
lightColor,
|
lightColor,
|
||||||
darkColor,
|
darkColor,
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import { graphql } from "@octokit/graphql";
|
import { graphql } from "@octokit/graphql";
|
||||||
|
import commaNumber from "comma-number";
|
||||||
import { GitForkIcon, StarIcon } from "lucide-react";
|
import { GitForkIcon, StarIcon } from "lucide-react";
|
||||||
import PageTitle from "../../components/PageTitle";
|
import PageTitle from "../../components/PageTitle";
|
||||||
import Link from "../../components/Link";
|
import Link from "../../components/Link";
|
||||||
import RelativeTime from "../../components/RelativeTime";
|
import RelativeTime from "../../components/RelativeTime";
|
||||||
import commaNumber from "comma-number";
|
|
||||||
import config from "../../lib/config";
|
|
||||||
import { metadata as defaultMetadata } from "../layout";
|
import { metadata as defaultMetadata } from "../layout";
|
||||||
|
import config from "../../lib/config";
|
||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import type { User, Repository } from "@octokit/graphql-schema";
|
import type { User, Repository } from "@octokit/graphql-schema";
|
||||||
|
|
||||||
|
@ -24,7 +24,6 @@ const Header = ({ className, ...rest }: HeaderProps) => {
|
|||||||
height={70}
|
height={70}
|
||||||
quality={60}
|
quality={60}
|
||||||
placeholder="empty"
|
placeholder="empty"
|
||||||
inline
|
|
||||||
priority
|
priority
|
||||||
/>
|
/>
|
||||||
<span className={styles.name}>{config.authorName}</span>
|
<span className={styles.name}>{config.authorName}</span>
|
||||||
|
@ -3,12 +3,3 @@
|
|||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
border-radius: var(--radii-corner);
|
border-radius: var(--radii-corner);
|
||||||
}
|
}
|
||||||
|
|
||||||
.block {
|
|
||||||
display: block;
|
|
||||||
line-height: 0;
|
|
||||||
|
|
||||||
/* default to centering all images */
|
|
||||||
margin: 1em auto;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
@ -7,11 +7,9 @@ import styles from "./Image.module.css";
|
|||||||
|
|
||||||
const MAX_WIDTH = 865;
|
const MAX_WIDTH = 865;
|
||||||
|
|
||||||
export type ImageProps = ComponentPropsWithoutRef<typeof NextImage> & {
|
export type ImageProps = ComponentPropsWithoutRef<typeof NextImage>;
|
||||||
inline?: boolean; // don't wrap everything in a `<div>` block
|
|
||||||
};
|
|
||||||
|
|
||||||
const Image = ({ src, height, width, quality, placeholder, inline, className, ...rest }: ImageProps) => {
|
const Image = ({ src, height, width, quality, placeholder, className, ...rest }: ImageProps) => {
|
||||||
const constrainWidth = (width?: number | `${number}`) => {
|
const constrainWidth = (width?: number | `${number}`) => {
|
||||||
if (!width) return MAX_WIDTH;
|
if (!width) return MAX_WIDTH;
|
||||||
|
|
||||||
@ -27,9 +25,7 @@ const Image = ({ src, height, width, quality, placeholder, inline, className, ..
|
|||||||
...rest,
|
...rest,
|
||||||
};
|
};
|
||||||
|
|
||||||
const StyledImageWithProps = <NextImage className={clsx(styles.image, className)} {...imageProps} />;
|
return <NextImage className={clsx(styles.image, className)} {...imageProps} />;
|
||||||
|
|
||||||
return inline ? StyledImageWithProps : <div className={styles.block}>{StyledImageWithProps}</div>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Image;
|
export default Image;
|
||||||
|
@ -2,7 +2,7 @@ import { Feed } from "feed";
|
|||||||
import { getAllPosts } from "./posts";
|
import { getAllPosts } from "./posts";
|
||||||
import config from "../config";
|
import config from "../config";
|
||||||
|
|
||||||
import meJpg from "../../app/me.jpg";
|
import meJpg from "../../public/static/me.jpg";
|
||||||
|
|
||||||
export const buildFeed = async (): Promise<Feed> => {
|
export const buildFeed = async (): Promise<Feed> => {
|
||||||
// https://github.com/jpmonette/feed#example
|
// https://github.com/jpmonette/feed#example
|
||||||
@ -32,7 +32,6 @@ export const buildFeed = async (): Promise<Feed> => {
|
|||||||
link: post.permalink,
|
link: post.permalink,
|
||||||
title: post.title,
|
title: post.title,
|
||||||
description: post.description,
|
description: post.description,
|
||||||
image: post.image || undefined,
|
|
||||||
author: [
|
author: [
|
||||||
{
|
{
|
||||||
name: config.authorName,
|
name: config.authorName,
|
||||||
|
@ -15,13 +15,17 @@ export type FrontMatter = {
|
|||||||
title: string;
|
title: string;
|
||||||
htmlTitle?: string;
|
htmlTitle?: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
image?: string;
|
|
||||||
tags?: string[];
|
tags?: string[];
|
||||||
|
image?: string;
|
||||||
noComments?: boolean;
|
noComments?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
// returns front matter and the **raw & uncompiled** markdown of a given slug
|
// returns front matter and the **raw & uncompiled** markdown of a given slug
|
||||||
export const getFrontMatter = async (slug: string): Promise<FrontMatter> => {
|
export const getFrontMatter = async (slug: string): Promise<FrontMatter> => {
|
||||||
|
if (!(await getPostSlugs()).includes(slug)) {
|
||||||
|
throw new Error(`No post found for slug: ${slug}`);
|
||||||
|
}
|
||||||
|
|
||||||
const { frontmatter } = await import(`../../${POSTS_DIR}/${slug}/index.mdx`);
|
const { frontmatter } = await import(`../../${POSTS_DIR}/${slug}/index.mdx`);
|
||||||
|
|
||||||
const { unified } = await import("unified");
|
const { unified } = await import("unified");
|
||||||
@ -62,7 +66,6 @@ export const getFrontMatter = async (slug: string): Promise<FrontMatter> => {
|
|||||||
slug,
|
slug,
|
||||||
date: formatDate(frontmatter.date), // validate/normalize the date string provided from front matter
|
date: formatDate(frontmatter.date), // validate/normalize the date string provided from front matter
|
||||||
permalink: `${config.baseUrl}/${POSTS_DIR}/${slug}`,
|
permalink: `${config.baseUrl}/${POSTS_DIR}/${slug}`,
|
||||||
image: frontmatter.image ? `${config.baseUrl}${frontmatter.image}` : undefined,
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -66,6 +66,6 @@ export const middleware = (request: NextRequest) => {
|
|||||||
export const config = {
|
export const config = {
|
||||||
// save compute time by skipping middleware for static and metadata files
|
// save compute time by skipping middleware for static and metadata files
|
||||||
matcher: [
|
matcher: [
|
||||||
"/((?!_next/static|_next/image|_vercel|static|.well-known|favicon.ico|icon.png|apple-icon.png|manifest.webmanifest).*)",
|
"/((?!_next/static|_next/image|_vercel|static|\\.well-known|favicon.ico|icon.png|apple-icon.png|sitemap.xml|robots.txt|manifest.webmanifest|feed.xml|feed.atom).*)",
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
@ -19,6 +19,13 @@ const nextConfig: NextConfig = {
|
|||||||
{ protocol: "https", hostname: "abs.twimg.com" },
|
{ protocol: "https", hostname: "abs.twimg.com" },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
outputFileTracingIncludes: {
|
||||||
|
"/notes/[slug]/opengraph-image": [
|
||||||
|
"./notes/**/*",
|
||||||
|
"./public/static/me.jpg",
|
||||||
|
"./node_modules/geist/dist/fonts/geist-sans/Geist-SemiBold.ttf",
|
||||||
|
],
|
||||||
|
},
|
||||||
experimental: {
|
experimental: {
|
||||||
serverActions: {
|
serverActions: {
|
||||||
allowedOrigins: ["jarv.is", "jarvis2i2vp4j4tbxjogsnqdemnte5xhzyi7hziiyzxwge3hzmh57zad.onion"],
|
allowedOrigins: ["jarv.is", "jarvis2i2vp4j4tbxjogsnqdemnte5xhzyi7hziiyzxwge3hzmh57zad.onion"],
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./sad-bernie.jpg";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: 'Bernie Sanders\' Creepy "BERN" App Wants Your Data...From Your Best Friends',
|
title: 'Bernie Sanders\' Creepy "BERN" App Wants Your Data...From Your Best Friends',
|
||||||
date: "2019-05-08 10:31:02-0400",
|
date: "2019-05-08 10:31:02-0400",
|
||||||
description:
|
description:
|
||||||
"The team behind Bernie's campaign has a new app named BERN. It's undoubtedly a smart move, but also a concerning one for privacy advocates.",
|
"The team behind Bernie's campaign has a new app named BERN. It's undoubtedly a smart move, but also a concerning one for privacy advocates.",
|
||||||
tags: ["Privacy", "Data", "Bernie Sanders", "2020 Presidential Campaign", "Politics"],
|
tags: ["Privacy", "Data", "Bernie Sanders", "2020 Presidential Campaign", "Politics"],
|
||||||
image: featuredImage.src,
|
image: "sad-bernie.jpg",
|
||||||
};
|
};
|
||||||
|
|
||||||
The team behind Bernie Sanders' 2020 campaign [released a new web app](https://www.nbcnews.com/politics/2020-election/bernie-sanders-2020-campaign-unveils-app-increase-its-voter-database-n999206) last month named [BERN](https://app.berniesanders.com/). The goal of BERN is simple: to gather as much information as they can on as many voters in the United States as they can, and make their grassroots army of enthusiastic supporters do the work. It's undoubtedly a smart strategy, but also a concerning one for myself and other privacy advocates.
|
The team behind Bernie Sanders' 2020 campaign [released a new web app](https://www.nbcnews.com/politics/2020-election/bernie-sanders-2020-campaign-unveils-app-increase-its-voter-database-n999206) last month named [BERN](https://app.berniesanders.com/). The goal of BERN is simple: to gather as much information as they can on as many voters in the United States as they can, and make their grassroots army of enthusiastic supporters do the work. It's undoubtedly a smart strategy, but also a concerning one for myself and other privacy advocates.
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./archive-is.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "Does Cloudflare's 1.1.1.1 DNS Block Archive.is?",
|
title: "Does Cloudflare's 1.1.1.1 DNS Block Archive.is?",
|
||||||
date: "2019-05-04 09:35:12-0400",
|
date: "2019-05-04 09:35:12-0400",
|
||||||
description:
|
description:
|
||||||
"Short answer: no. Quite the opposite, actually — Archive.is is intentionally blocking 1.1.1.1 users. Here's why.",
|
"Short answer: no. Quite the opposite, actually — Archive.is is intentionally blocking 1.1.1.1 users. Here's why.",
|
||||||
tags: ["Cloudflare", "DNS", "Networking", "Privacy", "Temper Tantrums"],
|
tags: ["Cloudflare", "DNS", "Networking", "Privacy", "Temper Tantrums"],
|
||||||
image: featuredImage.src,
|
image: "archive-is.png",
|
||||||
};
|
};
|
||||||
|
|
||||||
**tl;dr:** No. Quite the opposite, actually — [Archive.is](https://archive.is/)'s owner is intentionally blocking 1.1.1.1 users.
|
**tl;dr:** No. Quite the opposite, actually — [Archive.is](https://archive.is/)'s owner is intentionally blocking 1.1.1.1 users.
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./terminal.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: 'Cool Bash Tricks for Your Terminal\'s "Dotfiles"',
|
title: 'Cool Bash Tricks for Your Terminal\'s "Dotfiles"',
|
||||||
date: "2018-12-10 20:01:50-0400",
|
date: "2018-12-10 20:01:50-0400",
|
||||||
description:
|
description:
|
||||||
"Bashfiles usually contain shortcuts compatible with Bash terminals to automate convoluted commands. Here's a summary of the ones I find most helpful that you can add to your own .bash_profile or .bashrc file.",
|
"Bashfiles usually contain shortcuts compatible with Bash terminals to automate convoluted commands. Here's a summary of the ones I find most helpful that you can add to your own .bash_profile or .bashrc file.",
|
||||||
tags: ["Dotfiles", "Hacks", "macOS", "Programming", "Terminal", "Tutorial"],
|
tags: ["Dotfiles", "Hacks", "macOS", "Programming", "Terminal", "Tutorial"],
|
||||||
image: featuredImage.src,
|
image: "terminal.png",
|
||||||
};
|
};
|
||||||
|
|
||||||

|

|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import Link from "../../components/Link";
|
import Link from "../../components/Link";
|
||||||
import featuredImage from "./covid19dashboards.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "COVID-19 vs. the Open Source Community ⚔️",
|
title: "COVID-19 vs. the Open Source Community ⚔️",
|
||||||
@ -7,7 +6,7 @@ export const frontmatter = {
|
|||||||
description:
|
description:
|
||||||
"The open source community is rallying together like no other to provide coronavirus information to the public in innovative ways.",
|
"The open source community is rallying together like no other to provide coronavirus information to the public in innovative ways.",
|
||||||
tags: ["Open Source", "COVID-19", "Coronavirus", "Public Health", "GitHub"],
|
tags: ["Open Source", "COVID-19", "Coronavirus", "Public Health", "GitHub"],
|
||||||
image: featuredImage.src,
|
image: "covid19dashboards.png",
|
||||||
};
|
};
|
||||||
|
|
||||||
export const OctocatLink = ({ repo }) => {
|
export const OctocatLink = ({ repo }) => {
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
import featuredImage from "./codepen.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "Animated Waving Hand Emoji 👋 Using CSS",
|
title: "Animated Waving Hand Emoji 👋 Using CSS",
|
||||||
date: "2019-04-17 14:20:10-0400",
|
date: "2019-04-17 14:20:10-0400",
|
||||||
description: "How to make the 👋 waving hand emoji actually wave using pure CSS animation!",
|
description: "How to make the 👋 waving hand emoji actually wave using pure CSS animation!",
|
||||||
tags: ["CSS", "Animation", "Emoji", "Keyframes", "Cool Tricks"],
|
tags: ["CSS", "Animation", "Emoji", "Keyframes", "Cool Tricks"],
|
||||||
image: featuredImage.src,
|
image: "codepen.png",
|
||||||
};
|
};
|
||||||
|
|
||||||
## Howdy, friends! 👋
|
## Howdy, friends! 👋
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./email.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "Why I'm Dropping Dropbox",
|
title: "Why I'm Dropping Dropbox",
|
||||||
date: "2019-11-20 17:22:43-0400",
|
date: "2019-11-20 17:22:43-0400",
|
||||||
description:
|
description:
|
||||||
"I'm finally canceling my Dropbox Pro account and moving to iCloud Drive for synchronized cloud storage.",
|
"I'm finally canceling my Dropbox Pro account and moving to iCloud Drive for synchronized cloud storage.",
|
||||||
tags: ["Cloud Storage", "Dropbox", "Apple", "iCloud Drive", "Betrayal"],
|
tags: ["Cloud Storage", "Dropbox", "Apple", "iCloud Drive", "Betrayal"],
|
||||||
image: featuredImage.src,
|
image: "email.png",
|
||||||
};
|
};
|
||||||
|
|
||||||
I've been a loyal Dropbox user since its inception as a [Y Combinator startup](https://www.ycombinator.com/apply/dropbox/) ten years ago. Having a folder on all of my devices that instantly synchronized with each other was a game-changer for me, and I grew dependent on it more and more as they gave out free storage like candy — 48 GB for having a Samsung Chromebook, 1 GB for "Posting \<3 to Twitter," and so on — until I needed to upgrade to Dropbox Pro. But this month I canceled my Pro subscription after a few too many strikes.
|
I've been a loyal Dropbox user since its inception as a [Y Combinator startup](https://www.ycombinator.com/apply/dropbox/) ten years ago. Having a folder on all of my devices that instantly synchronized with each other was a game-changer for me, and I grew dependent on it more and more as they gave out free storage like candy — 48 GB for having a Samsung Chromebook, 1 GB for "Posting \<3 to Twitter," and so on — until I needed to upgrade to Dropbox Pro. But this month I canceled my Pro subscription after a few too many strikes.
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./hackerone-2.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "Finding Candidates for Subdomain Takeovers",
|
title: "Finding Candidates for Subdomain Takeovers",
|
||||||
date: "2019-03-10 11:19:48-0400",
|
date: "2019-03-10 11:19:48-0400",
|
||||||
description:
|
description:
|
||||||
"A subdomain takeover occurs when a subdomain points to a shared hosting account that is abandoned by its owner, leaving the endpoint available to claim for yourself.",
|
"A subdomain takeover occurs when a subdomain points to a shared hosting account that is abandoned by its owner, leaving the endpoint available to claim for yourself.",
|
||||||
tags: ["Pentesting", "Infosec", "Subdomain Takeover", "Bug Bounty", "Tutorial"],
|
tags: ["Pentesting", "Infosec", "Subdomain Takeover", "Bug Bounty", "Tutorial"],
|
||||||
image: featuredImage.src,
|
image: "hackerone-2.png",
|
||||||
};
|
};
|
||||||
|
|
||||||
A **subdomain takeover** occurs when a subdomain (like _example_.jarv.is) points to a shared hosting account that is abandoned by its owner, leaving the endpoint available to claim for yourself.
|
A **subdomain takeover** occurs when a subdomain (like _example_.jarv.is) points to a shared hosting account that is abandoned by its owner, leaving the endpoint available to claim for yourself.
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
import featuredImage from "./actions-flow.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "I ❤️ GitHub Actions",
|
title: "I ❤️ GitHub Actions",
|
||||||
date: "2019-10-25 13:58:39-0400",
|
date: "2019-10-25 13:58:39-0400",
|
||||||
description: "I've found a new hobby of making cool GitHub Actions, the latest tool in the CI world. Here's why.",
|
description: "I've found a new hobby of making cool GitHub Actions, the latest tool in the CI world. Here's why.",
|
||||||
tags: ["DevOps", "GitHub", "Continuous Integration", "Docker", "Open Source"],
|
tags: ["DevOps", "GitHub", "Continuous Integration", "Docker", "Open Source"],
|
||||||
image: featuredImage.src,
|
image: "actions-flow.png",
|
||||||
};
|
};
|
||||||
|
|
||||||

|

|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./blm-topic.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "How To: Safely Rename `master` Branch on GitHub ✊🏾",
|
title: "How To: Safely Rename `master` Branch on GitHub ✊🏾",
|
||||||
date: "2020-06-28 09:28:52-0400",
|
date: "2020-06-28 09:28:52-0400",
|
||||||
description:
|
description:
|
||||||
'Some of the most popular open-source projects are renaming their default branch from "master" on GitHub. Here\'s how to do so, and safely.',
|
'Some of the most popular open-source projects are renaming their default branch from "master" on GitHub. Here\'s how to do so, and safely.',
|
||||||
tags: ["How To", "Tutorial", "Git", "GitHub", "Open Source", "Black Lives Matter"],
|
tags: ["How To", "Tutorial", "Git", "GitHub", "Open Source", "Black Lives Matter"],
|
||||||
image: featuredImage.src,
|
image: "blm-topic.png",
|
||||||
};
|
};
|
||||||
|
|
||||||

|

|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./apocalypse.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "How To: Automatically Backup a Linux VPS to a Separate Cloud Storage Service",
|
title: "How To: Automatically Backup a Linux VPS to a Separate Cloud Storage Service",
|
||||||
date: "2019-06-09 19:03:10-0400",
|
date: "2019-06-09 19:03:10-0400",
|
||||||
description:
|
description:
|
||||||
"A walkthrough for backing up a Linux server to an external storage provider like Amazon S3 automatically.",
|
"A walkthrough for backing up a Linux server to an external storage provider like Amazon S3 automatically.",
|
||||||
tags: ["How To", "Tutorial", "Servers", "Backups", "Linux", "Restic"],
|
tags: ["How To", "Tutorial", "Servers", "Backups", "Linux", "Restic"],
|
||||||
image: featuredImage.src,
|
image: "apocalypse.png",
|
||||||
};
|
};
|
||||||
|
|
||||||

|

|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./step7-2.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "How To: Fork a GitHub Repository & Submit a Pull Request",
|
title: "How To: Fork a GitHub Repository & Submit a Pull Request",
|
||||||
date: "2019-04-09 02:17:03-0400",
|
date: "2019-04-09 02:17:03-0400",
|
||||||
description:
|
description:
|
||||||
"Walkthrough of forking a GitHub repository, cloning it, committing your changes to a new branch, and pushing it back upstream.",
|
"Walkthrough of forking a GitHub repository, cloning it, committing your changes to a new branch, and pushing it back upstream.",
|
||||||
tags: ["How To", "Tutorial", "Git", "Pull Request", "Open Source", "GitHub"],
|
tags: ["How To", "Tutorial", "Git", "Pull Request", "Open Source", "GitHub"],
|
||||||
image: featuredImage.src,
|
image: "step7-2.png",
|
||||||
};
|
};
|
||||||
|
|
||||||
<svg width="150" height="150" viewBox="0 0 40 40" style={{ float: "right", marginBottom: "6px", marginLeft: "12px" }}>
|
<svg width="150" height="150" viewBox="0 0 40 40" style={{ float: "right", marginBottom: "6px", marginLeft: "12px" }}>
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
import featuredImage from "./screen-shot-2018-12-07-at-2-04-04-pm.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "How To: Shrink a Linux Virtual Machine Disk with VMware",
|
title: "How To: Shrink a Linux Virtual Machine Disk with VMware",
|
||||||
date: "2018-12-04 19:10:04-0400",
|
date: "2018-12-04 19:10:04-0400",
|
||||||
description: "VMware is bad at shrinking Linux VMs when space is freed up. How to optimize and shrink virtual disks.",
|
description: "VMware is bad at shrinking Linux VMs when space is freed up. How to optimize and shrink virtual disks.",
|
||||||
tags: ["How To", "Linux", "Tutorial", "Virtual Machines", "VMware"],
|
tags: ["How To", "Linux", "Tutorial", "Virtual Machines", "VMware"],
|
||||||
image: featuredImage.src,
|
image: "screen-shot-2018-12-07-at-2-04-04-pm.png",
|
||||||
};
|
};
|
||||||
|
|
||||||

|

|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./web-vitals.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "Revenge of the JavaScript: Moving from Hugo to Next.js",
|
title: "Revenge of the JavaScript: Moving from Hugo to Next.js",
|
||||||
date: "2022-04-07 10:53:33-0400",
|
date: "2022-04-07 10:53:33-0400",
|
||||||
description:
|
description:
|
||||||
"The next chapter in this website's history of overengineering, from static HTML with Hugo to React everywhere with Next.js.",
|
"The next chapter in this website's history of overengineering, from static HTML with Hugo to React everywhere with Next.js.",
|
||||||
tags: ["React", "JavaScript", "Next.js", "Hugo", "Meta"],
|
tags: ["React", "JavaScript", "Next.js", "Hugo", "Meta"],
|
||||||
image: featuredImage.src,
|
image: "web-vitals.png",
|
||||||
};
|
};
|
||||||
|
|
||||||

|

|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./24707394571_0818d4ab83_o-1-copy.jpg";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "Why This Millennial Is With Hillary Clinton Now — and Why We All Need To Be In November",
|
title: "Why This Millennial Is With Hillary Clinton Now — and Why We All Need To Be In November",
|
||||||
date: "2016-02-29 00:10:26-0400",
|
date: "2016-02-29 00:10:26-0400",
|
||||||
description:
|
description:
|
||||||
'I am a 24-year-old "millennial" and I passionately support Hillary Clinton for the 45th President of the United States. Yes, we exist.',
|
'I am a 24-year-old "millennial" and I passionately support Hillary Clinton for the 45th President of the United States. Yes, we exist.',
|
||||||
tags: ["2016 Presidential Election", "Bernie Sanders", "Hillary Clinton", "Politics"],
|
tags: ["2016 Presidential Election", "Bernie Sanders", "Hillary Clinton", "Politics"],
|
||||||
image: featuredImage.src,
|
image: "24707394571_0818d4ab83_o-1-copy.jpg",
|
||||||
noComments: true,
|
noComments: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./jbb-screen1.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "My First Code: Jake's Bulletin Board",
|
title: "My First Code: Jake's Bulletin Board",
|
||||||
date: "2019-10-01 08:34:25-0400",
|
date: "2019-10-01 08:34:25-0400",
|
||||||
description:
|
description:
|
||||||
"My first full coding project ever: a PHP bulletin board creatively titled Jake's Bulletin Board, circa 2003.",
|
"My first full coding project ever: a PHP bulletin board creatively titled Jake's Bulletin Board, circa 2003.",
|
||||||
tags: ["Hello World", "Baby's First PHP", "Nostalgia", "Vintage Code", "Awesome List"],
|
tags: ["Hello World", "Baby's First PHP", "Nostalgia", "Vintage Code", "Awesome List"],
|
||||||
image: featuredImage.src,
|
image: "jbb-screen1.png",
|
||||||
};
|
};
|
||||||
|
|
||||||

|

|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./overview.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "Netlify Analytics Review",
|
title: "Netlify Analytics Review",
|
||||||
date: "2019-11-13T08:21:22-0500",
|
date: "2019-11-13T08:21:22-0500",
|
||||||
description:
|
description:
|
||||||
"Netlify has released Netlify Analytics, a tracking tool that's the only one of its kind, prioritizing privacy and speed.",
|
"Netlify has released Netlify Analytics, a tracking tool that's the only one of its kind, prioritizing privacy and speed.",
|
||||||
tags: ["Review", "Analytics", "Data", "Netlify", "Privacy", "JAMStack"],
|
tags: ["Review", "Analytics", "Data", "Netlify", "Privacy", "JAMStack"],
|
||||||
image: featuredImage.src,
|
image: "overview.png",
|
||||||
};
|
};
|
||||||
|
|
||||||
I've been trying out [Netlify Analytics](https://www.netlify.com/products/analytics/) on this site for over a month now and have some quick thoughts about this unique offering in a world full of bloated and invasive tracking scripts.
|
I've been trying out [Netlify Analytics](https://www.netlify.com/products/analytics/) on this site for over a month now and have some quick thoughts about this unique offering in a world full of bloated and invasive tracking scripts.
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
import featuredImage from "./obama-laughing.jpg";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "Ranking 2020 Presidential Candidates's 404 Pages",
|
title: "Ranking 2020 Presidential Candidates's 404 Pages",
|
||||||
date: "2019-10-30 13:58:39-0400",
|
date: "2019-10-30 13:58:39-0400",
|
||||||
description: "Each of the 2020 presidential candidates's 404 Not Found pages, ranked.",
|
description: "Each of the 2020 presidential candidates's 404 Not Found pages, ranked.",
|
||||||
tags: ["Politics", "Campaign 2020", "Rankings", "Attempted Humor"],
|
tags: ["Politics", "Campaign 2020", "Rankings", "Attempted Humor"],
|
||||||
image: featuredImage.src,
|
image: "obama-laughing.jpg",
|
||||||
};
|
};
|
||||||
|
|
||||||

|

|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./security-headers.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "Adding Security Headers Using Cloudflare Workers",
|
title: "Adding Security Headers Using Cloudflare Workers",
|
||||||
date: "2019-02-28 03:18:10-0400",
|
date: "2019-02-28 03:18:10-0400",
|
||||||
description:
|
description:
|
||||||
"How to add important security headers to your website using Cloudflare Workers before delivering the response to the user.",
|
"How to add important security headers to your website using Cloudflare Workers before delivering the response to the user.",
|
||||||
tags: ["Security", "HTTP Headers", "Cloudflare", "Hosting", "Tutorial"],
|
tags: ["Security", "HTTP Headers", "Cloudflare", "Hosting", "Tutorial"],
|
||||||
image: featuredImage.src,
|
image: "security-headers.png",
|
||||||
};
|
};
|
||||||
|
|
||||||

|

|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./shodan.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "Fascinating & Frightening Shodan Search Queries (AKA: The Internet of Sh*t)",
|
title: "Fascinating & Frightening Shodan Search Queries (AKA: The Internet of Sh*t)",
|
||||||
date: "2019-09-19 09:56:10-0400",
|
date: "2019-09-19 09:56:10-0400",
|
||||||
description:
|
description:
|
||||||
"I've collected some interesting and scary search queries for Shodan, the internet-of-things search engine. Some return fun results, while others return serious vulnerabilities.",
|
"I've collected some interesting and scary search queries for Shodan, the internet-of-things search engine. Some return fun results, while others return serious vulnerabilities.",
|
||||||
tags: ["Infosec", "Pentesting", "Shodan", "Internet of Things", "Dorking"],
|
tags: ["Infosec", "Pentesting", "Shodan", "Internet of Things", "Dorking"],
|
||||||
image: featuredImage.src,
|
image: "shodan.png",
|
||||||
};
|
};
|
||||||
|
|
||||||
Over time, I've collected an assortment of interesting, funny, and depressing search queries to plug into [Shodan](https://www.shodan.io/), the ([literal](https://www.vice.com/en_uk/article/9bvxmd/shodan-exposes-the-dark-side-of-the-net)) internet search engine. Some return facepalm-inducing results, while others return serious and/or ancient vulnerabilities in the wild.
|
Over time, I've collected an assortment of interesting, funny, and depressing search queries to plug into [Shodan](https://www.shodan.io/), the ([literal](https://www.vice.com/en_uk/article/9bvxmd/shodan-exposes-the-dark-side-of-the-net)) internet search engine. Some return facepalm-inducing results, while others return serious and/or ancient vulnerabilities in the wild.
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
import featuredImage from "./screenshot.png";
|
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
title: "I Made A Thing, Powered by Windows Me™",
|
title: "I Made A Thing, Powered by Windows Me™",
|
||||||
date: "2020-06-06 10:05:23-0400",
|
date: "2020-06-06 10:05:23-0400",
|
||||||
description:
|
description:
|
||||||
"Introducing the Y2K Sandbox: fully featured, fully isolated, on-demand Windows Millennium Edition® virtual machines.",
|
"Introducing the Y2K Sandbox: fully featured, fully isolated, on-demand Windows Millennium Edition® virtual machines.",
|
||||||
tags: ["Projects", "Nostalgia", "Windows", "Virtual Machines"],
|
tags: ["Projects", "Nostalgia", "Windows", "Virtual Machines"],
|
||||||
image: featuredImage.src,
|
image: "screenshot.png",
|
||||||
};
|
};
|
||||||
|
|
||||||
A few months ago, I stumbled upon [my first website ever](https://jakejarvis.github.io/my-first-website/) on an old floppy disk. Despite the instant cringing, I [uploaded it](https://github.com/jakejarvis/my-first-website) to GitHub, [collected other iterations](/previously/), and made an [#awesome-list](https://github.com/jakejarvis/awesome-first-code) of others who were brave and/or shameless enough to do the same. But why not take that ~~one~~ 1,000 steps further?
|
A few months ago, I stumbled upon [my first website ever](https://jakejarvis.github.io/my-first-website/) on an old floppy disk. Despite the instant cringing, I [uploaded it](https://github.com/jakejarvis/my-first-website) to GitHub, [collected other iterations](/previously/), and made an [#awesome-list](https://github.com/jakejarvis/awesome-first-code) of others who were brave and/or shameless enough to do the same. But why not take that ~~one~~ 1,000 steps further?
|
||||||
|
13
package.json
13
package.json
@ -22,9 +22,9 @@
|
|||||||
"@giscus/react": "^3.1.0",
|
"@giscus/react": "^3.1.0",
|
||||||
"@mdx-js/loader": "^3.1.0",
|
"@mdx-js/loader": "^3.1.0",
|
||||||
"@mdx-js/react": "^3.1.0",
|
"@mdx-js/react": "^3.1.0",
|
||||||
"@next/bundle-analyzer": "15.3.0-canary.3",
|
"@next/bundle-analyzer": "15.3.0-canary.6",
|
||||||
"@next/mdx": "15.3.0-canary.3",
|
"@next/mdx": "15.3.0-canary.6",
|
||||||
"@next/third-parties": "15.3.0-canary.3",
|
"@next/third-parties": "15.3.0-canary.6",
|
||||||
"@octokit/graphql": "^8.2.1",
|
"@octokit/graphql": "^8.2.1",
|
||||||
"@octokit/graphql-schema": "^15.26.0",
|
"@octokit/graphql-schema": "^15.26.0",
|
||||||
"@prisma/client": "^6.5.0",
|
"@prisma/client": "^6.5.0",
|
||||||
@ -34,9 +34,10 @@
|
|||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
"fast-glob": "^3.3.3",
|
"fast-glob": "^3.3.3",
|
||||||
"feed": "^4.2.2",
|
"feed": "^4.2.2",
|
||||||
|
"geist": "^1.3.1",
|
||||||
"lucide-react": "0.479.0",
|
"lucide-react": "0.479.0",
|
||||||
"modern-normalize": "^3.0.1",
|
"modern-normalize": "^3.0.1",
|
||||||
"next": "15.3.0-canary.3",
|
"next": "15.3.0-canary.6",
|
||||||
"obj-str": "^1.1.0",
|
"obj-str": "^1.1.0",
|
||||||
"p-map": "^7.0.3",
|
"p-map": "^7.0.3",
|
||||||
"p-memoize": "^7.1.1",
|
"p-memoize": "^7.1.1",
|
||||||
@ -47,7 +48,7 @@
|
|||||||
"react-error-boundary": "^5.0.0",
|
"react-error-boundary": "^5.0.0",
|
||||||
"react-innertext": "^1.1.5",
|
"react-innertext": "^1.1.5",
|
||||||
"react-is": "19.0.0",
|
"react-is": "19.0.0",
|
||||||
"react-textarea-autosize": "^8.5.7",
|
"react-textarea-autosize": "^8.5.8",
|
||||||
"react-turnstile": "^1.1.4",
|
"react-turnstile": "^1.1.4",
|
||||||
"react-tweet": "^3.2.2",
|
"react-tweet": "^3.2.2",
|
||||||
"rehype-mdx-import-media": "^1.2.0",
|
"rehype-mdx-import-media": "^1.2.0",
|
||||||
@ -77,7 +78,7 @@
|
|||||||
"@types/react-is": "^19.0.0",
|
"@types/react-is": "^19.0.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"eslint": "^9.22.0",
|
"eslint": "^9.22.0",
|
||||||
"eslint-config-next": "15.3.0-canary.3",
|
"eslint-config-next": "15.3.0-canary.6",
|
||||||
"eslint-config-prettier": "^10.1.1",
|
"eslint-config-prettier": "^10.1.1",
|
||||||
"eslint-plugin-css-modules": "^2.12.0",
|
"eslint-plugin-css-modules": "^2.12.0",
|
||||||
"eslint-plugin-import": "^2.31.0",
|
"eslint-plugin-import": "^2.31.0",
|
||||||
|
212
pnpm-lock.yaml
generated
212
pnpm-lock.yaml
generated
@ -21,14 +21,14 @@ importers:
|
|||||||
specifier: ^3.1.0
|
specifier: ^3.1.0
|
||||||
version: 3.1.0(@types/react@19.0.10)(react@19.0.0)
|
version: 3.1.0(@types/react@19.0.10)(react@19.0.0)
|
||||||
'@next/bundle-analyzer':
|
'@next/bundle-analyzer':
|
||||||
specifier: 15.3.0-canary.3
|
specifier: 15.3.0-canary.6
|
||||||
version: 15.3.0-canary.3
|
version: 15.3.0-canary.6
|
||||||
'@next/mdx':
|
'@next/mdx':
|
||||||
specifier: 15.3.0-canary.3
|
specifier: 15.3.0-canary.6
|
||||||
version: 15.3.0-canary.3(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))
|
version: 15.3.0-canary.6(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))
|
||||||
'@next/third-parties':
|
'@next/third-parties':
|
||||||
specifier: 15.3.0-canary.3
|
specifier: 15.3.0-canary.6
|
||||||
version: 15.3.0-canary.3(next@15.3.0-canary.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
|
version: 15.3.0-canary.6(next@15.3.0-canary.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
|
||||||
'@octokit/graphql':
|
'@octokit/graphql':
|
||||||
specifier: ^8.2.1
|
specifier: ^8.2.1
|
||||||
version: 8.2.1
|
version: 8.2.1
|
||||||
@ -56,6 +56,9 @@ importers:
|
|||||||
feed:
|
feed:
|
||||||
specifier: ^4.2.2
|
specifier: ^4.2.2
|
||||||
version: 4.2.2
|
version: 4.2.2
|
||||||
|
geist:
|
||||||
|
specifier: ^1.3.1
|
||||||
|
version: 1.3.1(next@15.3.0-canary.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
|
||||||
lucide-react:
|
lucide-react:
|
||||||
specifier: 0.479.0
|
specifier: 0.479.0
|
||||||
version: 0.479.0(react@19.0.0)
|
version: 0.479.0(react@19.0.0)
|
||||||
@ -63,8 +66,8 @@ importers:
|
|||||||
specifier: ^3.0.1
|
specifier: ^3.0.1
|
||||||
version: 3.0.1
|
version: 3.0.1
|
||||||
next:
|
next:
|
||||||
specifier: 15.3.0-canary.3
|
specifier: 15.3.0-canary.6
|
||||||
version: 15.3.0-canary.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
|
version: 15.3.0-canary.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
|
||||||
obj-str:
|
obj-str:
|
||||||
specifier: ^1.1.0
|
specifier: ^1.1.0
|
||||||
version: 1.1.0
|
version: 1.1.0
|
||||||
@ -96,8 +99,8 @@ importers:
|
|||||||
specifier: 19.0.0
|
specifier: 19.0.0
|
||||||
version: 19.0.0
|
version: 19.0.0
|
||||||
react-textarea-autosize:
|
react-textarea-autosize:
|
||||||
specifier: ^8.5.7
|
specifier: ^8.5.8
|
||||||
version: 8.5.7(@types/react@19.0.10)(react@19.0.0)
|
version: 8.5.8(@types/react@19.0.10)(react@19.0.0)
|
||||||
react-turnstile:
|
react-turnstile:
|
||||||
specifier: ^1.1.4
|
specifier: ^1.1.4
|
||||||
version: 1.1.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
|
version: 1.1.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
|
||||||
@ -181,8 +184,8 @@ importers:
|
|||||||
specifier: ^9.22.0
|
specifier: ^9.22.0
|
||||||
version: 9.22.0
|
version: 9.22.0
|
||||||
eslint-config-next:
|
eslint-config-next:
|
||||||
specifier: 15.3.0-canary.3
|
specifier: 15.3.0-canary.6
|
||||||
version: 15.3.0-canary.3(eslint@9.22.0)(typescript@5.8.2)
|
version: 15.3.0-canary.6(eslint@9.22.0)(typescript@5.8.2)
|
||||||
eslint-config-prettier:
|
eslint-config-prettier:
|
||||||
specifier: ^10.1.1
|
specifier: ^10.1.1
|
||||||
version: 10.1.1(eslint@9.22.0)
|
version: 10.1.1(eslint@9.22.0)
|
||||||
@ -442,14 +445,8 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@eslint-community/eslint-utils@4.4.1':
|
'@eslint-community/eslint-utils@4.5.1':
|
||||||
resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
|
resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
|
||||||
peerDependencies:
|
|
||||||
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
|
|
||||||
|
|
||||||
'@eslint-community/eslint-utils@4.5.0':
|
|
||||||
resolution: {integrity: sha512-RoV8Xs9eNwiDvhv7M+xcL4PWyRyIXRY/FLp3buU4h1EYfdF7unWUy3dOjPqb3C7rMUewIcqwW850PgS8h1o1yg==}
|
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
|
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
|
||||||
@ -652,17 +649,17 @@ packages:
|
|||||||
'@types/react': '>=16'
|
'@types/react': '>=16'
|
||||||
react: '>=16'
|
react: '>=16'
|
||||||
|
|
||||||
'@next/bundle-analyzer@15.3.0-canary.3':
|
'@next/bundle-analyzer@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-fB6D8Ifr7Am3Fj3+aJ6bmgYt/9XsI67PXArvwXsRfxS3nVVmvBpZ0ghx8d8Aqgd3sHQo4Q+hKFD88vVEWPHWYA==}
|
resolution: {integrity: sha512-M6eaBkxo60WbGYv5pY5/FcpfMT8I9R7qepcoEpIxP0N7cMuo2IURXMhdt2rgmrZmBs+8xsqCotVRDt2rO4tA0w==}
|
||||||
|
|
||||||
'@next/env@15.3.0-canary.3':
|
'@next/env@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-V+XsTT6axlJCuM7fqXLljDyliaquRHA9Wlv31m/CIhfiQ3Wv/PzUwHJ1Wp/EjG0KDt8X8b11qLAPzWYR+DsyRQ==}
|
resolution: {integrity: sha512-ZaiOaNef86GzehX2W7ZbKf3F9XXwrzcKQBnVvmKjHokumQkixoRb4cmSpro5wuEZ761nu15Z5cQeIudvEad4QA==}
|
||||||
|
|
||||||
'@next/eslint-plugin-next@15.3.0-canary.3':
|
'@next/eslint-plugin-next@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-MMVYa3XXPOjk8eDLrwWsQY3l2KK9fcRFdcDK4EwZvChqCNLxGdWeZKJ/8FZdSCbOSiohnuouvoYDlEr3xpXBYA==}
|
resolution: {integrity: sha512-s2M/oWJR5dDP3nzzdHpsC83YZgz/QF0Wlt7Kus0dxSTgur8WpyO59QvNFqeYWxHwcrk1tM6XHkaGGBBdodYX7g==}
|
||||||
|
|
||||||
'@next/mdx@15.3.0-canary.3':
|
'@next/mdx@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-wgFr+YSPNwzJdrEWsBKttC6DfgW6EREpCp7UvLalmM4BmoUN/n8Xy6OgZ5SMcNwO/4U8ZPK9Pwf5sbHkdLUn1Q==}
|
resolution: {integrity: sha512-opVhy5uHLs6nuSxSxeScKLrHzNMzM6Vy3EGet7vvm6pV1o5oFWjDTpd8QcBcUovbPRZst2UQJ4R39SCj4wsSww==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@mdx-js/loader': '>=0.15.0'
|
'@mdx-js/loader': '>=0.15.0'
|
||||||
'@mdx-js/react': '>=0.15.0'
|
'@mdx-js/react': '>=0.15.0'
|
||||||
@ -672,56 +669,56 @@ packages:
|
|||||||
'@mdx-js/react':
|
'@mdx-js/react':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-darwin-arm64@15.3.0-canary.3':
|
'@next/swc-darwin-arm64@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-mwlueJP9EsFLeY0AMep2hO+clSakgTGUo7WgGzcVBrHAeTd3C1B++stG4AqJKA+WnbBS8+NzOkUHcsSb0xO0Sg==}
|
resolution: {integrity: sha512-Ha7GrbUmF5sdMYGHwcTP1+eFtsl/1Bobxc2yEzBONF4ZGsDwTJtJ0mg6/duyDBH6vB4Qi5mvO9ohe8AKcubFwA==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@next/swc-darwin-x64@15.3.0-canary.3':
|
'@next/swc-darwin-x64@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-h8qIKjJVAyR4eE/LM3JbqFHZIkWUO2pT7OCgPzxrllh8l+JzVSeBu3bolehB+dDMsgYmYTUSpK48MDCy32A5VQ==}
|
resolution: {integrity: sha512-SwEH5UZ1D7BhUThx5qu0ONhSXYaIAziC3o021lfWMzPtsZlylxP6W5CLRnyf16geTNEsn9/PcipaI9pRvmVaEQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@next/swc-linux-arm64-gnu@15.3.0-canary.3':
|
'@next/swc-linux-arm64-gnu@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-BnZyBZACG2163EskYa5nkrrRXMRZlQLFFnSZGYGGwRCP3FsEq5tBKMooCI1duJe9HKhIja8hsAVVN/MR2em/4w==}
|
resolution: {integrity: sha512-IqRHfFOaICHC8Pfb/8NFGn1jzSb3pbR9IE6ea/DjQp4dv5NguMQ3iPB3SEMEojh9mvpUhmXT7FoSF9xZO24E5w==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@next/swc-linux-arm64-musl@15.3.0-canary.3':
|
'@next/swc-linux-arm64-musl@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-14c8ufKAVewA/ar0ELfzxmrt7nsxwDh/DilIGOG64+ujt1jfctJTh490Zo3uw5pqAxnXCQ4OTidAK0JBTzivjg==}
|
resolution: {integrity: sha512-jyplseHznib0tfe/fx5l2lV4f/ZpDHSJBnq8d5dOQZwa9kqGD/plcfqOqdwR7XmwYrDoXXyDiWArk6F1XCMWDQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@next/swc-linux-x64-gnu@15.3.0-canary.3':
|
'@next/swc-linux-x64-gnu@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-1FVAEav57ZZS7RXOjuhPpyr9t13hT3mT1J11gz9eEnqTvKEvl594EimgoLU2+TPwmUTE9wPdxQGEunWyU9GsbQ==}
|
resolution: {integrity: sha512-vMPd9dTR1eRYFGYGb2J/5WYuBYiUXy/hNFhnXbBq5hVf2kZ8wlJblJuNC/yyXr9lvSf4jsXDuWeXNYPaRl85hA==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@next/swc-linux-x64-musl@15.3.0-canary.3':
|
'@next/swc-linux-x64-musl@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-AoP3HLLXPG2IRwZtqcBSJ0LjlzDy/smrfxQqXpDJ+owwi+2mugnAzWOkDenBdOTmo0jjeSdzh7/9pujSDBGiYA==}
|
resolution: {integrity: sha512-va7/O3oqgWUMIzNLAuQXbKFw6DqTS6S45FneyGWGorDlttq1K11cBYKOQhz3If7Lw/ftrLLOLPdlYZGcciCdeg==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@next/swc-win32-arm64-msvc@15.3.0-canary.3':
|
'@next/swc-win32-arm64-msvc@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-x13cBLrM50iDVALN4pZQYmZ7R5s1ZHod6pvEc9yw+C3SskOhHwSaBmykUC0hkrYXZ+wkz1wTrzLYl4ALj3roUg==}
|
resolution: {integrity: sha512-SeUU5mQSIZXGwMxl5Bn94CdWF0R3YIWCxWq9Lpo1KW2B2S6F61WCmjeZnZZ9TOGMi4D7BAP96ptMCNiNOZUi0Q==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@next/swc-win32-x64-msvc@15.3.0-canary.3':
|
'@next/swc-win32-x64-msvc@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-4c/dnJ3ZbBgqk4w7gpp5zku5Xn2b/KDAJgzxDwTWo+WfP6nCIMC48x0Tas1pmOMiCWoRcXS2kCApFIRdCPokSw==}
|
resolution: {integrity: sha512-P+O19Iet4806xsdVFwbVfzxeTRb50xImjK5NT9Ge5gXCSuBw+DdRdJhENijRYa9lS/RnQVrXfII5gLdLy4X3sQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>= 10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@next/third-parties@15.3.0-canary.3':
|
'@next/third-parties@15.3.0-canary.6':
|
||||||
resolution: {integrity: sha512-MdUSCmdud0ihdv1eWUMeJq/mZE+cR+N8d+hIhz388Zv3FPoYL9oIxVaDceeOwzgKltayMtmRN80yso29/lP0eQ==}
|
resolution: {integrity: sha512-6M5iSbY21atKOYfw4Kx4xWgPv0aoYKrNrz/3PIgcDROnkgT05LkIJMQecZ06+2r+ff93NuKYqtEz+NvZMHPcXQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
next: ^13.0.0 || ^14.0.0 || ^15.0.0
|
next: ^13.0.0 || ^14.0.0 || ^15.0.0
|
||||||
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
|
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
|
||||||
@ -1152,8 +1149,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
|
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
caniuse-lite@1.0.30001703:
|
caniuse-lite@1.0.30001704:
|
||||||
resolution: {integrity: sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==}
|
resolution: {integrity: sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew==}
|
||||||
|
|
||||||
ccount@2.0.1:
|
ccount@2.0.1:
|
||||||
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
|
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
|
||||||
@ -1178,8 +1175,8 @@ packages:
|
|||||||
character-reference-invalid@2.0.1:
|
character-reference-invalid@2.0.1:
|
||||||
resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
|
resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
|
||||||
|
|
||||||
ci-info@4.1.0:
|
ci-info@4.2.0:
|
||||||
resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==}
|
resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
cli-cursor@5.0.0:
|
cli-cursor@5.0.0:
|
||||||
@ -1479,8 +1476,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
|
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
eslint-config-next@15.3.0-canary.3:
|
eslint-config-next@15.3.0-canary.6:
|
||||||
resolution: {integrity: sha512-I2PYCn1Uzfuya70buXwmMeCngFWe9nB0+CTq49dm56e5Ze/rNOjytXhZFTWKwTnl9HrNy7+c3Y91Y6/6pkXpjg==}
|
resolution: {integrity: sha512-NEefwyiCUtXGkpJN5CwCJSYra2+8+YyMYo6TtG59b+jsrZxa9r12emTWYJcWMzNgxDZvRM4xYO6pyXs1ie2FyA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
|
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
|
||||||
typescript: '>=3.3.1'
|
typescript: '>=3.3.1'
|
||||||
@ -1767,6 +1764,11 @@ packages:
|
|||||||
functions-have-names@1.2.3:
|
functions-have-names@1.2.3:
|
||||||
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
|
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
|
||||||
|
|
||||||
|
geist@1.3.1:
|
||||||
|
resolution: {integrity: sha512-Q4gC1pBVPN+D579pBaz0TRRnGA4p9UK6elDY/xizXdFk/g4EKR5g0I+4p/Kj6gM0SajDBZ/0FvDV9ey9ud7BWw==}
|
||||||
|
peerDependencies:
|
||||||
|
next: '>=13.2.0'
|
||||||
|
|
||||||
get-east-asian-width@1.3.0:
|
get-east-asian-width@1.3.0:
|
||||||
resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
|
resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@ -2542,8 +2544,8 @@ packages:
|
|||||||
natural-compare@1.4.0:
|
natural-compare@1.4.0:
|
||||||
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
|
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
|
||||||
|
|
||||||
next@15.3.0-canary.3:
|
next@15.3.0-canary.6:
|
||||||
resolution: {integrity: sha512-8qacZS/m6rwXfyksRITAzAo6J0lT8/w9JNnlSj/JjdoCwqHY5A7hR+aVdsxEHk3Oxez6BmEro2pPWK3cd5EKLA==}
|
resolution: {integrity: sha512-2ud5m+f6q4iCwRGJSCODhJHTlSXi1ueY4tMx38EYp8obLCT1VBpCqLm70ppu0RYU+D79Vkqgf1VaQ+tu3i0nuw==}
|
||||||
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
|
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@ -2864,8 +2866,8 @@ packages:
|
|||||||
react-promise-suspense@0.3.4:
|
react-promise-suspense@0.3.4:
|
||||||
resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==}
|
resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==}
|
||||||
|
|
||||||
react-textarea-autosize@8.5.7:
|
react-textarea-autosize@8.5.8:
|
||||||
resolution: {integrity: sha512-2MqJ3p0Jh69yt9ktFIaZmORHXw4c4bxSIhCeWiFwmJ9EYKgLmuNII3e9c9b2UO+ijl4StnpZdqpxNIhTdHvqtQ==}
|
resolution: {integrity: sha512-iUiIj70JefrTuSJ4LbVFiSqWiHHss5L63L717bqaWHMgkm9sz6eEvro4vZ3uQfGJbevzwT6rHOszHKA8RkhRMg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
|
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
@ -2910,8 +2912,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
|
resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
refractor@4.8.1:
|
refractor@4.9.0:
|
||||||
resolution: {integrity: sha512-/fk5sI0iTgFYlmVGYVew90AoYnNMP6pooClx/XKqyeeCQXrL0Kvgn8V0VEht5ccdljbzzF1i3Q213gcntkRExg==}
|
resolution: {integrity: sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og==}
|
||||||
|
|
||||||
regenerator-runtime@0.14.1:
|
regenerator-runtime@0.14.1:
|
||||||
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
|
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
|
||||||
@ -3519,8 +3521,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
|
resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
which-typed-array@1.1.18:
|
which-typed-array@1.1.19:
|
||||||
resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==}
|
resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
which@1.3.1:
|
which@1.3.1:
|
||||||
@ -3703,12 +3705,7 @@ snapshots:
|
|||||||
'@esbuild/win32-x64@0.25.1':
|
'@esbuild/win32-x64@0.25.1':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@eslint-community/eslint-utils@4.4.1(eslint@9.22.0)':
|
'@eslint-community/eslint-utils@4.5.1(eslint@9.22.0)':
|
||||||
dependencies:
|
|
||||||
eslint: 9.22.0
|
|
||||||
eslint-visitor-keys: 3.4.3
|
|
||||||
|
|
||||||
'@eslint-community/eslint-utils@4.5.0(eslint@9.22.0)':
|
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 9.22.0
|
eslint: 9.22.0
|
||||||
eslint-visitor-keys: 3.4.3
|
eslint-visitor-keys: 3.4.3
|
||||||
@ -3913,53 +3910,53 @@ snapshots:
|
|||||||
'@types/react': 19.0.10
|
'@types/react': 19.0.10
|
||||||
react: 19.0.0
|
react: 19.0.0
|
||||||
|
|
||||||
'@next/bundle-analyzer@15.3.0-canary.3':
|
'@next/bundle-analyzer@15.3.0-canary.6':
|
||||||
dependencies:
|
dependencies:
|
||||||
webpack-bundle-analyzer: 4.10.1
|
webpack-bundle-analyzer: 4.10.1
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- bufferutil
|
- bufferutil
|
||||||
- utf-8-validate
|
- utf-8-validate
|
||||||
|
|
||||||
'@next/env@15.3.0-canary.3': {}
|
'@next/env@15.3.0-canary.6': {}
|
||||||
|
|
||||||
'@next/eslint-plugin-next@15.3.0-canary.3':
|
'@next/eslint-plugin-next@15.3.0-canary.6':
|
||||||
dependencies:
|
dependencies:
|
||||||
fast-glob: 3.3.1
|
fast-glob: 3.3.1
|
||||||
|
|
||||||
'@next/mdx@15.3.0-canary.3(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))':
|
'@next/mdx@15.3.0-canary.6(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))':
|
||||||
dependencies:
|
dependencies:
|
||||||
source-map: 0.7.4
|
source-map: 0.7.4
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@mdx-js/loader': 3.1.0(acorn@8.14.1)
|
'@mdx-js/loader': 3.1.0(acorn@8.14.1)
|
||||||
'@mdx-js/react': 3.1.0(@types/react@19.0.10)(react@19.0.0)
|
'@mdx-js/react': 3.1.0(@types/react@19.0.10)(react@19.0.0)
|
||||||
|
|
||||||
'@next/swc-darwin-arm64@15.3.0-canary.3':
|
'@next/swc-darwin-arm64@15.3.0-canary.6':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-darwin-x64@15.3.0-canary.3':
|
'@next/swc-darwin-x64@15.3.0-canary.6':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-linux-arm64-gnu@15.3.0-canary.3':
|
'@next/swc-linux-arm64-gnu@15.3.0-canary.6':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-linux-arm64-musl@15.3.0-canary.3':
|
'@next/swc-linux-arm64-musl@15.3.0-canary.6':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-linux-x64-gnu@15.3.0-canary.3':
|
'@next/swc-linux-x64-gnu@15.3.0-canary.6':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-linux-x64-musl@15.3.0-canary.3':
|
'@next/swc-linux-x64-musl@15.3.0-canary.6':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-win32-arm64-msvc@15.3.0-canary.3':
|
'@next/swc-win32-arm64-msvc@15.3.0-canary.6':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/swc-win32-x64-msvc@15.3.0-canary.3':
|
'@next/swc-win32-x64-msvc@15.3.0-canary.6':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@next/third-parties@15.3.0-canary.3(next@15.3.0-canary.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
|
'@next/third-parties@15.3.0-canary.6(next@15.3.0-canary.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
next: 15.3.0-canary.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
|
next: 15.3.0-canary.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
|
||||||
react: 19.0.0
|
react: 19.0.0
|
||||||
third-party-capital: 1.0.20
|
third-party-capital: 1.0.20
|
||||||
|
|
||||||
@ -3981,7 +3978,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@npmcli/map-workspaces': 3.0.6
|
'@npmcli/map-workspaces': 3.0.6
|
||||||
'@npmcli/package-json': 5.2.1
|
'@npmcli/package-json': 5.2.1
|
||||||
ci-info: 4.1.0
|
ci-info: 4.2.0
|
||||||
ini: 4.1.3
|
ini: 4.1.3
|
||||||
nopt: 7.2.1
|
nopt: 7.2.1
|
||||||
proc-log: 4.2.0
|
proc-log: 4.2.0
|
||||||
@ -4265,7 +4262,7 @@ snapshots:
|
|||||||
|
|
||||||
'@typescript-eslint/utils@8.26.1(eslint@9.22.0)(typescript@5.8.2)':
|
'@typescript-eslint/utils@8.26.1(eslint@9.22.0)(typescript@5.8.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.5.0(eslint@9.22.0)
|
'@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0)
|
||||||
'@typescript-eslint/scope-manager': 8.26.1
|
'@typescript-eslint/scope-manager': 8.26.1
|
||||||
'@typescript-eslint/types': 8.26.1
|
'@typescript-eslint/types': 8.26.1
|
||||||
'@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2)
|
'@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2)
|
||||||
@ -4465,7 +4462,7 @@ snapshots:
|
|||||||
|
|
||||||
callsites@3.1.0: {}
|
callsites@3.1.0: {}
|
||||||
|
|
||||||
caniuse-lite@1.0.30001703: {}
|
caniuse-lite@1.0.30001704: {}
|
||||||
|
|
||||||
ccount@2.0.1: {}
|
ccount@2.0.1: {}
|
||||||
|
|
||||||
@ -4484,7 +4481,7 @@ snapshots:
|
|||||||
|
|
||||||
character-reference-invalid@2.0.1: {}
|
character-reference-invalid@2.0.1: {}
|
||||||
|
|
||||||
ci-info@4.1.0: {}
|
ci-info@4.2.0: {}
|
||||||
|
|
||||||
cli-cursor@5.0.0:
|
cli-cursor@5.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -4762,7 +4759,7 @@ snapshots:
|
|||||||
typed-array-byte-offset: 1.0.4
|
typed-array-byte-offset: 1.0.4
|
||||||
typed-array-length: 1.0.7
|
typed-array-length: 1.0.7
|
||||||
unbox-primitive: 1.1.0
|
unbox-primitive: 1.1.0
|
||||||
which-typed-array: 1.1.18
|
which-typed-array: 1.1.19
|
||||||
|
|
||||||
es-define-property@1.0.1: {}
|
es-define-property@1.0.1: {}
|
||||||
|
|
||||||
@ -4861,9 +4858,9 @@ snapshots:
|
|||||||
|
|
||||||
escape-string-regexp@5.0.0: {}
|
escape-string-regexp@5.0.0: {}
|
||||||
|
|
||||||
eslint-config-next@15.3.0-canary.3(eslint@9.22.0)(typescript@5.8.2):
|
eslint-config-next@15.3.0-canary.6(eslint@9.22.0)(typescript@5.8.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@next/eslint-plugin-next': 15.3.0-canary.3
|
'@next/eslint-plugin-next': 15.3.0-canary.6
|
||||||
'@rushstack/eslint-patch': 1.11.0
|
'@rushstack/eslint-patch': 1.11.0
|
||||||
'@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)
|
'@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)
|
||||||
'@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2)
|
'@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2)
|
||||||
@ -5056,7 +5053,7 @@ snapshots:
|
|||||||
|
|
||||||
eslint@9.22.0:
|
eslint@9.22.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0)
|
'@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0)
|
||||||
'@eslint-community/regexpp': 4.12.1
|
'@eslint-community/regexpp': 4.12.1
|
||||||
'@eslint/config-array': 0.19.2
|
'@eslint/config-array': 0.19.2
|
||||||
'@eslint/config-helpers': 0.1.0
|
'@eslint/config-helpers': 0.1.0
|
||||||
@ -5270,6 +5267,10 @@ snapshots:
|
|||||||
|
|
||||||
functions-have-names@1.2.3: {}
|
functions-have-names@1.2.3: {}
|
||||||
|
|
||||||
|
geist@1.3.1(next@15.3.0-canary.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)):
|
||||||
|
dependencies:
|
||||||
|
next: 15.3.0-canary.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
|
||||||
|
|
||||||
get-east-asian-width@1.3.0: {}
|
get-east-asian-width@1.3.0: {}
|
||||||
|
|
||||||
get-intrinsic@1.3.0:
|
get-intrinsic@1.3.0:
|
||||||
@ -5723,7 +5724,7 @@ snapshots:
|
|||||||
|
|
||||||
is-typed-array@1.1.15:
|
is-typed-array@1.1.15:
|
||||||
dependencies:
|
dependencies:
|
||||||
which-typed-array: 1.1.18
|
which-typed-array: 1.1.19
|
||||||
|
|
||||||
is-weakmap@2.0.2: {}
|
is-weakmap@2.0.2: {}
|
||||||
|
|
||||||
@ -6391,26 +6392,26 @@ snapshots:
|
|||||||
|
|
||||||
natural-compare@1.4.0: {}
|
natural-compare@1.4.0: {}
|
||||||
|
|
||||||
next@15.3.0-canary.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
|
next@15.3.0-canary.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@next/env': 15.3.0-canary.3
|
'@next/env': 15.3.0-canary.6
|
||||||
'@swc/counter': 0.1.3
|
'@swc/counter': 0.1.3
|
||||||
'@swc/helpers': 0.5.15
|
'@swc/helpers': 0.5.15
|
||||||
busboy: 1.6.0
|
busboy: 1.6.0
|
||||||
caniuse-lite: 1.0.30001703
|
caniuse-lite: 1.0.30001704
|
||||||
postcss: 8.4.31
|
postcss: 8.4.31
|
||||||
react: 19.0.0
|
react: 19.0.0
|
||||||
react-dom: 19.0.0(react@19.0.0)
|
react-dom: 19.0.0(react@19.0.0)
|
||||||
styled-jsx: 5.1.6(react@19.0.0)
|
styled-jsx: 5.1.6(react@19.0.0)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@next/swc-darwin-arm64': 15.3.0-canary.3
|
'@next/swc-darwin-arm64': 15.3.0-canary.6
|
||||||
'@next/swc-darwin-x64': 15.3.0-canary.3
|
'@next/swc-darwin-x64': 15.3.0-canary.6
|
||||||
'@next/swc-linux-arm64-gnu': 15.3.0-canary.3
|
'@next/swc-linux-arm64-gnu': 15.3.0-canary.6
|
||||||
'@next/swc-linux-arm64-musl': 15.3.0-canary.3
|
'@next/swc-linux-arm64-musl': 15.3.0-canary.6
|
||||||
'@next/swc-linux-x64-gnu': 15.3.0-canary.3
|
'@next/swc-linux-x64-gnu': 15.3.0-canary.6
|
||||||
'@next/swc-linux-x64-musl': 15.3.0-canary.3
|
'@next/swc-linux-x64-musl': 15.3.0-canary.6
|
||||||
'@next/swc-win32-arm64-msvc': 15.3.0-canary.3
|
'@next/swc-win32-arm64-msvc': 15.3.0-canary.6
|
||||||
'@next/swc-win32-x64-msvc': 15.3.0-canary.3
|
'@next/swc-win32-x64-msvc': 15.3.0-canary.6
|
||||||
sharp: 0.33.5
|
sharp: 0.33.5
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@babel/core'
|
- '@babel/core'
|
||||||
@ -6717,7 +6718,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fast-deep-equal: 2.0.1
|
fast-deep-equal: 2.0.1
|
||||||
|
|
||||||
react-textarea-autosize@8.5.7(@types/react@19.0.10)(react@19.0.0):
|
react-textarea-autosize@8.5.8(@types/react@19.0.10)(react@19.0.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime': 7.26.10
|
'@babel/runtime': 7.26.10
|
||||||
react: 19.0.0
|
react: 19.0.0
|
||||||
@ -6793,7 +6794,7 @@ snapshots:
|
|||||||
get-proto: 1.0.1
|
get-proto: 1.0.1
|
||||||
which-builtin-type: 1.2.1
|
which-builtin-type: 1.2.1
|
||||||
|
|
||||||
refractor@4.8.1:
|
refractor@4.9.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 2.3.10
|
'@types/hast': 2.3.10
|
||||||
'@types/prismjs': 1.26.5
|
'@types/prismjs': 1.26.5
|
||||||
@ -6831,7 +6832,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
hast-util-to-string: 3.0.1
|
hast-util-to-string: 3.0.1
|
||||||
parse-numeric-range: 1.3.0
|
parse-numeric-range: 1.3.0
|
||||||
refractor: 4.8.1
|
refractor: 4.9.0
|
||||||
rehype-parse: 9.0.1
|
rehype-parse: 9.0.1
|
||||||
unist-util-filter: 5.0.1
|
unist-util-filter: 5.0.1
|
||||||
unist-util-visit: 5.0.0
|
unist-util-visit: 5.0.0
|
||||||
@ -7677,7 +7678,7 @@ snapshots:
|
|||||||
isarray: 2.0.5
|
isarray: 2.0.5
|
||||||
which-boxed-primitive: 1.1.1
|
which-boxed-primitive: 1.1.1
|
||||||
which-collection: 1.0.2
|
which-collection: 1.0.2
|
||||||
which-typed-array: 1.1.18
|
which-typed-array: 1.1.19
|
||||||
|
|
||||||
which-collection@1.0.2:
|
which-collection@1.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -7686,12 +7687,13 @@ snapshots:
|
|||||||
is-weakmap: 2.0.2
|
is-weakmap: 2.0.2
|
||||||
is-weakset: 2.0.4
|
is-weakset: 2.0.4
|
||||||
|
|
||||||
which-typed-array@1.1.18:
|
which-typed-array@1.1.19:
|
||||||
dependencies:
|
dependencies:
|
||||||
available-typed-arrays: 1.0.7
|
available-typed-arrays: 1.0.7
|
||||||
call-bind: 1.0.8
|
call-bind: 1.0.8
|
||||||
call-bound: 1.0.4
|
call-bound: 1.0.4
|
||||||
for-each: 0.3.5
|
for-each: 0.3.5
|
||||||
|
get-proto: 1.0.1
|
||||||
gopd: 1.2.0
|
gopd: 1.2.0
|
||||||
has-tostringtag: 1.0.2
|
has-tostringtag: 1.0.2
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 128 KiB |
Loading…
x
Reference in New Issue
Block a user