cloudflare (#1)

* build: remove rome

* build: remove rome

* cf

* cf

* wip
This commit is contained in:
Andreas Thomas 2023-03-23 00:22:37 +01:00 committed by GitHub
parent e57c10249b
commit b4a3854c26
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 6431 additions and 520 deletions

View File

@ -5,94 +5,90 @@ import rehypePrettyCode from "rehype-pretty-code";
import rehypeSlug from "rehype-slug";
import rehypeAutolinkHeadings from "rehype-autolink-headings";
var computedFields = {
path: {
type: "string",
resolve: (doc) => `/${doc._raw.flattenedPath}`
},
slug: {
type: "string",
resolve: (doc) => doc._raw.flattenedPath.split("/").slice(1).join("/")
}
path: {
type: "string",
resolve: (doc) => `/${doc._raw.flattenedPath}`,
},
slug: {
type: "string",
resolve: (doc) => doc._raw.flattenedPath.split("/").slice(1).join("/"),
},
};
var Project = defineDocumentType(() => ({
name: "Project",
filePathPattern: "./projects/**/*.mdx",
contentType: "mdx",
fields: {
title: {
type: "string",
required: true
},
description: {
type: "string",
required: true
},
date: {
type: "date"
},
url: {
type: "string"
},
repository: {
type: "string"
}
},
computedFields
name: "Project",
filePathPattern: "./projects/**/*.mdx",
contentType: "mdx",
fields: {
title: {
type: "string",
required: true,
},
description: {
type: "string",
required: true,
},
date: {
type: "date",
},
url: {
type: "string",
},
repository: {
type: "string",
},
},
computedFields,
}));
var Page = defineDocumentType(() => ({
name: "Page",
filePathPattern: "pages/**/*.mdx",
contentType: "mdx",
fields: {
title: {
type: "string",
required: true
},
description: {
type: "string"
}
},
computedFields
name: "Page",
filePathPattern: "pages/**/*.mdx",
contentType: "mdx",
fields: {
title: {
type: "string",
required: true,
},
description: {
type: "string",
},
},
computedFields,
}));
var contentlayer_config_default = makeSource({
contentDirPath: "./content",
documentTypes: [Page, Project],
mdx: {
remarkPlugins: [remarkGfm],
rehypePlugins: [
rehypeSlug,
[
rehypePrettyCode,
{
theme: "github-dark",
onVisitLine(node) {
if (node.children.length === 0) {
node.children = [{ type: "text", value: " " }];
}
},
onVisitHighlightedLine(node) {
node.properties.className.push("line--highlighted");
},
onVisitHighlightedWord(node) {
node.properties.className = ["word--highlighted"];
}
}
],
[
rehypeAutolinkHeadings,
{
properties: {
className: ["subheading-anchor"],
ariaLabel: "Link to section"
}
}
]
]
}
contentDirPath: "./content",
documentTypes: [Page, Project],
mdx: {
remarkPlugins: [remarkGfm],
rehypePlugins: [
rehypeSlug,
[
rehypePrettyCode,
{
theme: "github-dark",
onVisitLine(node) {
if (node.children.length === 0) {
node.children = [{ type: "text", value: " " }];
}
},
onVisitHighlightedLine(node) {
node.properties.className.push("line--highlighted");
},
onVisitHighlightedWord(node) {
node.properties.className = ["word--highlighted"];
},
},
],
[
rehypeAutolinkHeadings,
{
properties: {
className: ["subheading-anchor"],
ariaLabel: "Link to section",
},
},
],
],
},
});
export {
Page,
Project,
contentlayer_config_default as default
};
export { Page, Project, contentlayer_config_default as default };
//# sourceMappingURL=compiled-contentlayer-config-KFUTZ636.mjs.map

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,3 @@
// NOTE This file is auto-generated by Contentlayer
export const allPages = []
export const allPages = [];

File diff suppressed because one or more lines are too long

View File

@ -1,19 +1,61 @@
// NOTE This file is auto-generated by Contentlayer
import projects__accessMdx from './projects__access.mdx.json' assert { type: 'json' }
import projects__envshareMdx from './projects__envshare.mdx.json' assert { type: 'json' }
import projects__planetfallMdx from './projects__planetfall.mdx.json' assert { type: 'json' }
import projects__qstashMdx from './projects__qstash.mdx.json' assert { type: 'json' }
import projects__redisQueryMdx from './projects__redis-query.mdx.json' assert { type: 'json' }
import projects__terraformProviderVercelMdx from './projects__terraform-provider-vercel.mdx.json' assert { type: 'json' }
import projects__upstashAuthAnalyticsMdx from './projects__upstash-auth-analytics.mdx.json' assert { type: 'json' }
import projects__upstashCliMdx from './projects__upstash-cli.mdx.json' assert { type: 'json' }
import projects__upstashCoreAnalyticsMdx from './projects__upstash-core-analytics.mdx.json' assert { type: 'json' }
import projects__upstashEdgeFlagsMdx from './projects__upstash-edge-flags.mdx.json' assert { type: 'json' }
import projects__upstashKafkaMdx from './projects__upstash-kafka.mdx.json' assert { type: 'json' }
import projects__upstashQstashSdkMdx from './projects__upstash-qstash-sdk.mdx.json' assert { type: 'json' }
import projects__upstashRatelimitMdx from './projects__upstash-ratelimit.mdx.json' assert { type: 'json' }
import projects__upstashReactUiMdx from './projects__upstash-react-ui.mdx.json' assert { type: 'json' }
import projects__upstashRedisMdx from './projects__upstash-redis.mdx.json' assert { type: 'json' }
import projects__accessMdx from "./projects__access.mdx.json" assert {
type: "json",
};
import projects__envshareMdx from "./projects__envshare.mdx.json" assert {
type: "json",
};
import projects__planetfallMdx from "./projects__planetfall.mdx.json" assert {
type: "json",
};
import projects__qstashMdx from "./projects__qstash.mdx.json" assert {
type: "json",
};
import projects__terraformProviderVercelMdx from "./projects__terraform-provider-vercel.mdx.json" assert {
type: "json",
};
import projects__upstashAuthAnalyticsMdx from "./projects__upstash-auth-analytics.mdx.json" assert {
type: "json",
};
import projects__upstashCliMdx from "./projects__upstash-cli.mdx.json" assert {
type: "json",
};
import projects__upstashCoreAnalyticsMdx from "./projects__upstash-core-analytics.mdx.json" assert {
type: "json",
};
import projects__upstashEdgeFlagsMdx from "./projects__upstash-edge-flags.mdx.json" assert {
type: "json",
};
import projects__upstashKafkaMdx from "./projects__upstash-kafka.mdx.json" assert {
type: "json",
};
import projects__upstashQstashSdkMdx from "./projects__upstash-qstash-sdk.mdx.json" assert {
type: "json",
};
import projects__upstashRatelimitMdx from "./projects__upstash-ratelimit.mdx.json" assert {
type: "json",
};
import projects__upstashReactUiMdx from "./projects__upstash-react-ui.mdx.json" assert {
type: "json",
};
import projects__upstashRedisMdx from "./projects__upstash-redis.mdx.json" assert {
type: "json",
};
export const allProjects = [projects__accessMdx, projects__envshareMdx, projects__planetfallMdx, projects__qstashMdx, projects__redisQueryMdx, projects__terraformProviderVercelMdx, projects__upstashAuthAnalyticsMdx, projects__upstashCliMdx, projects__upstashCoreAnalyticsMdx, projects__upstashEdgeFlagsMdx, projects__upstashKafkaMdx, projects__upstashQstashSdkMdx, projects__upstashRatelimitMdx, projects__upstashReactUiMdx, projects__upstashRedisMdx]
export const allProjects = [
projects__accessMdx,
projects__envshareMdx,
projects__planetfallMdx,
projects__qstashMdx,
projects__terraformProviderVercelMdx,
projects__upstashAuthAnalyticsMdx,
projects__upstashCliMdx,
projects__upstashCoreAnalyticsMdx,
projects__upstashEdgeFlagsMdx,
projects__upstashKafkaMdx,
projects__upstashQstashSdkMdx,
projects__upstashRatelimitMdx,
projects__upstashReactUiMdx,
projects__upstashRedisMdx,
];

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,11 +1,10 @@
// NOTE This file is auto-generated by Contentlayer
import { Page, Project, DocumentTypes } from './types'
import { Page, Project, DocumentTypes } from "./types";
export * from './types'
export * from "./types";
export declare const allPages: Page[]
export declare const allProjects: Project[]
export declare const allDocuments: DocumentTypes[]
export declare const allPages: Page[];
export declare const allProjects: Project[];
export declare const allDocuments: DocumentTypes[];

View File

@ -1,12 +1,12 @@
// NOTE This file is auto-generated by Contentlayer
export { isType } from 'contentlayer/client'
export { isType } from "contentlayer/client";
// NOTE During development Contentlayer imports from `.mjs` files to improve HMR speeds.
// During (production) builds Contentlayer it imports from `.json` files to improve build performance.
import allPages from './Page/_index.json' assert { type: 'json' }
import allProjects from './Project/_index.json' assert { type: 'json' }
import allPages from "./Page/_index.json" assert { type: "json" };
import allProjects from "./Project/_index.json" assert { type: "json" };
export { allPages, allProjects }
export { allPages, allProjects };
export const allDocuments = [...allPages, ...allProjects]
export const allDocuments = [...allPages, ...allProjects];

View File

@ -1,78 +1,77 @@
// NOTE This file is auto-generated by Contentlayer
import type { Markdown, MDX, ImageFieldData, IsoDateTimeString } from 'contentlayer/core'
import * as Local from 'contentlayer/source-files'
import type {
Markdown,
MDX,
ImageFieldData,
IsoDateTimeString,
} from "contentlayer/core";
import * as Local from "contentlayer/source-files";
export { isType } from 'contentlayer/client'
export { isType } from "contentlayer/client";
export type { Markdown, MDX, ImageFieldData, IsoDateTimeString }
export type { Markdown, MDX, ImageFieldData, IsoDateTimeString };
/** Document types */
export type Page = {
/** File path relative to `contentDirPath` */
_id: string
_raw: Local.RawDocumentData
type: 'Page'
title: string
description?: string | undefined
/** MDX file body */
body: MDX
path: string
slug: string
}
/** File path relative to `contentDirPath` */
_id: string;
_raw: Local.RawDocumentData;
type: "Page";
title: string;
description?: string | undefined;
/** MDX file body */
body: MDX;
path: string;
slug: string;
};
export type Project = {
/** File path relative to `contentDirPath` */
_id: string
_raw: Local.RawDocumentData
type: 'Project'
title: string
description: string
date?: IsoDateTimeString | undefined
url?: string | undefined
repository?: string | undefined
/** MDX file body */
body: MDX
path: string
slug: string
}
/** File path relative to `contentDirPath` */
_id: string;
_raw: Local.RawDocumentData;
type: "Project";
title: string;
description: string;
date?: IsoDateTimeString | undefined;
url?: string | undefined;
repository?: string | undefined;
/** MDX file body */
body: MDX;
path: string;
slug: string;
};
/** Nested types */
/** Helper types */
export type AllTypes = DocumentTypes | NestedTypes
export type AllTypeNames = DocumentTypeNames | NestedTypeNames
export type AllTypes = DocumentTypes | NestedTypes;
export type AllTypeNames = DocumentTypeNames | NestedTypeNames;
export type DocumentTypes = Page | Project
export type DocumentTypeNames = 'Page' | 'Project'
export type NestedTypes = never
export type NestedTypeNames = never
export type DocumentTypes = Page | Project;
export type DocumentTypeNames = "Page" | "Project";
export type NestedTypes = never;
export type NestedTypeNames = never;
export interface ContentlayerGenTypes {
documentTypes: DocumentTypes
documentTypeMap: DocumentTypeMap
documentTypeNames: DocumentTypeNames
nestedTypes: NestedTypes
nestedTypeMap: NestedTypeMap
nestedTypeNames: NestedTypeNames
allTypeNames: AllTypeNames
documentTypes: DocumentTypes;
documentTypeMap: DocumentTypeMap;
documentTypeNames: DocumentTypeNames;
nestedTypes: NestedTypes;
nestedTypeMap: NestedTypeMap;
nestedTypeNames: NestedTypeNames;
allTypeNames: AllTypeNames;
}
declare global {
interface ContentlayerGen extends ContentlayerGenTypes {}
interface ContentlayerGen extends ContentlayerGenTypes {}
}
export type DocumentTypeMap = {
Page: Page
Project: Project
}
Page: Page;
Project: Project;
};
export type NestedTypeMap = {
}
export type NestedTypeMap = {};

View File

@ -1,3 +0,0 @@
export async function GET(request: Request) {
return new Response("Hello, Next.js!");
}

View File

@ -77,9 +77,6 @@ export const Navigation: React.FC<Props> = ({ project }) => {
<h1 className="text-4xl font-bold uppercase text-zinc-100 sm:text-center sm:text-6xl font-display">
{project.title}
</h1>
<p className="mt-6 text-lg leading-8 text-zinc-400 sm:text-center">
{project.description}{" "}
</p>
</div>
</div>
</div>

View File

@ -30,15 +30,13 @@ export const Navigation: React.FC = () => {
<div className="flex justify-between gap-8">
<Link
href="/projects"
className="duration-200 text-zinc-300 hover:text-zinc-100"
className="duration-200 text-zinc-400 hover:text-zinc-100"
>
<span className="duration-200 text-zinc-300 hover:text-zinc-100">
Projects
</span>
Projects
</Link>
<Link
href="/contact"
className="duration-200 text-zinc-300 hover:text-zinc-100"
className="duration-200 text-zinc-400 hover:text-zinc-100"
>
Contact
</Link>

View File

@ -47,6 +47,7 @@ const inter = Inter({
const grotesk = Hanken_Grotesk({
subsets: ["latin"],
variable: "--font-grotesk",
fallback: ["sans-serif"],
});
export default function RootLayout({

View File

@ -32,7 +32,7 @@ export default async function PostPage({ params }: PostPageProps) {
<Navigation project={project} />
<main className=" bg-zinc-50">
<article className="px-4 py-12 mx-auto prose text-zinc-600 ">
<article className="px-4 py-12 mx-auto prose sm:prose-sm md:prose-md lg:prose-lg text-zinc-600 ">
<Mdx code={project.body.code} />
</article>
</main>

74
app/projects/card.tsx Normal file
View File

@ -0,0 +1,74 @@
"use client";
import {
motion,
MotionValue,
useMotionTemplate,
useMotionValue,
} from "framer-motion";
import type { Project } from "contentlayer/generated";
import Link from "next/link";
const Flashlight: React.FC<{
x: MotionValue<number>;
y: MotionValue<number>;
}> = ({ x, y }) => {
let maskImage = useMotionTemplate`radial-gradient(320px at ${x}px ${y}px, white, transparent)`;
let style = { maskImage, WebkitMaskImage: maskImage };
return (
<div className="pointer-events-none">
<div className="absolute inset-0 z-0 transition duration-300 [mask-image:linear-gradient(black,transparent)] group-hover:opacity-50" />
<motion.div
className="absolute inset-0 z-10 bg-gradient-to-br opacity-100 via-zinc-100/10 transition duration-1000 group-hover:opacity-50 "
style={style}
/>
<motion.div
className="absolute inset-0 z-10 opacity-0 mix-blend-overlay transition duration-1000 group-hover:opacity-100"
style={style}
/>
</div>
);
};
export const Card: React.FC<{ project: Project }> = ({ project }) => {
const mouseX = useMotionValue(0); //randomBetween(rect?.left, rect?.right));
const mouseY = useMotionValue(0); //randomBetween(rect?.top, rect?.bottom));
function onMouseMove({ currentTarget, clientX, clientY }: any) {
const { left, top } = currentTarget.getBoundingClientRect();
mouseX.set(clientX - left);
mouseY.set(clientY - top);
}
return (
<Link
key={project._id}
onMouseMove={onMouseMove}
href={`/projects/${project.slug}`}
// className="group relative flex rounded-2xl bg-zinc-50 transition-shadow hover:shadow-md hover:shadow-zinc-900/5 dark:bg-white/2.5 dark:hover:shadow-black/5"
className="overflow-hidden relative p-4 duration-700 border rounded-xl hover:bg-zinc-800/30 group md:gap-8 hover:border-zinc-600 border-zinc-600 md:p-8"
>
<Flashlight x={mouseX} y={mouseY} />
<span className="text-xs duration-1000 text-zinc-200 group-hover:text-white group-hover:border-zinc-200 drop-shadow-orange">
{project.date ? (
<time dateTime={new Date(project.date).toISOString()}>
{Intl.DateTimeFormat(undefined, { dateStyle: "medium" }).format(
new Date(project.date),
)}
</time>
) : (
<span>SOON</span>
)}
</span>
<h2 className="z-20 text-xl font-medium duration-1000 lg:text-3xl text-zinc-200 group-hover:text-white font-display">
{project.title}
</h2>
<p className="z-20 mt-4 text-sm duration-1000 text-zinc-400 group-hover:text-zinc-200">
{project.description}
</p>
</Link>
);
};

View File

@ -1,7 +1,8 @@
import Link from "next/link";
import React from "react";
import { allProjects, Project } from "contentlayer/generated";
import { allProjects } from "contentlayer/generated";
import { Navigation } from "../components/nav";
import { Card } from "./card";
export default function ProjectsPage() {
const featured = allProjects.find(
@ -41,7 +42,9 @@ export default function ProjectsPage() {
<div className="text-xs text-zinc-100">
{featured.date ? (
<time dateTime={new Date(featured.date).toISOString()}>
{new Date(featured.date).toDateString()}
{Intl.DateTimeFormat(undefined, {
dateStyle: "medium",
}).format(new Date(featured.date))}
</time>
) : (
<span>SOON</span>
@ -74,46 +77,29 @@ export default function ProjectsPage() {
<div className="hidden w-full h-px md:block bg-zinc-800" />
<div className="grid max-w-2xl grid-cols-1 gap-4 mx-auto lg:mx-0 lg:max-w-none md:grid-cols-2 lg:grid-cols-3">
{sorted.map((project) => (
<Card key={project.slug} project={project} />
))}
<div className="grid grid-cols-1 gap-4">
{sorted
.filter((_, i) => i % 3 === 0)
.map((project) => (
<Card key={project.slug} project={project} />
))}
</div>
<div className="grid grid-cols-1 gap-4">
{sorted
.filter((_, i) => i % 3 === 1)
.map((project) => (
<Card key={project.slug} project={project} />
))}
</div>
<div className="grid grid-cols-1 gap-4">
{sorted
.filter((_, i) => i % 3 === 2)
.map((project) => (
<Card key={project.slug} project={project} />
))}
</div>
</div>
</div>
</div>
);
}
const Card: React.FC<{ project: Project; border?: boolean }> = ({
project,
border,
}) => {
return (
<Link
href={`/projects/${project.slug}`}
className={`flex max-w-xl flex-col items-start group duration-200 transition-all py-4 lg:p-4 ${
border
? "hover:bg-zinc-900 hover:border-zinc-700 border border-zinc-800 rounded"
: ""
} `}
>
<div className="text-xs text-zinc-100">
{project.date ? (
<time dateTime={new Date(project.date).toISOString()}>
{new Date(project.date).toDateString()}
</time>
) : (
<span>SOON</span>
)}
</div>
<div className="relative duration-150 ">
<h3 className="mt-3 text-lg font-semibold leading-6 text-zinc-100 group-hover:text-white font-display ">
<span className="absolute inset-0" />
{project.title}
</h3>
<p className="mt-5 text-sm leading-6 duration-150 text-zinc-400 line-clamp-3 group-hover:text-zinc-300">
{project.description}
</p>
</div>
</Link>
);
};

View File

@ -5,5 +5,71 @@ repository: chronark/access
date: "2022-11-13"
---
A minimal library for access control. It is designed to be used together with opaque access tokens by providing a simple interface to define roles with different access permissions and verifying requests to resources.
TODO:
- Fully typed
- Zero dependencies
- Serializable to store in a database
## Install
```sh-session
npm i @chronark/access
```
## Usage
```ts
import { AccessControl, Role } from "@chronark/access";
/**
* Define all your resources and their access patterns
*
* key => resource
* value => array of access types
*/
type Statements = {
user: ["read", "write", "dance"];
team: ["read", "write"];
};
/**
* Create an access control instance and pass the Statements type to enjoy full
* type safety
*/
const ac = new AccessControl<Statements>();
/**
* Now you can define one or more roles by specifying the access permissions
*
* This is already fully typed and typescript will let you know if you try to
* use anything, that is not defined in the Statements type.
*/
const role = ac.newRole({
user: ["read", "write"],
team: ["read"],
});
/**
* Simulate storing and retrieving the role in a database
*
* The idea here is, that you can store permissions alongside an API token.
* Now, when you verify the token, you can also verify the access permissions.
*/
const serialized = role.toString();
/**
* Note how you can pass in the Statements type again, to get full type safety
*/
const recovered = Role.fromString<Statements>(serialized);
/**
* Validate the role by specifying the resource and the required access
*
* everything is fully typed
*/
const res = recovered.authorize({"team", ["read"]});
// res.success => boolean
// res.error => string | undefined provides a reason for failure
```

View File

@ -1,8 +1,10 @@
---
title: Planetfall
title: planetfall.io
description: I'm building a SAAS, that provides global latency monitoring for your APIs and websites from edge locations around the world. Have you ever wondered how fast your API is in any part of the world? Planetfall allows you to find out and monitor it continuously.
date: "2023-04-01"
url: https://planetfall.io
---
TODO:
I'm building a SAAS, that provides global latency monitoring for your APIs and websites from edge locations around the world. Have you ever wondered how fast your API is in any part of the world? Planetfall allows you to find out and monitor it continuously.

View File

@ -6,4 +6,30 @@ url: https://upstash.com/qstash
---
TODO:
QStash is an HTTP based messaging and scheduling solution for the serverless and edge runtimes.
- 100% serverless, no stateful connections required. Messages are pushed to your API.
- At-least-once delivery guaranteed to any public API
- Pubsub via topics
- Delay message delivery
- Message deduplication
- Scheduling via CRON
Formally, QStash is a message queue and task scheduler designed for serverless runtimes. Informally, QStash is a glue for your serverless functions.
There was a perception serverless was only good for simple tasks. Not anymore. People build powerful systems with serverless stack. Powerful systems are composed of multiple components. Communication among those components is a big engineering problem. There are already great solutions for this problem. But we think existing solutions do not fit in serverless space. Either they are too complex or not designed to work with stateless runtimes. So we want a solution which (is):
- Works anywhere including serverless and edge.
- Messaging as a service with no backend for users to run.
- Lightweight, easy to understand, requires nothing to learn.
- Price scales to zero.
Let's talk about a real world example. We have an e-commerce app and we want to send an informational email after each purchase. We have a service (an API route) for new purchases (newPurchase) and a second service for sending emails and notifications (sendEmail). We can call the sendEmail service from the newPurchase service. But what if the call fails? Should we wait for the response and retry? What if too many calls congest the sendEmail service and the service does not respond on time? You need to handle all these cases in your newPurchase service. Moreover, when you change the contract of sendEmail service; you have to update your newPurchase service too.
If you use QStash in the above example, you simply send a request to QStash from the newPurchase service. QStash will queue the request and call the sendEmail service. If the service does not respond, QStash will retry with a backoff strategy. The latency of sendEmail service will not affect the newPurchase service, because it will not wait for a response from the sendEmail service. QStash decouples the newPurchase and sendEmail services. You can update both services independently as long as you keep the message format compatible.
With QStash, you can add delays to the requests. Send an email 3 days after the shipment to remind the customer to add a review. You can also schedule tasks. You can send the requests with a CRON expression, so it will be run repetitively.
To learn more about QStash, visit [upstash.com/qstash](upstash.com/qstash).

View File

@ -1,8 +0,0 @@
---
title: Redis Query
description: Client side secondary indexing for Redis. It allows you to query your Redis data efficiently. Inspired by FaunaDB indices.
repository: chronark/redis-query
---
TODO:

View File

@ -3,5 +3,43 @@ title: Vercel Terraform Provider
description: A Terraform provider for Vercel. It has been deprecated it when Vercel rolled out their official provider.
date: "2021-03-16"
repository: chronark/terraform-provider-vercel
url: https://registry.terraform.io/providers/chronark/vercel/latest
---
TODO:
Back in the day when Vercel didn't have an official Terraform provider, I wrote one.
I needed to manage my Vercel projects and especially sync environment variables from different cloud providers.
Terraform was great to provision some postgres databases on digital ocean, but there was no way to sync the credentials with Vercel.
```hcl
terraform {
required_providers {
vercel = {
source = "registry.terraform.io/chronark/vercel"
version = ">=0.10.3"
}
}
}
provider "vercel" {
token = "<YOUR_TOKEN>"
}
resource "vercel_project" "my_project" {
name = "project-via-terraform"
git_repository {
type = "github"
repo = "chronark/terraform-provider-vercel"
}
}
```
It was a fun project and I learned a lot about Terraform and Vercel's API.
It gave me the opportunity to contribute to the Terraform ecosystem and my appreciation for the work that the Terraform team does is immense.
There have been quite a few individuals and teams that have used this provider and I am happy that it has been useful to you.
Now that Vercel have stepped in, I have decided to [deprecate](https://twitter.com/chronark_/status/1517759708983177218) this one on April 23rd 2022.
Please use the [official provider](https://registry.terraform.io/providers/vercel/vercel/latest) instead.

View File

@ -7,4 +7,171 @@ repository: upstash/upstash-kafka
---
TODO:
An HTTP/REST based Kafka client built on top of
[Upstash REST API](https://docs.upstash.com/kafka/rest).
It is the only connectionless (HTTP based) Kafka client and designed for:
- Serverless functions (AWS Lambda ...)
- Cloudflare Workers (see the example)
- Fastly Compute@Edge
- Next.js Edge, Remix ...
- Client side web/mobile applications
- WebAssembly and other environments where HTTP is preferred over TCP
connections.
# Installation
```bash
npm install @upstash/kafka
```
# Quickstart
## Auth
1. Go to [upstash](https://console.upstash.com/kafka) and select your database.
2. Copy the `REST API` secrets at the bottom of the page
```typescript
import { Kafka } from "@upstash/kafka"
const kafka = new Kafka({
url: "<UPSTASH_KAFKA_REST_URL>",
username: "<UPSTASH_KAFKA_REST_USERNAME>",
password: "<UPSTASH_KAFKA_REST_PASSWORD>",
})
```
## Produce a single message
```typescript
const p = kafka.producer()
const message = { hello: "world" } // Objects will get serialized using `JSON.stringify`
const res = await p.produce("<my.topic>", message)
const res = await p.produce("<my.topic>", message, {
partition: 1,
timestamp: 12345,
key: "<custom key>",
headers: [{ key: "traceId", value: "85a9f12" }],
})
```
## Produce multiple messages.
The same options from the example above can be set for every message.
```typescript
const p = kafka.producer()
const res = await p.produceMany([
{
topic: "my.topic",
value: { hello: "world" },
// ...options
},
{
topic: "another.topic",
value: "another message",
// ...options
},
])
```
## Consume
The first time a consumer is created, it needs to figure out the group
coordinator by asking the Kafka brokers and joins the consumer group. This
process takes some time to complete. That's why when a consumer instance is
created first time, it may return empty messages until consumer group
coordination is completed.
```typescript
const c = kafka.consumer()
const messages = await c.consume({
consumerGroupId: "group_1",
instanceId: "instance_1",
topics: ["test.topic"],
autoOffsetReset: "earliest",
})
```
More examples can be found in the
[docstring](https://github.com/upstash/upstash-kafka/blob/main/pkg/consumer.ts#L265)
## Commit manually
While `consume` can handle committing automatically, you can also use
`Consumer.commit` to manually commit.
```typescript
const consumerGroupId = "mygroup"
const instanceId = "myinstance"
const topic = "my.topic"
const c = kafka.consumer()
const messages = await c.consume({
consumerGroupId,
instanceId,
topics: [topic],
autoCommit: false,
})
for (const message of messages) {
// message handling logic
await c.commit({
consumerGroupId,
instanceId,
offset: {
topic: message.topic,
partition: message.partition,
offset: message.offset,
},
})
}
```
## Fetch
You can also manage offsets manually by using `Consumer.fetch`
```typescript
const c = kafka.consumer()
const messages = await c.fetch({
topic: "greeting",
partition: 3,
offset: 42,
timeout: 1000,
})
```
## Examples
See [/examples](https://github.com/upstash/upstash-kafka/tree/main/examples) as
well as various examples in the docstrings of each method.
# Contributing
## Requirements
- [nodejs](https://nodejs.org) v14.x or higher
- [pnpm](https://pnpm.io/installation)
## Setup
0. Install dependencies using `pnpm install`
1. Create a kafka instance on upstash.
[docs](https://docs.upstash.com/kafka#create-a-kafka-cluster)
2. Create the following topics: `blue`, `red`, `green`.
[docs](https://docs.upstash.com/kafka#create-a-topic)
The partitions or retention settings don't matter at this time.
3. Create `.env` file with your kafka secrets `cp .env.example .env`
## Running tests
```bash
pnpm test
```

View File

@ -7,4 +7,80 @@ repository: upstash/upstash-redis
---
TODO:
`@upstash/redis` is an HTTP/REST based Redis client for typescript, built on top
of [Upstash REST API](https://docs.upstash.com/features/restapi).
It is the only connectionless (HTTP based) Redis client and designed for:
- Serverless functions (AWS Lambda ...)
- Cloudflare Workers (see
[the example](https://github.com/upstash/upstash-redis/tree/main/examples/cloudflare-workers))
- Fastly Compute@Edge (see
[the example](https://github.com/upstash/upstash-redis/tree/main/examples/fastly))
- Next.js, Jamstack ...
- Client side web/mobile applications
- WebAssembly
- and other environments where HTTP is preferred over TCP.
See
[the list of APIs](https://docs.upstash.com/features/restapi#rest---redis-api-compatibility)
supported.
## Quick Start
### Install
#### Node.js
```bash
npm install @upstash/redis
```
#### Deno
```ts
import { Redis } from "https://deno.land/x/upstash_redis/mod.ts";
```
### Create database
Create a new redis database on [upstash](https://console.upstash.com/)
## Basic Usage:
```ts
import { Redis } from "@upstash/redis"
const redis = new Redis({
url: <UPSTASH_REDIS_REST_URL>,
token: <UPSTASH_REDIS_REST_TOKEN>,
})
// string
await redis.set('key', 'value');
let data = await redis.get('key');
console.log(data)
await redis.set('key2', 'value2', {ex: 1});
// sorted set
await redis.zadd('scores', { score: 1, member: 'team1' })
data = await redis.zrange('scores', 0, 100 )
console.log(data)
// list
await redis.lpush('elements', 'magnesium')
data = await redis.lrange('elements', 0, 100 )
console.log(data)
// hash
await redis.hset('people', {name: 'joe'})
data = await redis.hget('people', 'name' )
console.log(data)
// sets
await redis.sadd('animals', 'cat')
data = await redis.spop('animals', 1)
console.log(data)
```

View File

@ -6,6 +6,7 @@ const nextConfig = {
experimental: {
appDir: true,
mdxRs: true,
runtime: "edge",
},
images: {
domains: ["pbs.twimg.com"],

5454
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -11,14 +11,15 @@
"dependencies": {
"@next/font": "^13.2.1",
"@next/mdx": "^13.2.1",
"@types/node": "18.14.1",
"@types/node": "18.15.0",
"@types/react": "18.0.28",
"@types/react-dom": "18.0.11",
"@vercel/analytics": "^0.1.10",
"contentlayer": "^0.3.0",
"lucide-react": "^0.115.0",
"framer-motion": "^10.8.5",
"lucide-react": "^0.125.0",
"markdown-wasm": "^1.2.0",
"next": "13.2.1",
"next": "13.2.4",
"next-contentlayer": "^0.3.0",
"react": "18.2.0",
"react-dom": "18.2.0",
@ -29,6 +30,7 @@
"typescript": "4.9.5"
},
"devDependencies": {
"@opentelemetry/api": "^1.1.0",
"@tailwindcss/line-clamp": "^0.4.2",
"@tailwindcss/typography": "^0.5.9",
"autoprefixer": "^10.4.13",

423
pnpm-lock.yaml generated
View File

@ -3,17 +3,19 @@ lockfileVersion: 5.4
specifiers:
'@next/font': ^13.2.1
'@next/mdx': ^13.2.1
'@opentelemetry/api': ^1.1.0
'@tailwindcss/line-clamp': ^0.4.2
'@tailwindcss/typography': ^0.5.9
'@types/node': 18.14.1
'@types/node': 18.15.0
'@types/react': 18.0.28
'@types/react-dom': 18.0.11
'@vercel/analytics': ^0.1.10
autoprefixer: ^10.4.13
contentlayer: ^0.3.0
lucide-react: ^0.115.0
framer-motion: ^10.8.5
lucide-react: ^0.125.0
markdown-wasm: ^1.2.0
next: 13.2.1
next: 13.2.4
next-contentlayer: ^0.3.0
postcss: ^8.4.21
postcss-nesting: ^11.2.1
@ -29,17 +31,18 @@ specifiers:
typescript: 4.9.5
dependencies:
'@next/font': 13.2.1
'@next/mdx': 13.2.1
'@types/node': 18.14.1
'@next/font': 13.2.4
'@next/mdx': 13.2.4
'@types/node': 18.15.0
'@types/react': 18.0.28
'@types/react-dom': 18.0.11
'@vercel/analytics': 0.1.10_react@18.2.0
contentlayer: 0.3.0_ui6uvxfppeck4ve6baobv322ca
lucide-react: 0.115.0_react@18.2.0
'@vercel/analytics': 0.1.11_react@18.2.0
contentlayer: 0.3.0_lbem3ogs7du3nc6v7afeau4mee
framer-motion: 10.8.5_biqbaboplfbrettd7655fr4n2y
lucide-react: 0.125.0_react@18.2.0
markdown-wasm: 1.2.0
next: 13.2.1_rfdx5ocjtvb4b2h5j5ipjicct4
next-contentlayer: 0.3.0_scjb6dpb3mjs6ovmhgft7llkle
next: 13.2.4_iiqxgyfhgb2flqmfjn2la6rgku
next-contentlayer: 0.3.0_2txxxasfjc2y3wz4b3hzs7n7gm
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
rehype-autolink-headings: 6.1.1
@ -49,9 +52,10 @@ dependencies:
typescript: 4.9.5
devDependencies:
'@opentelemetry/api': 1.4.0
'@tailwindcss/line-clamp': 0.4.2_tailwindcss@3.2.7
'@tailwindcss/typography': 0.5.9_tailwindcss@3.2.7
autoprefixer: 10.4.13_postcss@8.4.21
autoprefixer: 10.4.14_postcss@8.4.21
postcss: 8.4.21
postcss-nesting: 11.2.1_postcss@8.4.21
rome: 11.0.0
@ -67,10 +71,10 @@ packages:
regenerator-runtime: 0.13.11
dev: false
/@contentlayer/cli/0.3.0_ui6uvxfppeck4ve6baobv322ca:
/@contentlayer/cli/0.3.0_lbem3ogs7du3nc6v7afeau4mee:
resolution: {integrity: sha512-Mqb6NlIKINt2qsPKft+o8m5tJhJXVgVSd0zP1BH+CQRmvR/zwTT3maz1bDCPHBYGKgGCQKtvgM66IjvH+dmC6Q==}
dependencies:
'@contentlayer/core': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/core': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
'@contentlayer/utils': 0.3.0
clipanion: 3.2.0_typanion@3.12.1
typanion: 3.12.1
@ -81,10 +85,10 @@ packages:
- supports-color
dev: false
/@contentlayer/client/0.3.0_ui6uvxfppeck4ve6baobv322ca:
/@contentlayer/client/0.3.0_lbem3ogs7du3nc6v7afeau4mee:
resolution: {integrity: sha512-yzDYiZtqOJwWrsykieA1LMnhKbaYcJhAy7s8Xs7zU5wFfyBTO258gvmK5dVi4LuzmOOPVMJn6FpEofT/RAKVtg==}
dependencies:
'@contentlayer/core': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/core': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
transitivePeerDependencies:
- '@effect-ts/otel-node'
- esbuild
@ -92,7 +96,7 @@ packages:
- supports-color
dev: false
/@contentlayer/core/0.3.0_ui6uvxfppeck4ve6baobv322ca:
/@contentlayer/core/0.3.0_lbem3ogs7du3nc6v7afeau4mee:
resolution: {integrity: sha512-5cL4W0nK9kNqxgBkIgauUko0SRAHf8oPoxRhdsSPQ7FSCgZGz2crMeSJOFmj3a3govh863/mKhXfkoUJBoDgnA==}
peerDependencies:
esbuild: 0.17.x
@ -106,10 +110,10 @@ packages:
'@contentlayer/utils': 0.3.0
camel-case: 4.1.2
comment-json: 4.2.3
esbuild: 0.17.10
esbuild: 0.17.11
gray-matter: 4.0.3
markdown-wasm: 1.2.0
mdx-bundler: 9.2.1_esbuild@0.17.10
mdx-bundler: 9.2.1_esbuild@0.17.11
rehype-stringify: 9.0.3
remark-frontmatter: 4.0.1
remark-parse: 10.0.1
@ -122,10 +126,10 @@ packages:
- supports-color
dev: false
/@contentlayer/source-files/0.3.0_ui6uvxfppeck4ve6baobv322ca:
/@contentlayer/source-files/0.3.0_lbem3ogs7du3nc6v7afeau4mee:
resolution: {integrity: sha512-6crNuRdWGYFec0Kn/DpbrzpOu8bttFmOmOpX1HIYQz4iPisg+8biybLBiNU7Y6aCUjEZLOnM7AaHpMFvhrYWsw==}
dependencies:
'@contentlayer/core': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/core': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
'@contentlayer/utils': 0.3.0
chokidar: 3.5.3
fast-glob: 3.2.12
@ -135,7 +139,7 @@ packages:
ts-pattern: 4.2.1
unified: 10.1.2
yaml: 1.10.2
zod: 3.20.6
zod: 3.21.4
transitivePeerDependencies:
- '@effect-ts/otel-node'
- esbuild
@ -143,11 +147,11 @@ packages:
- supports-color
dev: false
/@contentlayer/source-remote-files/0.3.0_ui6uvxfppeck4ve6baobv322ca:
/@contentlayer/source-remote-files/0.3.0_lbem3ogs7du3nc6v7afeau4mee:
resolution: {integrity: sha512-4PnaK5cfQiduMUEO6nzqsD4ttD5RG4ffcyeSp5MLhpU0DTEZcfGXFRO777ddEI8PZ0/NJuhfz9MGbdO90QYlsw==}
dependencies:
'@contentlayer/core': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/source-files': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/core': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
'@contentlayer/source-files': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
'@contentlayer/utils': 0.3.0
transitivePeerDependencies:
- '@effect-ts/otel-node'
@ -183,7 +187,7 @@ packages:
chokidar: 3.5.3
hash-wasm: 4.9.0
inflection: 2.0.1
oo-ascii-tree: 1.76.0
oo-ascii-tree: 1.77.0
ts-pattern: 4.2.1
type-fest: 3.6.1
dev: false
@ -257,22 +261,35 @@ packages:
resolution: {integrity: sha512-/crHGujo0xnuHIYNc1VgP0HGJGFSoSqq88JFXe6FmFyXPpWt8Xu39LyLg7rchsxfXFeEdA9CrIZvLV5eswXV5g==}
dev: false
/@esbuild-plugins/node-resolve/0.1.4_esbuild@0.17.10:
/@emotion/is-prop-valid/0.8.8:
resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==}
requiresBuild: true
dependencies:
'@emotion/memoize': 0.7.4
dev: false
optional: true
/@emotion/memoize/0.7.4:
resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==}
dev: false
optional: true
/@esbuild-plugins/node-resolve/0.1.4_esbuild@0.17.11:
resolution: {integrity: sha512-haFQ0qhxEpqtWWY0kx1Y5oE3sMyO1PcoSiWEPrAw6tm/ZOOLXjSs6Q+v1v9eyuVF0nNt50YEvrcrvENmyoMv5g==}
peerDependencies:
esbuild: '*'
dependencies:
'@types/resolve': 1.20.2
debug: 4.3.4
esbuild: 0.17.10
esbuild: 0.17.11
escape-string-regexp: 4.0.0
resolve: 1.22.1
transitivePeerDependencies:
- supports-color
dev: false
/@esbuild/android-arm/0.17.10:
resolution: {integrity: sha512-7YEBfZ5lSem9Tqpsz+tjbdsEshlO9j/REJrfv4DXgKTt1+/MHqGwbtlyxQuaSlMeUZLxUKBaX8wdzlTfHkmnLw==}
/@esbuild/android-arm/0.17.11:
resolution: {integrity: sha512-CdyX6sRVh1NzFCsf5vw3kULwlAhfy9wVt8SZlrhQ7eL2qBjGbFhRBWkkAzuZm9IIEOCKJw4DXA6R85g+qc8RDw==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
@ -280,8 +297,8 @@ packages:
dev: false
optional: true
/@esbuild/android-arm64/0.17.10:
resolution: {integrity: sha512-ht1P9CmvrPF5yKDtyC+z43RczVs4rrHpRqrmIuoSvSdn44Fs1n6DGlpZKdK6rM83pFLbVaSUwle8IN+TPmkv7g==}
/@esbuild/android-arm64/0.17.11:
resolution: {integrity: sha512-QnK4d/zhVTuV4/pRM4HUjcsbl43POALU2zvBynmrrqZt9LPcLA3x1fTZPBg2RRguBQnJcnU059yKr+bydkntjg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
@ -289,8 +306,8 @@ packages:
dev: false
optional: true
/@esbuild/android-x64/0.17.10:
resolution: {integrity: sha512-CYzrm+hTiY5QICji64aJ/xKdN70IK8XZ6iiyq0tZkd3tfnwwSWTYH1t3m6zyaaBxkuj40kxgMyj1km/NqdjQZA==}
/@esbuild/android-x64/0.17.11:
resolution: {integrity: sha512-3PL3HKtsDIXGQcSCKtWD/dy+mgc4p2Tvo2qKgKHj9Yf+eniwFnuoQ0OUhlSfAEpKAFzF9N21Nwgnap6zy3L3MQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
@ -298,8 +315,8 @@ packages:
dev: false
optional: true
/@esbuild/darwin-arm64/0.17.10:
resolution: {integrity: sha512-3HaGIowI+nMZlopqyW6+jxYr01KvNaLB5znXfbyyjuo4lE0VZfvFGcguIJapQeQMS4cX/NEispwOekJt3gr5Dg==}
/@esbuild/darwin-arm64/0.17.11:
resolution: {integrity: sha512-pJ950bNKgzhkGNO3Z9TeHzIFtEyC2GDQL3wxkMApDEghYx5Qers84UTNc1bAxWbRkuJOgmOha5V0WUeh8G+YGw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
@ -307,8 +324,8 @@ packages:
dev: false
optional: true
/@esbuild/darwin-x64/0.17.10:
resolution: {integrity: sha512-J4MJzGchuCRG5n+B4EHpAMoJmBeAE1L3wGYDIN5oWNqX0tEr7VKOzw0ymSwpoeSpdCa030lagGUfnfhS7OvzrQ==}
/@esbuild/darwin-x64/0.17.11:
resolution: {integrity: sha512-iB0dQkIHXyczK3BZtzw1tqegf0F0Ab5texX2TvMQjiJIWXAfM4FQl7D909YfXWnB92OQz4ivBYQ2RlxBJrMJOw==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
@ -316,8 +333,8 @@ packages:
dev: false
optional: true
/@esbuild/freebsd-arm64/0.17.10:
resolution: {integrity: sha512-ZkX40Z7qCbugeK4U5/gbzna/UQkM9d9LNV+Fro8r7HA7sRof5Rwxc46SsqeMvB5ZaR0b1/ITQ/8Y1NmV2F0fXQ==}
/@esbuild/freebsd-arm64/0.17.11:
resolution: {integrity: sha512-7EFzUADmI1jCHeDRGKgbnF5sDIceZsQGapoO6dmw7r/ZBEKX7CCDnIz8m9yEclzr7mFsd+DyasHzpjfJnmBB1Q==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
@ -325,8 +342,8 @@ packages:
dev: false
optional: true
/@esbuild/freebsd-x64/0.17.10:
resolution: {integrity: sha512-0m0YX1IWSLG9hWh7tZa3kdAugFbZFFx9XrvfpaCMMvrswSTvUZypp0NFKriUurHpBA3xsHVE9Qb/0u2Bbi/otg==}
/@esbuild/freebsd-x64/0.17.11:
resolution: {integrity: sha512-iPgenptC8i8pdvkHQvXJFzc1eVMR7W2lBPrTE6GbhR54sLcF42mk3zBOjKPOodezzuAz/KSu8CPyFSjcBMkE9g==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
@ -334,8 +351,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-arm/0.17.10:
resolution: {integrity: sha512-whRdrrl0X+9D6o5f0sTZtDM9s86Xt4wk1bf7ltx6iQqrIIOH+sre1yjpcCdrVXntQPCNw/G+XqsD4HuxeS+2QA==}
/@esbuild/linux-arm/0.17.11:
resolution: {integrity: sha512-M9iK/d4lgZH0U5M1R2p2gqhPV/7JPJcRz+8O8GBKVgqndTzydQ7B2XGDbxtbvFkvIs53uXTobOhv+RyaqhUiMg==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
@ -343,8 +360,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-arm64/0.17.10:
resolution: {integrity: sha512-g1EZJR1/c+MmCgVwpdZdKi4QAJ8DCLP5uTgLWSAVd9wlqk9GMscaNMEViG3aE1wS+cNMzXXgdWiW/VX4J+5nTA==}
/@esbuild/linux-arm64/0.17.11:
resolution: {integrity: sha512-Qxth3gsWWGKz2/qG2d5DsW/57SeA2AmpSMhdg9TSB5Svn2KDob3qxfQSkdnWjSd42kqoxIPy3EJFs+6w1+6Qjg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
@ -352,8 +369,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-ia32/0.17.10:
resolution: {integrity: sha512-1vKYCjfv/bEwxngHERp7huYfJ4jJzldfxyfaF7hc3216xiDA62xbXJfRlradiMhGZbdNLj2WA1YwYFzs9IWNPw==}
/@esbuild/linux-ia32/0.17.11:
resolution: {integrity: sha512-dB1nGaVWtUlb/rRDHmuDQhfqazWE0LMro/AIbT2lWM3CDMHJNpLckH+gCddQyhhcLac2OYw69ikUMO34JLt3wA==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
@ -361,8 +378,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-loong64/0.17.10:
resolution: {integrity: sha512-mvwAr75q3Fgc/qz3K6sya3gBmJIYZCgcJ0s7XshpoqIAIBszzfXsqhpRrRdVFAyV1G9VUjj7VopL2HnAS8aHFA==}
/@esbuild/linux-loong64/0.17.11:
resolution: {integrity: sha512-aCWlq70Q7Nc9WDnormntGS1ar6ZFvUpqr8gXtO+HRejRYPweAFQN615PcgaSJkZjhHp61+MNLhzyVALSF2/Q0g==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
@ -370,8 +387,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-mips64el/0.17.10:
resolution: {integrity: sha512-XilKPgM2u1zR1YuvCsFQWl9Fc35BqSqktooumOY2zj7CSn5czJn279j9TE1JEqSqz88izJo7yE4x3LSf7oxHzg==}
/@esbuild/linux-mips64el/0.17.11:
resolution: {integrity: sha512-cGeGNdQxqY8qJwlYH1BP6rjIIiEcrM05H7k3tR7WxOLmD1ZxRMd6/QIOWMb8mD2s2YJFNRuNQ+wjMhgEL2oCEw==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
@ -379,8 +396,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-ppc64/0.17.10:
resolution: {integrity: sha512-kM4Rmh9l670SwjlGkIe7pYWezk8uxKHX4Lnn5jBZYBNlWpKMBCVfpAgAJqp5doLobhzF3l64VZVrmGeZ8+uKmQ==}
/@esbuild/linux-ppc64/0.17.11:
resolution: {integrity: sha512-BdlziJQPW/bNe0E8eYsHB40mYOluS+jULPCjlWiHzDgr+ZBRXPtgMV1nkLEGdpjrwgmtkZHEGEPaKdS/8faLDA==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
@ -388,8 +405,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-riscv64/0.17.10:
resolution: {integrity: sha512-r1m9ZMNJBtOvYYGQVXKy+WvWd0BPvSxMsVq8Hp4GzdMBQvfZRvRr5TtX/1RdN6Va8JMVQGpxqde3O+e8+khNJQ==}
/@esbuild/linux-riscv64/0.17.11:
resolution: {integrity: sha512-MDLwQbtF+83oJCI1Cixn68Et/ME6gelmhssPebC40RdJaect+IM+l7o/CuG0ZlDs6tZTEIoxUe53H3GmMn8oMA==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
@ -397,8 +414,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-s390x/0.17.10:
resolution: {integrity: sha512-LsY7QvOLPw9WRJ+fU5pNB3qrSfA00u32ND5JVDrn/xG5hIQo3kvTxSlWFRP0NJ0+n6HmhPGG0Q4jtQsb6PFoyg==}
/@esbuild/linux-s390x/0.17.11:
resolution: {integrity: sha512-4N5EMESvws0Ozr2J94VoUD8HIRi7X0uvUv4c0wpTHZyZY9qpaaN7THjosdiW56irQ4qnJ6Lsc+i+5zGWnyqWqQ==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
@ -406,8 +423,8 @@ packages:
dev: false
optional: true
/@esbuild/linux-x64/0.17.10:
resolution: {integrity: sha512-zJUfJLebCYzBdIz/Z9vqwFjIA7iSlLCFvVi7glMgnu2MK7XYigwsonXshy9wP9S7szF+nmwrelNaP3WGanstEg==}
/@esbuild/linux-x64/0.17.11:
resolution: {integrity: sha512-rM/v8UlluxpytFSmVdbCe1yyKQd/e+FmIJE2oPJvbBo+D0XVWi1y/NQ4iTNx+436WmDHQBjVLrbnAQLQ6U7wlw==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
@ -415,8 +432,8 @@ packages:
dev: false
optional: true
/@esbuild/netbsd-x64/0.17.10:
resolution: {integrity: sha512-lOMkailn4Ok9Vbp/q7uJfgicpDTbZFlXlnKT2DqC8uBijmm5oGtXAJy2ZZVo5hX7IOVXikV9LpCMj2U8cTguWA==}
/@esbuild/netbsd-x64/0.17.11:
resolution: {integrity: sha512-4WaAhuz5f91h3/g43VBGdto1Q+X7VEZfpcWGtOFXnggEuLvjV+cP6DyLRU15IjiU9fKLLk41OoJfBFN5DhPvag==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
@ -424,8 +441,8 @@ packages:
dev: false
optional: true
/@esbuild/openbsd-x64/0.17.10:
resolution: {integrity: sha512-/VE0Kx6y7eekqZ+ZLU4AjMlB80ov9tEz4H067Y0STwnGOYL8CsNg4J+cCmBznk1tMpxMoUOf0AbWlb1d2Pkbig==}
/@esbuild/openbsd-x64/0.17.11:
resolution: {integrity: sha512-UBj135Nx4FpnvtE+C8TWGp98oUgBcmNmdYgl5ToKc0mBHxVVqVE7FUS5/ELMImOp205qDAittL6Ezhasc2Ev/w==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
@ -433,8 +450,8 @@ packages:
dev: false
optional: true
/@esbuild/sunos-x64/0.17.10:
resolution: {integrity: sha512-ERNO0838OUm8HfUjjsEs71cLjLMu/xt6bhOlxcJ0/1MG3hNqCmbWaS+w/8nFLa0DDjbwZQuGKVtCUJliLmbVgg==}
/@esbuild/sunos-x64/0.17.11:
resolution: {integrity: sha512-1/gxTifDC9aXbV2xOfCbOceh5AlIidUrPsMpivgzo8P8zUtczlq1ncFpeN1ZyQJ9lVs2hILy1PG5KPp+w8QPPg==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
@ -442,8 +459,8 @@ packages:
dev: false
optional: true
/@esbuild/win32-arm64/0.17.10:
resolution: {integrity: sha512-fXv+L+Bw2AeK+XJHwDAQ9m3NRlNemG6Z6ijLwJAAVdu4cyoFbBWbEtyZzDeL+rpG2lWI51cXeMt70HA8g2MqIg==}
/@esbuild/win32-arm64/0.17.11:
resolution: {integrity: sha512-vtSfyx5yRdpiOW9yp6Ax0zyNOv9HjOAw8WaZg3dF5djEHKKm3UnoohftVvIJtRh0Ec7Hso0RIdTqZvPXJ7FdvQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
@ -451,8 +468,8 @@ packages:
dev: false
optional: true
/@esbuild/win32-ia32/0.17.10:
resolution: {integrity: sha512-3s+HADrOdCdGOi5lnh5DMQEzgbsFsd4w57L/eLKKjMnN0CN4AIEP0DCP3F3N14xnxh3ruNc32A0Na9zYe1Z/AQ==}
/@esbuild/win32-ia32/0.17.11:
resolution: {integrity: sha512-GFPSLEGQr4wHFTiIUJQrnJKZhZjjq4Sphf+mM76nQR6WkQn73vm7IsacmBRPkALfpOCHsopSvLgqdd4iUW2mYw==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
@ -460,8 +477,8 @@ packages:
dev: false
optional: true
/@esbuild/win32-x64/0.17.10:
resolution: {integrity: sha512-oP+zFUjYNaMNmjTwlFtWep85hvwUu19cZklB3QsBOcZSs6y7hmH4LNCJ7075bsqzYaNvZFXJlAVaQ2ApITDXtw==}
/@esbuild/win32-x64/0.17.11:
resolution: {integrity: sha512-N9vXqLP3eRL8BqSy8yn4Y98cZI2pZ8fyuHx6lKjiG2WABpT2l01TXdzq5Ma2ZUBzfB7tx5dXVhge8X9u0S70ZQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
@ -473,12 +490,12 @@ packages:
resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==}
dev: false
/@grpc/grpc-js/1.8.11:
resolution: {integrity: sha512-f/xC+6Z2QKsRJ+VSSFlt4hA5KSRm+PKvMWV8kMPkMgGlFidR6PeIkXrOasIY2roe+WROM6GFQLlgDKfeEZo2YQ==}
/@grpc/grpc-js/1.8.12:
resolution: {integrity: sha512-MbUMvpVvakeKhdYux6gbSIPJaFMLNSY8jw4PqLI+FFztGrQRrYYAnHlR94+ncBQQewkpXQaW449m3tpH/B/ZnQ==}
engines: {node: ^8.13.0 || >=10.10.0}
dependencies:
'@grpc/proto-loader': 0.7.5
'@types/node': 18.14.1
'@types/node': 18.15.0
dev: false
/@grpc/proto-loader/0.6.13:
@ -513,13 +530,13 @@ packages:
tslib: 2.5.0
dev: false
/@mdx-js/esbuild/2.3.0_esbuild@0.17.10:
/@mdx-js/esbuild/2.3.0_esbuild@0.17.11:
resolution: {integrity: sha512-r/vsqsM0E+U4Wr0DK+0EfmABE/eg+8ITW4DjvYdh3ve/tK2safaqHArNnaqbOk1DjYGrhxtoXoGaM3BY8fGBTA==}
peerDependencies:
esbuild: '>=0.11.0'
dependencies:
'@mdx-js/mdx': 2.3.0
esbuild: 0.17.10
esbuild: 0.17.11
node-fetch: 3.3.0
vfile: 5.3.7
transitivePeerDependencies:
@ -550,16 +567,16 @@ packages:
- supports-color
dev: false
/@next/env/13.2.1:
resolution: {integrity: sha512-Hq+6QZ6kgmloCg8Kgrix+4F0HtvLqVK3FZAnlAoS0eonaDemHe1Km4kwjSWRE3JNpJNcKxFHF+jsZrYo0SxWoQ==}
/@next/env/13.2.4:
resolution: {integrity: sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==}
dev: false
/@next/font/13.2.1:
resolution: {integrity: sha512-4sergLt7xp9+mZuKME/xM4tLlHGTcmL7naCq0qCTcAlof6NnttshYgiLOdhSiy0NcI+/yM3BjvdEk++O96UzTg==}
/@next/font/13.2.4:
resolution: {integrity: sha512-lMAnuOYjv5g22WhD00u0DQ9u2rTMJH0S64PKE4Sy8Y2q+FJTYs6ZHT2z3VRoI8+AOWSLK4FirpnygcjOienQ9A==}
dev: false
/@next/mdx/13.2.1:
resolution: {integrity: sha512-kWriuAxU3euPUugwoOI7WEo596QeHsxrbneKvItwrfu4YYZZLKNPHSnkLHvF7tlO9TjiPbFqYlK2xHK02Lp2SA==}
/@next/mdx/13.2.4:
resolution: {integrity: sha512-inl7u+OEa4Ok3uL052oa8EDw1bUkMGLVKzFfVBIgG19s29gxQvcWYzxa5t438J31ljApjh6Y5k4AD6yLaCAlQw==}
peerDependencies:
'@mdx-js/loader': '>=0.15.0'
'@mdx-js/react': '>=0.15.0'
@ -572,8 +589,8 @@ packages:
source-map: 0.7.4
dev: false
/@next/swc-android-arm-eabi/13.2.1:
resolution: {integrity: sha512-Yua7mUpEd1wzIT6Jjl3dpRizIfGp9NR4F2xeRuQv+ae+SDI1Em2WyM9m46UL+oeW5GpMiEHoaBagr47RScZFmQ==}
/@next/swc-android-arm-eabi/13.2.4:
resolution: {integrity: sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==}
engines: {node: '>= 10'}
cpu: [arm]
os: [android]
@ -581,8 +598,8 @@ packages:
dev: false
optional: true
/@next/swc-android-arm64/13.2.1:
resolution: {integrity: sha512-Bifcr2f6VwInOdq1uH/9lp8fH7Nf7XGkIx4XceVd32LPJqG2c6FZU8ZRBvTdhxzXVpt5TPtuXhOP4Ij9UPqsVw==}
/@next/swc-android-arm64/13.2.4:
resolution: {integrity: sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
@ -590,8 +607,8 @@ packages:
dev: false
optional: true
/@next/swc-darwin-arm64/13.2.1:
resolution: {integrity: sha512-gvqm+fGMYxAkwBapH0Vvng5yrb6HTkIvZfY4oEdwwYrwuLdkjqnJygCMgpNqIFmAHSXgtlWxfYv1VC8sjN81Kw==}
/@next/swc-darwin-arm64/13.2.4:
resolution: {integrity: sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
@ -599,8 +616,8 @@ packages:
dev: false
optional: true
/@next/swc-darwin-x64/13.2.1:
resolution: {integrity: sha512-HGqVqmaZWj6zomqOZUVbO5NhlABL0iIaxTmd0O5B0MoMa5zpDGoaHSG+fxgcWMXcGcxmUNchv1NfNOYiTKoHOg==}
/@next/swc-darwin-x64/13.2.4:
resolution: {integrity: sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
@ -608,8 +625,8 @@ packages:
dev: false
optional: true
/@next/swc-freebsd-x64/13.2.1:
resolution: {integrity: sha512-N/a4JarAq+E+g+9K2ywJUmDIgU2xs2nA+BBldH0oq4zYJMRiUhL0iaN9G4e72VmGOJ61L/3W6VN8RIUOwTLoqQ==}
/@next/swc-freebsd-x64/13.2.4:
resolution: {integrity: sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
@ -617,8 +634,8 @@ packages:
dev: false
optional: true
/@next/swc-linux-arm-gnueabihf/13.2.1:
resolution: {integrity: sha512-WaFoerF/eRbhbE57TaIGJXbQAERADZ/RZ45u6qox9beb5xnWsyYgzX+WuN7Tkhyvga0/aMuVYFzS9CEay7D+bw==}
/@next/swc-linux-arm-gnueabihf/13.2.4:
resolution: {integrity: sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
@ -626,8 +643,8 @@ packages:
dev: false
optional: true
/@next/swc-linux-arm64-gnu/13.2.1:
resolution: {integrity: sha512-R+Jhc1/RJTnncE9fkePboHDNOCm1WJ8daanWbjKhfPySMyeniKYRwGn5SLYW3S8YlRS0QVdZaaszDSZWgUcsmA==}
/@next/swc-linux-arm64-gnu/13.2.4:
resolution: {integrity: sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
@ -635,8 +652,8 @@ packages:
dev: false
optional: true
/@next/swc-linux-arm64-musl/13.2.1:
resolution: {integrity: sha512-oI1UfZPidGAVddlL2eOTmfsuKV9EaT1aktIzVIxIAgxzQSdwsV371gU3G55ggkurzfdlgF3GThFePDWF0d8dmw==}
/@next/swc-linux-arm64-musl/13.2.4:
resolution: {integrity: sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
@ -644,8 +661,8 @@ packages:
dev: false
optional: true
/@next/swc-linux-x64-gnu/13.2.1:
resolution: {integrity: sha512-PCygPwrQmS+7WUuAWWioWMZCzZm4PG91lfRxToLDg7yIm/3YfAw5N2EK2TaM9pzlWdvHQAqRMX/oLvv027xUiA==}
/@next/swc-linux-x64-gnu/13.2.4:
resolution: {integrity: sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
@ -653,8 +670,8 @@ packages:
dev: false
optional: true
/@next/swc-linux-x64-musl/13.2.1:
resolution: {integrity: sha512-sUAKxo7CFZYGHNxheGh9nIBElLYBM6md/liEGfOTwh/xna4/GTTcmkGWkF7PdnvaYNgcPIQgHIMYiAa6yBKAVw==}
/@next/swc-linux-x64-musl/13.2.4:
resolution: {integrity: sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
@ -662,8 +679,8 @@ packages:
dev: false
optional: true
/@next/swc-win32-arm64-msvc/13.2.1:
resolution: {integrity: sha512-qDmyEjDBpl/vBXxuOOKKWmPQOcARcZIMach1s7kjzaien0SySut/PHRlj56sosa81Wt4hTGhfhZ1R7g1n7+B8w==}
/@next/swc-win32-arm64-msvc/13.2.4:
resolution: {integrity: sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
@ -671,8 +688,8 @@ packages:
dev: false
optional: true
/@next/swc-win32-ia32-msvc/13.2.1:
resolution: {integrity: sha512-2joqFQ81ZYPg6DcikIzQn3DgjKglNhPAozx6dL5sCNkr1CPMD0YIkJgT3CnYyMHQ04Qi3Npv0XX3MD6LJO8OCA==}
/@next/swc-win32-ia32-msvc/13.2.4:
resolution: {integrity: sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
@ -680,8 +697,8 @@ packages:
dev: false
optional: true
/@next/swc-win32-x64-msvc/13.2.1:
resolution: {integrity: sha512-r3+0fSaIZT6N237iMzwUhfNwjhAFvXjqB+4iuW+wcpxW+LHm1g/IoxN8eSRcb8jPItC86JxjAxpke0QL97qd6g==}
/@next/swc-win32-x64-msvc/13.2.4:
resolution: {integrity: sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@ -712,7 +729,7 @@ packages:
engines: {node: '>=14'}
deprecated: Please use @opentelemetry/api >= 1.3.0
dependencies:
'@opentelemetry/api': 1.1.0
'@opentelemetry/api': 1.4.0
dev: false
/@opentelemetry/api/1.1.0:
@ -720,6 +737,10 @@ packages:
engines: {node: '>=8.0.0'}
dev: false
/@opentelemetry/api/1.4.0:
resolution: {integrity: sha512-IgMK9i3sFGNUqPMbjABm0G26g0QCKCUBfglhQ7rQq6WcxbKfEHRcmwsoER4hZcuYqJgkYn2OeuoJIv7Jsftp7g==}
engines: {node: '>=8.0.0'}
/@opentelemetry/context-async-hooks/1.5.0_@opentelemetry+api@1.1.0:
resolution: {integrity: sha512-mhBPP0BU0RaH2HB8U4MDd5OjWA1y7SoLOovCT0iEpJAltaq2z04uxRJVzIs91vkpNnV0utUZowQQD3KElgU+VA==}
engines: {node: '>=14'}
@ -745,7 +766,7 @@ packages:
peerDependencies:
'@opentelemetry/api': ^1.0.0
dependencies:
'@grpc/grpc-js': 1.8.11
'@grpc/grpc-js': 1.8.12
'@grpc/proto-loader': 0.6.13
'@opentelemetry/api': 1.1.0
'@opentelemetry/core': 1.5.0_@opentelemetry+api@1.1.0
@ -771,7 +792,7 @@ packages:
peerDependencies:
'@opentelemetry/api': ^1.0.0
dependencies:
'@grpc/grpc-js': 1.8.11
'@grpc/grpc-js': 1.8.12
'@grpc/proto-loader': 0.6.13
'@opentelemetry/api': 1.1.0
'@opentelemetry/core': 1.5.0_@opentelemetry+api@1.1.0
@ -1032,8 +1053,8 @@ packages:
resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
dev: false
/@types/node/18.14.1:
resolution: {integrity: sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ==}
/@types/node/18.15.0:
resolution: {integrity: sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==}
dev: false
/@types/parse5/6.0.3:
@ -1070,8 +1091,8 @@ packages:
resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
dev: false
/@vercel/analytics/0.1.10_react@18.2.0:
resolution: {integrity: sha512-jjJ8GzcPnQp0cMxpfYoUycMRBtDiaIeyVjZPiEPe99Dj1PdjMzAFYEASiV/hpNsXHkpcNYCveDFh6jnmh0YSDQ==}
/@vercel/analytics/0.1.11_react@18.2.0:
resolution: {integrity: sha512-mj5CPR02y0BRs1tN3oZcBNAX9a8NxsIUl9vElDPcqxnMfP0RbRc9fI9Ud7+QDg/1Izvt5uMumsr+6YsmVHcyuw==}
peerDependencies:
react: ^16.8||^17||^18
dependencies:
@ -1157,15 +1178,15 @@ packages:
hasBin: true
dev: false
/autoprefixer/10.4.13_postcss@8.4.21:
resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==}
/autoprefixer/10.4.14_postcss@8.4.21:
resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
engines: {node: ^10 || ^12 || >=14}
hasBin: true
peerDependencies:
postcss: ^8.1.0
dependencies:
browserslist: 4.21.5
caniuse-lite: 1.0.30001457
caniuse-lite: 1.0.30001464
fraction.js: 4.2.0
normalize-range: 0.1.2
picocolors: 1.0.0
@ -1192,8 +1213,8 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
caniuse-lite: 1.0.30001457
electron-to-chromium: 1.4.310
caniuse-lite: 1.0.30001464
electron-to-chromium: 1.4.328
node-releases: 2.0.10
update-browserslist-db: 1.0.10_browserslist@4.21.5
dev: true
@ -1214,8 +1235,8 @@ packages:
engines: {node: '>= 6'}
dev: true
/caniuse-lite/1.0.30001457:
resolution: {integrity: sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==}
/caniuse-lite/1.0.30001464:
resolution: {integrity: sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g==}
/ccount/2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@ -1296,17 +1317,17 @@ packages:
repeat-string: 1.6.1
dev: false
/contentlayer/0.3.0_ui6uvxfppeck4ve6baobv322ca:
/contentlayer/0.3.0_lbem3ogs7du3nc6v7afeau4mee:
resolution: {integrity: sha512-3LEF5HMHjSytlT8SErC3U59Pt2LP80a6Z2f/0mSIPeA4xty0LNChyHqzALySSM0osAEz32RY56Fifk5P+2dCIA==}
engines: {node: '>=14.18'}
hasBin: true
requiresBuild: true
dependencies:
'@contentlayer/cli': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/client': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/core': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/source-files': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/source-remote-files': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/cli': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
'@contentlayer/client': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
'@contentlayer/core': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
'@contentlayer/source-files': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
'@contentlayer/source-remote-files': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
'@contentlayer/utils': 0.3.0
transitivePeerDependencies:
- '@effect-ts/otel-node'
@ -1384,42 +1405,42 @@ packages:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
dev: true
/electron-to-chromium/1.4.310:
resolution: {integrity: sha512-/xlATgfwkm5uDDwLw5nt/MNEf7c1oazLURMZLy39vOioGYyYzLWIDT8fZMJak6qTiAJ7udFTy7JG7ziyjNutiA==}
/electron-to-chromium/1.4.328:
resolution: {integrity: sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==}
dev: true
/emoji-regex/8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
dev: false
/esbuild/0.17.10:
resolution: {integrity: sha512-n7V3v29IuZy5qgxx25TKJrEm0FHghAlS6QweUcyIgh/U0zYmQcvogWROitrTyZId1mHSkuhhuyEXtI9OXioq7A==}
/esbuild/0.17.11:
resolution: {integrity: sha512-pAMImyokbWDtnA/ufPxjQg0fYo2DDuzAlqwnDvbXqHLphe+m80eF++perYKVm8LeTuj2zUuFXC+xgSVxyoHUdg==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/android-arm': 0.17.10
'@esbuild/android-arm64': 0.17.10
'@esbuild/android-x64': 0.17.10
'@esbuild/darwin-arm64': 0.17.10
'@esbuild/darwin-x64': 0.17.10
'@esbuild/freebsd-arm64': 0.17.10
'@esbuild/freebsd-x64': 0.17.10
'@esbuild/linux-arm': 0.17.10
'@esbuild/linux-arm64': 0.17.10
'@esbuild/linux-ia32': 0.17.10
'@esbuild/linux-loong64': 0.17.10
'@esbuild/linux-mips64el': 0.17.10
'@esbuild/linux-ppc64': 0.17.10
'@esbuild/linux-riscv64': 0.17.10
'@esbuild/linux-s390x': 0.17.10
'@esbuild/linux-x64': 0.17.10
'@esbuild/netbsd-x64': 0.17.10
'@esbuild/openbsd-x64': 0.17.10
'@esbuild/sunos-x64': 0.17.10
'@esbuild/win32-arm64': 0.17.10
'@esbuild/win32-ia32': 0.17.10
'@esbuild/win32-x64': 0.17.10
'@esbuild/android-arm': 0.17.11
'@esbuild/android-arm64': 0.17.11
'@esbuild/android-x64': 0.17.11
'@esbuild/darwin-arm64': 0.17.11
'@esbuild/darwin-x64': 0.17.11
'@esbuild/freebsd-arm64': 0.17.11
'@esbuild/freebsd-x64': 0.17.11
'@esbuild/linux-arm': 0.17.11
'@esbuild/linux-arm64': 0.17.11
'@esbuild/linux-ia32': 0.17.11
'@esbuild/linux-loong64': 0.17.11
'@esbuild/linux-mips64el': 0.17.11
'@esbuild/linux-ppc64': 0.17.11
'@esbuild/linux-riscv64': 0.17.11
'@esbuild/linux-s390x': 0.17.11
'@esbuild/linux-x64': 0.17.11
'@esbuild/netbsd-x64': 0.17.11
'@esbuild/openbsd-x64': 0.17.11
'@esbuild/sunos-x64': 0.17.11
'@esbuild/win32-arm64': 0.17.11
'@esbuild/win32-ia32': 0.17.11
'@esbuild/win32-x64': 0.17.11
dev: false
/escalade/3.1.1:
@ -1554,6 +1575,24 @@ packages:
resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
dev: true
/framer-motion/10.8.5_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-qwvUAIwCc6fEZhg7ST+/z+f7Vt882jJvLiWZUHNdq2oZ/Y7gM6mLlpKi9xQg+pLu6DQVypikcKQ+MKnoFoXAJg==}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
peerDependenciesMeta:
react:
optional: true
react-dom:
optional: true
dependencies:
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
tslib: 2.5.0
optionalDependencies:
'@emotion/is-prop-valid': 0.8.8
dev: false
/fsevents/2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@ -1875,8 +1914,8 @@ packages:
engines: {node: '>=6'}
dev: false
/lilconfig/2.0.6:
resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==}
/lilconfig/2.1.0:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
dev: true
@ -1927,8 +1966,8 @@ packages:
yallist: 4.0.0
dev: false
/lucide-react/0.115.0_react@18.2.0:
resolution: {integrity: sha512-VGL7jBKN6pEXi6peXoyn9t9O7olvinaAonnoe+iFi/F2q7/yQzAFM5KR1OY15u9PlrB3scI9HvcTFoOrIjUaVQ==}
/lucide-react/0.125.0_react@18.2.0:
resolution: {integrity: sha512-tadphtB6TPytEitR9vX75hqu9PQT/uz5RcvXMq976nC190eukAM9+cHMgBxfvfEGDXwIhIT9aFxTUGdAjxw9uQ==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0
dependencies:
@ -2142,17 +2181,17 @@ packages:
'@types/mdast': 3.0.10
dev: false
/mdx-bundler/9.2.1_esbuild@0.17.10:
/mdx-bundler/9.2.1_esbuild@0.17.11:
resolution: {integrity: sha512-hWEEip1KU9MCNqeH2rqwzAZ1pdqPPbfkx9OTJjADqGPQz4t9BO85fhI7AP9gVYrpmfArf9/xJZUN0yBErg/G/Q==}
engines: {node: '>=14', npm: '>=6'}
peerDependencies:
esbuild: 0.*
dependencies:
'@babel/runtime': 7.21.0
'@esbuild-plugins/node-resolve': 0.1.4_esbuild@0.17.10
'@esbuild-plugins/node-resolve': 0.1.4_esbuild@0.17.11
'@fal-works/esbuild-plugin-global-externals': 2.1.2
'@mdx-js/esbuild': 2.3.0_esbuild@0.17.10
esbuild: 0.17.10
'@mdx-js/esbuild': 2.3.0_esbuild@0.17.11
esbuild: 0.17.11
gray-matter: 4.0.3
remark-frontmatter: 4.0.1
remark-mdx-frontmatter: 1.1.1
@ -2532,16 +2571,16 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
/next-contentlayer/0.3.0_scjb6dpb3mjs6ovmhgft7llkle:
/next-contentlayer/0.3.0_2txxxasfjc2y3wz4b3hzs7n7gm:
resolution: {integrity: sha512-vt+RaD3nIgZ6oXadtZH19a1mpxvGEoiifdtmXqBSz4rHMRcMA1YZCuSWyj+P9uX7MDmIL6JT6QSp+hvTBMaxiw==}
peerDependencies:
next: ^12 || ^13
react: '*'
react-dom: '*'
dependencies:
'@contentlayer/core': 0.3.0_ui6uvxfppeck4ve6baobv322ca
'@contentlayer/core': 0.3.0_lbem3ogs7du3nc6v7afeau4mee
'@contentlayer/utils': 0.3.0
next: 13.2.1_rfdx5ocjtvb4b2h5j5ipjicct4
next: 13.2.4_iiqxgyfhgb2flqmfjn2la6rgku
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
transitivePeerDependencies:
@ -2551,8 +2590,8 @@ packages:
- supports-color
dev: false
/next/13.2.1_rfdx5ocjtvb4b2h5j5ipjicct4:
resolution: {integrity: sha512-qhgJlDtG0xidNViJUPeQHLGJJoT4zDj/El7fP3D3OzpxJDUfxsm16cK4WTMyvSX1ciIfAq05u+0HqFAa+VJ+Hg==}
/next/13.2.4_iiqxgyfhgb2flqmfjn2la6rgku:
resolution: {integrity: sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==}
engines: {node: '>=14.6.0'}
hasBin: true
peerDependencies:
@ -2572,28 +2611,28 @@ packages:
sass:
optional: true
dependencies:
'@next/env': 13.2.1
'@opentelemetry/api': 1.1.0
'@next/env': 13.2.4
'@opentelemetry/api': 1.4.0
'@swc/helpers': 0.4.14
caniuse-lite: 1.0.30001457
caniuse-lite: 1.0.30001464
postcss: 8.4.14
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
styled-jsx: 5.1.1_react@18.2.0
optionalDependencies:
'@next/swc-android-arm-eabi': 13.2.1
'@next/swc-android-arm64': 13.2.1
'@next/swc-darwin-arm64': 13.2.1
'@next/swc-darwin-x64': 13.2.1
'@next/swc-freebsd-x64': 13.2.1
'@next/swc-linux-arm-gnueabihf': 13.2.1
'@next/swc-linux-arm64-gnu': 13.2.1
'@next/swc-linux-arm64-musl': 13.2.1
'@next/swc-linux-x64-gnu': 13.2.1
'@next/swc-linux-x64-musl': 13.2.1
'@next/swc-win32-arm64-msvc': 13.2.1
'@next/swc-win32-ia32-msvc': 13.2.1
'@next/swc-win32-x64-msvc': 13.2.1
'@next/swc-android-arm-eabi': 13.2.4
'@next/swc-android-arm64': 13.2.4
'@next/swc-darwin-arm64': 13.2.4
'@next/swc-darwin-x64': 13.2.4
'@next/swc-freebsd-x64': 13.2.4
'@next/swc-linux-arm-gnueabihf': 13.2.4
'@next/swc-linux-arm64-gnu': 13.2.4
'@next/swc-linux-arm64-musl': 13.2.4
'@next/swc-linux-x64-gnu': 13.2.4
'@next/swc-linux-x64-musl': 13.2.4
'@next/swc-win32-arm64-msvc': 13.2.4
'@next/swc-win32-ia32-msvc': 13.2.4
'@next/swc-win32-x64-msvc': 13.2.4
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
@ -2638,8 +2677,8 @@ packages:
engines: {node: '>= 6'}
dev: true
/oo-ascii-tree/1.76.0:
resolution: {integrity: sha512-I/me4GK6Dybc9lsPYZJdnd1OOFbbnZtfEIIizrbTuFx/v1if375Y59w9ol/TJ75MlSAKs4aHj7Xm+A4E0JitSw==}
/oo-ascii-tree/1.77.0:
resolution: {integrity: sha512-UQXPEVtecK9FDQxlp5WQ9nVBgS0sq96R9LWE1HBmlS3ZLJRqXh3+kdU7Bxs+qqF+cdWmE9uOggwihBffTpqLrA==}
engines: {node: '>= 14.6.0'}
dev: false
@ -2728,7 +2767,7 @@ packages:
ts-node:
optional: true
dependencies:
lilconfig: 2.0.6
lilconfig: 2.1.0
postcss: 8.4.21
yaml: 1.10.2
dev: true
@ -2812,7 +2851,7 @@ packages:
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/long': 4.0.2
'@types/node': 18.14.1
'@types/node': 18.15.0
long: 4.0.0
dev: false
@ -2831,7 +2870,7 @@ packages:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/node': 18.14.1
'@types/node': 18.15.0
long: 5.2.1
dev: false
@ -3171,7 +3210,7 @@ packages:
fast-glob: 3.2.12
glob-parent: 6.0.2
is-glob: 4.0.3
lilconfig: 2.0.6
lilconfig: 2.1.0
micromatch: 4.0.5
normalize-path: 3.0.0
object-hash: 3.0.0
@ -3413,8 +3452,8 @@ packages:
yargs-parser: 20.2.9
dev: false
/zod/3.20.6:
resolution: {integrity: sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==}
/zod/3.21.4:
resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==}
dev: false
/zwitch/2.0.4:

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -10,7 +10,10 @@ module.exports = {
sans: ["var(--font-inter)", ...defaultTheme.fontFamily.sans],
display: ["var(--font-grotesk)"],
},
backgroundImage: {
"gradient-radial":
"radial-gradient(50% 50% at 50% 50%, var(--tw-gradient-stops))",
},
animation: {
"fade-in": "fade-in 3s ease-in-out forwards",
title: "title 3s ease-out forwards",