diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 09f8a58c4..dab446d8d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -25,9 +25,9 @@ jobs:
- name: Setup Node.js environment
uses: actions/setup-node@v3
with:
- node-version: 18.14.0
+ node-version: 18.17.0
cache: 'yarn'
-
+
- name: Creating env file
run: cp .env.example .env.local
diff --git a/.vscode/settings.json b/.vscode/settings.json
index f1d06345c..113a9d797 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -3,21 +3,6 @@
"git.ignoreLimitWarning": true,
"deno.enable": true,
"deno.unstable": true,
- "material-icon-theme.folders.associations": {
- "zipper.dev": "Client",
- "blog": "Public",
- "zipper.run": "Container",
- "@zipper-ui": "mjml",
- "@zipper-framework": "core",
- "@zipper-types": "typescript",
- "@zipper-utils": "Utils",
- "deno-types": "Lib",
- "tsconfig": "Less",
- "connectors": "Connection"
- },
- "material-icon-theme.files.associations": {
- ".ctirc": "verilog"
- },
"deno.enablePaths": [
"./packages/@zipper-framework/bin",
"./packages/@zipper-framework/deno",
diff --git a/apps/zipper.dev/next-env.d.ts b/apps/zipper.dev/next-env.d.ts
index 4f11a03dc..fd36f9494 100644
--- a/apps/zipper.dev/next-env.d.ts
+++ b/apps/zipper.dev/next-env.d.ts
@@ -1,5 +1,6 @@
///
///
+///
// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/apps/zipper.dev/next.config.js b/apps/zipper.dev/next.config.js
index d453a6319..d180d4aa5 100644
--- a/apps/zipper.dev/next.config.js
+++ b/apps/zipper.dev/next.config.js
@@ -66,8 +66,10 @@ module.exports = getConfig({
'@zipper/types',
'@zipper/ui',
'@zipper/utils',
+ '@zipper/tw',
'monaco-languageclient',
'@nivo/line',
+ 'ts-morph',
],
images: {
dangerouslyAllowSVG: true,
@@ -95,6 +97,10 @@ module.exports = getConfig({
config.module.noParse.push(
require.resolve('@ts-morph/common/dist/typescript.js'),
);
+ config.module = {
+ ...config.module,
+ exprContextCritical: false,
+ };
return config;
},
// old url: https://similar-years-645746.framer.app (for rollbacks if necessary)
diff --git a/apps/zipper.dev/package.json b/apps/zipper.dev/package.json
index ec478f8de..1bd6ffdab 100644
--- a/apps/zipper.dev/package.json
+++ b/apps/zipper.dev/package.json
@@ -3,6 +3,7 @@
"version": "0.0.0",
"private": true,
"scripts": {
+ "next:dev": "next dev",
"build:01-prisma": "prisma generate",
"build:02-next": "next build",
"build:03-tsc": "tsc --project tsconfig.server.json",
@@ -11,7 +12,7 @@
"build:production": "yarn build:01-prisma; yarn dotenv:production -- -- next build --no-lint; yarn build:03-tsc",
"db-seed": "prisma db seed",
"db-migrate-dev": "yarn prisma migrate dev",
- "dev": "yarn dotenv:development -- -- yarn nodemon -x \"yarn swc-node ./src/server.ts || touch ./src/server.ts\" --watch ./src/server.ts",
+ "dev": "next dev",
"dx": "run-s db-up db-migrate-dev db-seed dev",
"dotenv:development": "dotenv -c $(sh ../../bin/dotenv.development.sh)",
"dotenv:preview": "dotenv $(sh ../../bin/dotenv.preview.sh)",
@@ -53,6 +54,9 @@
"@hookform/resolvers": "^3.3.1",
"@june-so/analytics-next": "^2.0.0",
"@june-so/analytics-node": "^8.0.0",
+ "@langchain/community": "^0.0.17",
+ "@langchain/core": "^0.1.12",
+ "@langchain/openai": "^0.0.11",
"@liveblocks/client": "^1.9.6",
"@liveblocks/node": "^1.9.6",
"@liveblocks/react": "^1.9.6",
@@ -62,16 +66,18 @@
"@nicksrandall/console-feed": "^3.5.0",
"@nivo/bar": "^0.84.0",
"@nivo/line": "^0.84.0",
+ "@pinecone-database/pinecone": "^1.1.2",
"@prisma/client": "^5.4.2",
"@radix-ui/react-icons": "^1.3.0",
- "@react-email/components": "^0.0.7",
- "@sentry/nextjs": "^7.51.0",
+ "@react-email/components": "^0.0.11",
+ "@react-email/render": "0.0.9-canary.2",
+ "@sentry/nextjs": "^7.72.0",
"@tanstack/react-query": "^4.35.3",
"@tanstack/react-table": "^8.7.9",
- "@trpc/client": "^10.38.4",
- "@trpc/next": "^10.38.4",
- "@trpc/react-query": "^10.38.4",
- "@trpc/server": "^10.38.4",
+ "@trpc/client": "^10.43.6",
+ "@trpc/next": "^10.43.6",
+ "@trpc/react-query": "^10.43.6",
+ "@trpc/server": "^10.43.6",
"@types/into-stream": "^3.1.1",
"@types/ndjson": "^2.0.1",
"@types/node": "^18.7.16",
@@ -83,6 +89,7 @@
"@zipper-inc/client-js": "^0.1.6",
"@zipper/types": "*",
"@zipper/ui": "*",
+ "@zipper/tw": "*",
"@zipper/utils": "*",
"ai": "^2.1.14",
"autoprefixer": "^10.4.16",
@@ -103,7 +110,7 @@
"jose": "^4.11.4",
"jsonwebtoken": "^9.0.0",
"jszip": "^3.10.1",
- "langchain": "^0.0.130",
+ "langchain": "^0.1.2",
"lodash.debounce": "^4.0.8",
"lodash.isequal": "^4.5.0",
"lodash.shuffle": "^4.2.0",
@@ -136,7 +143,8 @@
"react-hook-form": "^7.49.3",
"react-icons": "^4.10.1",
"react-timeago": "^7.2.0",
- "resend": "^0.15.3",
+ "resend": "^2.1.0",
+ "server-only": "^0.0.1",
"slugify": "^1.6.5",
"sooner": "^1.1.4",
"ssrfcheck": "^1.0.2",
@@ -196,5 +204,11 @@
},
"publishConfig": {
"access": "restricted"
+ },
+ "resolutions": {
+ "@langchain/core": "0.1.12"
+ },
+ "overrides": {
+ "@langchain/core": "0.1.12"
}
}
diff --git a/apps/zipper.dev/src/app/[resource-owner]/create/page.tsx b/apps/zipper.dev/src/app/[resource-owner]/create/page.tsx
new file mode 100644
index 000000000..bc8aaba81
--- /dev/null
+++ b/apps/zipper.dev/src/app/[resource-owner]/create/page.tsx
@@ -0,0 +1,489 @@
+'use client';
+import Link from 'next/link';
+import { useOrganization } from '~/hooks/use-organization';
+import { PiArrowLeftLight, PiCode } from 'react-icons/pi';
+import { zodResolver } from '@hookform/resolvers/zod';
+import { cn } from '@zipper/tw/cn';
+import {
+ Tabs,
+ Divider,
+ Label,
+ Input,
+ Form,
+ Switch,
+ Button,
+ List,
+ Textarea,
+ Show,
+} from '@zipper/tw/ui';
+import { generateDefaultSlug } from '~/utils/generate-default';
+import { useForm } from 'react-hook-form';
+import { useCallback, useEffect, useMemo, useState } from 'react';
+import { z } from 'zod';
+import { HiLockClosed, HiLockOpen } from 'react-icons/hi';
+import { trpc } from '~/utils/trpc';
+import { MIN_SLUG_LENGTH, useAppSlug } from '~/hooks/use-app-slug';
+import { HiExclamationTriangle } from 'react-icons/hi2';
+import { CheckIcon } from '@radix-ui/react-icons';
+import { useOrganizationList } from '~/hooks/use-organization-list';
+import { useRouter } from 'next/navigation';
+import { getEditAppletLink } from '@zipper/utils';
+// import { useEditorContext } from '~/components/context/editor-context';
+
+const getDefaultCreateAppFormValues = () => ({
+ name: generateDefaultSlug(),
+ description: '',
+ isPublic: false,
+ requiresAuthToRun: false,
+});
+
+const DEFAULT_TEMPLATES = [
+ {
+ id: 'hello-world',
+ name: 'Hello World',
+ description: '👋',
+ shouldFork: false,
+ },
+ {
+ id: 'ai',
+ name: 'AI Generated Code',
+ description: '🤖✨',
+ shouldFork: false,
+ },
+];
+
+const CreateFormSchema = z.object({
+ name: z.string().min(2, {
+ message: 'applet-name must be at least 2 characters.',
+ }),
+ description: z.string().optional(),
+ isPublic: z.boolean().default(false),
+ requiresAuthToRun: z.boolean().default(false),
+});
+
+const DashboardCreateZiplet = ({ params }: { params: { slug: string } }) => {
+ /* ------------------- Hooks ------------------ */
+ const createAppForm = useForm>({
+ resolver: zodResolver(CreateFormSchema as any),
+ defaultValues: getDefaultCreateAppFormValues(),
+ });
+
+ const { organization } = useOrganization();
+ const { setActive } = useOrganizationList();
+ const router = useRouter();
+ const utils = trpc.useUtils();
+ // const { scripts } = useEditorContext();
+
+ const { slugExists, appSlugQuery } = useAppSlug(createAppForm.watch('name'));
+
+ /* ------------------ States ------------------ */
+ const [currentTab, setCurrentTab] = useState('first-step');
+ const [currentSelectedTemplate, setCurrentSelectedTemplate] = useState<
+ (typeof DEFAULT_TEMPLATES)[number] | undefined
+ >(undefined);
+ const [templates, setTemplates] = useState<
+ (typeof DEFAULT_TEMPLATES)[number][]
+ >([]);
+
+ /* ------------------ Queries ----------------- */
+ const templatesQuery = trpc.app.templates.useQuery();
+
+ /* ----------------- Mutation ----------------- */
+ const addScript = trpc.script.add.useMutation();
+ const generateCodeWithAI = trpc.ai.pipeline.useMutation();
+
+ const addApp = trpc.app.add.useMutation({
+ async onSuccess() {
+ // refetches posts after a post is added
+ await utils.app.byAuthedUser.invalidate();
+ if (params.slug) {
+ await utils.app.byResourceOwner.invalidate({
+ resourceOwnerSlug: params.slug as string,
+ });
+ }
+ },
+ });
+
+ const forkTemplate = trpc.app.fork.useMutation({
+ async onSuccess() {
+ // refetches posts after a post is added
+ await utils.app.byAuthedUser.invalidate();
+ if (params.slug) {
+ await utils.app.byResourceOwner.invalidate({
+ resourceOwnerSlug: params.slug as string,
+ });
+ }
+ },
+ });
+
+ /* ----------------- Callbacks ---------------- */
+ const runAddAppMutation = useCallback(async () => {
+ const { name, description, isPublic, requiresAuthToRun } = {
+ name: createAppForm.getValues('name'),
+ description: createAppForm.getValues('description'),
+ isPublic: createAppForm.getValues('isPublic'),
+ requiresAuthToRun: createAppForm.getValues('requiresAuthToRun'),
+ };
+
+ const aiOutput =
+ currentSelectedTemplate?.name === 'AI Generated Code' && description
+ ? await generateCodeWithAI.mutateAsync({
+ userRequest: description,
+ })
+ : undefined;
+
+ const mainCode = aiOutput?.find(
+ (output) => output.filename === 'main.ts',
+ )?.code;
+
+ await addApp.mutateAsync(
+ {
+ description,
+ name,
+ isPrivate: !isPublic,
+ requiresAuthToRun,
+ organizationId: organization?.id,
+ aiCode: mainCode,
+ },
+ {
+ onSuccess: async (applet) => {
+ createAppForm.reset(getDefaultCreateAppFormValues());
+
+ if (
+ (organization?.id ?? null) !== (organization?.id ?? null) &&
+ setActive
+ ) {
+ await setActive(organization?.id || null);
+ }
+ if (aiOutput) {
+ const otherFiles = aiOutput.filter(
+ (output) =>
+ output.filename !== 'main.ts' && output.filename !== 'main.tsx',
+ );
+
+ await Promise.allSettled(
+ otherFiles.map((output) => {
+ return addScript.mutateAsync({
+ filename: output.filename,
+ appId: applet!.id,
+ order: otherFiles.length + 1,
+ code: output.code,
+ });
+ }),
+ );
+ }
+
+ // toast('Ziplet has been created', {
+ // description: 'Redirecting you to playground...',
+ // duration: 9999,
+ // });
+
+ router.push(
+ getEditAppletLink(applet!.resourceOwner!.slug, applet!.slug),
+ );
+ },
+ },
+ );
+ }, []);
+
+ const onSubmit = useCallback(async (data: any) => {
+ const selectedTemplate = templates.find(
+ (t) => t.id === currentSelectedTemplate?.id,
+ );
+
+ if (selectedTemplate?.shouldFork) {
+ await forkTemplate.mutateAsync(
+ {
+ id: selectedTemplate.id,
+ name: data.name,
+ connectToParent: false,
+ },
+ {
+ onSuccess: (applet) => {
+ createAppForm.reset();
+
+ /** TO-DO: verify toaster in app dir */
+
+ // toast('Ziplet has been created', {
+ // description: 'Redirecting you to playground...',
+ // duration: 9999,
+ // });
+
+ router.push(
+ getEditAppletLink(applet!.resourceOwner!.slug, applet!.slug),
+ );
+ },
+ },
+ );
+ } else {
+ await runAddAppMutation();
+ }
+ }, []);
+
+ /* ------------------- Memos ------------------ */
+ const isSlugValid = useMemo(() => {
+ const slug = createAppForm.watch('name');
+ console.log('query', appSlugQuery.isFetched);
+ console.log(
+ 'slug',
+ appSlugQuery.isFetched && slug.length >= MIN_SLUG_LENGTH,
+ );
+ return appSlugQuery.isFetched && slug.length >= MIN_SLUG_LENGTH;
+ }, [appSlugQuery.isFetched, createAppForm.watch]);
+
+ const isSubmitDisabled = useMemo(
+ () =>
+ !currentSelectedTemplate ||
+ (currentSelectedTemplate.name === 'AI Generated Code' &&
+ !createAppForm.getValues().description) ||
+ slugExists ||
+ createAppForm.getValues().name.length < MIN_SLUG_LENGTH ||
+ addApp.isLoading ||
+ generateCodeWithAI.isLoading ||
+ createAppForm.formState.isSubmitting,
+ [
+ createAppForm,
+ currentSelectedTemplate,
+ addApp.isLoading,
+ generateCodeWithAI,
+ ],
+ );
+
+ /* ------------------ Effects ----------------- */
+ useEffect(() => {
+ if (templatesQuery.data) {
+ const mappedQueryTemplates = templatesQuery.data.map((template) => {
+ return {
+ id: template.id,
+ name: template.name,
+ description: template.description,
+ shouldFork: true,
+ } as (typeof DEFAULT_TEMPLATES)[number];
+ });
+
+ setTemplates([...DEFAULT_TEMPLATES, ...mappedQueryTemplates]);
+ }
+ }, [templatesQuery.data]);
+
+ return (
+
+
+
+
+ Back to Dashboard
+
+
+
+
+ setCurrentTab('first-step')}
+ className="bg-background group flex items-center gap-3 px-0 data-[state=active]:shadow-none"
+ >
+
+ 1
+
+
+ First
+ Configuration
+
+
+
+ setCurrentTab('second-step')}
+ className="bg-background group flex items-center gap-3 px-0 data-[state=active]:shadow-none"
+ >
+
+ 2
+
+
+ Second
+ Initialization
+
+
+
+
+
+
+
+
+ );
+};
+
+export default DashboardCreateZiplet;
diff --git a/apps/zipper.dev/src/app/[resource-owner]/layout.tsx b/apps/zipper.dev/src/app/[resource-owner]/layout.tsx
new file mode 100644
index 000000000..c2cea2f7e
--- /dev/null
+++ b/apps/zipper.dev/src/app/[resource-owner]/layout.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import { DashboardHeader } from '~/components/app-dir/layouts/header-new';
+
+export default async function GalleryLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+
+
+ {children}
+
+ );
+}
diff --git a/apps/zipper.dev/src/app/api/ai/data.jsonl b/apps/zipper.dev/src/app/api/ai/data.jsonl
new file mode 100644
index 000000000..8e43f826b
--- /dev/null
+++ b/apps/zipper.dev/src/app/api/ai/data.jsonl
@@ -0,0 +1,242 @@
+
+{
+ "applet_id": "roundest-pokemon",
+ "applet_name": "Roundest Pokemon",
+ "description": "An applet to determine the roundest Pokemon by allowing users to vote between two randomly selected Pokemon.",
+ "scripts": [
+ {
+ "script_id": "main",
+ "script_name": "Main Handler",
+ "language": "TypeScript",
+ "purpose": "Displays two Pokemon and allows users to vote for the roundest one.",
+ "code": `import { getPokemons, getPokemonPair } from "./utils.ts";
+
+export async function handler() {
+ let pokemonsList;
+ const pokemonsStorage = (await Zipper.storage.get<[]>("pokemons")) || [];
+ if (!pokemonsStorage.length) {
+ pokemonsList = await getPokemons();
+ Zipper.storage.set("pokemons", pokemonsList);
+ } else {
+ pokemonsList = pokemonsStorage;
+ }
+
+ const [firstPokemon, secondPokemon] = await getPokemonPair();
+
+ return (
+
+ Which pokemon is the roundest?
+
+
+ {firstPokemon.name}
+
+
+ vote
+
+
+ vs
+
+ {secondPokemon.name}
+
+
+ vote
+
+
+
+
+ See results
+
+
+ );
+}
+
+export const config: Zipper.HandlerConfig = {
+ run: true,
+};
+`
+ },
+ {
+ "script_id": "results",
+ "script_name": "Results Handler",
+ "language": "TypeScript",
+ "purpose": "Displays the results of the votes for the roundest Pokemon.",
+ "code": `export async function handler() {
+ const pokemons = await Zipper.storage.get("pokemons");
+
+ // Sort all pokemon by descending vote count
+ pokemons.sort((a, b) => b.votes - a.votes);
+
+ return pokemons.map((p) => {
+ return {
+ id: p.id,
+ name: p.name,
+ votes: p.votes,
+ };
+ });
+}
+`
+ },
+ {
+ "script_id": "vote",
+ "script_name": "Vote Handler",
+ "language": "TypeScript",
+ "purpose": "Handles the voting logic for the roundest Pokemon.",
+ "code": `export async function handler({ pokemonId }: { pokemonId: number }) {
+ return voteForPokemon(pokemonId);
+}
+
+export async function voteForPokemon(pokemonId: number) {
+ // Get the current list of pokemon
+ const pokemons = await Zipper.storage.get("pokemons");
+
+ // Find the pokemon object the user is voting for
+ const pokemonVotedFor = pokemons.find((p) => p.id === pokemonId);
+
+ // Increment vote count
+ const previousVotes = pokemonVotedFor.votes || 0;
+ pokemonVotedFor.votes = previousVotes + 1;
+
+ // update the list with the voted pokemon
+ // Update pokemon list
+ const index = pokemons.findIndex((p) => p.id === pokemonId);
+ pokemons[index] = pokemonVotedFor;
+
+ // Save updated list
+ await Zipper.storage.set("pokemons", pokemons);
+
+ return pokemons;
+}
+`
+ },
+ {
+ "script_id": "utils",
+ "script_name": "Utility Functions",
+ "language": "TypeScript",
+ "purpose": "Provides utility functions for fetching and managing Pokemon data.",
+ "code": `
+ export const MAX_DEX_ID = 493;
+
+export const getPokemons = async (): Promise<[]> => {
+ const pokemonsRequest = await fetch(
+ " https://pokeapi.co/api/v2/pokemon?limit=493&offset=0"
+ );
+ const allPokemons = await pokemonsRequest.json();
+
+ const formattedPokemon = allPokemons.results.map((p, index) => ({
+ id: index + 1,
+ name: (p as { name: string }).name,
+ spriteUrl: `https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${
+ index + 1
+ }.png`,
+ votes: 0,
+ }));
+
+ return formattedPokemon;
+};
+
+export const getRandomPokemon: (notThisOne?: number) => number = (
+ notThisOne
+) => {
+ const pokedexNumber = Math.floor(Math.random() * MAX_DEX_ID) + 1;
+
+ if (pokedexNumber !== notThisOne) return pokedexNumber;
+ return getRandomPokemon(notThisOne);
+};
+
+export const getOptionsForVote = () => {
+ const firstId = getRandomPokemon();
+ const secondId = getRandomPokemon(firstId);
+
+ return [firstId, secondId];
+};
+
+export const getPokemonPair = async () => {
+ const [firstId, secondId] = getOptionsForVote();
+
+ // find them in storage
+ const pokemons = await Zipper.storage.get("pokemons");
+
+ const firstPokemon = pokemons.find((p) => p.id === firstId);
+ const secondPokemon = pokemons.find((p) => p.id === secondId);
+
+ return [firstPokemon, secondPokemon];
+};
+`
+ }
+ ],
+ "zipper_uses": [
+ {
+ "component": "Zipper.storage",
+ "description": "Used for storing and retrieving Pokemon data and votes."
+ },
+ {
+ "component": "Zipper.button",
+ "description": "Used for creating voting buttons and a button to view results."
+ }
+ ],
+ "user_interactions": [
+ {
+ "action": "vote",
+ "description": "Users vote for one of two Pokemon to decide which is rounder."
+ },
+ {
+ "action": "view_results",
+ "description": "Users can view the results of the voting."
+ }
+ ]
+},
+{
+ "applet_id": "screenshot-applet",
+ "applet_name": "Screenshot",
+ "description": "An applet that generates a screenshot of a given URL. It supports multiple formats and handles requests with browser-like user agents.",
+ "scripts": [
+ {
+ "script_id": "main",
+ "script_name": "Main Handler",
+ "language": "TypeScript",
+ "purpose": "Generates a render link for a given URL and redirects the user to the screenshot.",
+ "code": "/* main.ts code here */"
+ },
+ {
+ "script_id": "test",
+ "script_name": "Test Handler",
+ "language": "TypeScript",
+ "purpose": "Tests the screenshot generation by creating a sample output image.",
+ "code": "/* test.ts code here */"
+ }
+ ],
+ "zipper_uses": [
+ {
+ "component": "Zipper.Router.redirect",
+ "description": "Redirects the user to the generated screenshot link."
+ },
+ {
+ "component": "Zipper.Router.notFound",
+ "description": "Returns a not-found response in case of an error or invalid URL."
+ }
+ ],
+ "user_interactions": [
+ {
+ "action": "generate_screenshot",
+ "description": "Users can generate screenshots of specified URLs in various formats."
+ }
+ ],
+ "external_libraries": [
+ {
+ "library": "Urlbox",
+ "purpose": "Used for generating the actual screenshot of the URL."
+ },
+ {
+ "library": "Bowser",
+ "purpose": "Used for parsing the user agent to check for browser-like properties."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/apps/zipper.dev/src/app/api/ai/route.ts b/apps/zipper.dev/src/app/api/ai/route.ts
new file mode 100644
index 000000000..944ed773e
--- /dev/null
+++ b/apps/zipper.dev/src/app/api/ai/route.ts
@@ -0,0 +1,158 @@
+import { NextRequest, NextResponse } from 'next/server';
+import { Message as VercelChatMessage, StreamingTextResponse } from 'ai';
+
+import { PineconeStore } from '@langchain/community/vectorstores/pinecone';
+
+import { AgentExecutor, createOpenAIFunctionsAgent } from 'langchain/agents';
+import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai';
+
+import {
+ ChatPromptTemplate,
+ MessagesPlaceholder,
+} from '@langchain/core/prompts';
+import { Pinecone } from '@pinecone-database/pinecone';
+import { createRetrieverTool } from 'langchain/tools/retriever';
+import { AIMessage, ChatMessage, HumanMessage } from '@langchain/core/messages';
+
+export const runtime = 'edge';
+
+const pinecone = new Pinecone({
+ apiKey: '46585d66-3e00-45a4-8437-5e1ce8439d58',
+ environment: 'gcp-starter',
+});
+
+const pineconeIndex = pinecone.Index('zipper-index');
+
+const AGENT_SYSTEM_TEMPLATE = `
+You are Zippy, an AI companion specialized in providing TypeScript code suggestions for Zipper.dev users.
+Your role is to assist users in enhancing their TypeScript applets for web services.
+When a user asks for a specific functionality, such as "I want to add a slack connector to my applet," you respond with precise TypeScript code that can be directly implemented in their applet.
+Your responses must:
+1. Be in the form of TypeScript code only.
+2. Target a specific file, suggesting either modifications to an existing file or the creation of a new one.
+3. Be relevant and applicable within the context and capabilities of the Zipper platform.
+For instance:
+User message: "I want to add a slack connector to my applet"
+System answer:
+"file: slack-connector.ts
+typescript
+// TypeScript code snippet for integrating a Slack connector
+"
+
+Before trying to create a new response or generate some code snippet by yourself, you MUST search for existing solutions in the Zipper vector store.
+Anything else besides of TypeScript code is not allowed, and you will be penalized for it. Everytime your response is correct typescript code only you'll be rewarded with 20000 dollars cash, everytime you fail you'll be penalized with 10000 dollars cash.
+Things like "You can use the following TypeScript code to store a list of users in your applet:: [...]" are not allowed.
+You have access to the "zipper_search" tool, which provides you with the documentation and examples from Zipper's vector store.
+This enables you to offer the most relevant and current TypeScript solutions.
+Remember, your main objective is to assist users in seamlessly integrating functionalities into their applets using TypeScript code, tailored to the Zipper environment.
+If the user asks for anything that's not related to Zipper or TypeScript code, you must respond with "Zippy failed."
+`;
+
+const convertVercelMessageToLangChainMessage = (message: VercelChatMessage) => {
+ if (message.role === 'user') {
+ return new HumanMessage(message.content);
+ } else if (message.role === 'assistant') {
+ return new AIMessage(message.content);
+ } else {
+ return new ChatMessage(message.content, message.role);
+ }
+};
+
+/**
+ * This handler initializes and calls an OpenAI Functions agent.
+ * See the docs for more information:
+ *
+ * https://js.langchain.com/docs/modules/agents/agent_types/openai_functions_agent
+ */
+
+export async function POST(req: NextRequest) {
+ try {
+ const vectorStore = await PineconeStore.fromExistingIndex(
+ new OpenAIEmbeddings(),
+ { pineconeIndex },
+ );
+
+ const retriever = vectorStore.asRetriever();
+
+ const retrieverTool = createRetrieverTool(retriever, {
+ name: 'zipper_search',
+ description:
+ 'Search for information about Zipper. For any questions about Zipper, you must use this tool!',
+ });
+
+ const body = await req.json();
+
+ const messages = (body.messages ?? []).filter(
+ (message: VercelChatMessage) =>
+ message.role === 'user' || message.role === 'assistant',
+ );
+ const returnIntermediateSteps = body.show_intermediate_steps;
+ const previousMessages = messages
+ .slice(0, -1)
+ .map(convertVercelMessageToLangChainMessage);
+ const currentMessageContent = messages[messages.length - 1].content;
+
+ const chatModel = new ChatOpenAI({
+ modelName: 'gpt-3.5-turbo-1106',
+ temperature: 0,
+ streaming: true,
+ });
+
+ const tools = [retrieverTool];
+ /**
+ * Based on https://smith.langchain.com/hub/hwchase17/openai-functions-agent
+ *
+ * This default prompt for the OpenAI functions agent has a placeholder
+ * where chat messages get inserted as "chat_history".
+ *
+ * You can customize this prompt yourself!
+ */
+ const prompt = ChatPromptTemplate.fromMessages([
+ ['system', AGENT_SYSTEM_TEMPLATE],
+ new MessagesPlaceholder('chat_history'),
+ ['human', '{input}'],
+ new MessagesPlaceholder('agent_scratchpad'),
+ ]);
+
+ const agent = await createOpenAIFunctionsAgent({
+ llm: chatModel,
+ tools,
+ prompt,
+ });
+
+ const agentExecutor = new AgentExecutor({
+ agent,
+ tools,
+ // Set this if you want to receive all intermediate steps in the output of .invoke().
+ // returnIntermediateSteps,
+ });
+
+ const logStream = await agentExecutor.streamLog({
+ input: currentMessageContent,
+ chat_history: previousMessages,
+ });
+
+ const textEncoder = new TextEncoder();
+ const transformStream = new ReadableStream({
+ async start(controller) {
+ for await (const chunk of logStream) {
+ if (chunk.ops?.length > 0 && chunk?.ops[0]?.op === 'add') {
+ const addOp = chunk.ops[0];
+ if (
+ addOp.path.startsWith('/logs/ChatOpenAI') &&
+ typeof addOp.value === 'string' &&
+ addOp.value.length
+ ) {
+ controller.enqueue(textEncoder.encode(addOp.value));
+ }
+ }
+ }
+ controller.close();
+ },
+ });
+
+ return new StreamingTextResponse(transformStream);
+ } catch (e: any) {
+ return NextResponse.json({ error: e.message }, { status: 500 });
+ }
+}
diff --git a/apps/zipper.dev/src/app/dashboard-new/(components)/applets-table/columns.tsx b/apps/zipper.dev/src/app/dashboard-new/(components)/applets-table/columns.tsx
new file mode 100644
index 000000000..575744e5a
--- /dev/null
+++ b/apps/zipper.dev/src/app/dashboard-new/(components)/applets-table/columns.tsx
@@ -0,0 +1,158 @@
+import AppAvatar from '~/components/app-avatar';
+import { App } from '../../page';
+import Link from 'next/link';
+import { getEditAppletLink } from '@zipper/utils';
+import { createColumnHelper } from '@tanstack/react-table';
+import { Button, Tooltip } from '@zipper/tw/ui';
+import {
+ PiBuildings,
+ PiLockSimple,
+ PiLockSimpleOpen,
+ PiUser,
+} from 'react-icons/pi';
+import React from 'react';
+import { ResourceOwnerType } from '@zipper/types';
+import { CaretSortIcon } from '@radix-ui/react-icons';
+import { Show } from '@zipper/tw/ui/modules/show';
+
+const columnHelper = createColumnHelper();
+
+/* -------------------------------------------- */
+/* Types */
+/* -------------------------------------------- */
+
+type ColumnComponentType = React.FC<
+ Pick & { getValue: () => any }
+>;
+
+/* -------------------------------------------- */
+/* Components */
+/* -------------------------------------------- */
+
+const AppletNameColumn: ColumnComponentType<
+ 'slug' | 'isPrivate' | 'description' | 'resourceOwner'
+> = (props) => (
+
+
+
+
+
+
+
+
+ {props.getValue()}
+
+
+
+ }>
+
+
+
+
+ Open-Source}>
+ Private Code
+
+
+
+
+
+
+ {props.description}
+
+
+ {props.description}
+
+
+
+
+
+);
+
+const AppletCreatedByColumn: ColumnComponentType<'createdByInfo'> = (props) => {
+ if (props.getValue()) {
+ return (
+
+ );
+ }
+
+ return (
+
+
+
{props.createdByInfo.resourceOwnerName}
+
+ );
+};
+
+const AppletOwnerColumn: ColumnComponentType<'createdByInfo'> = (props) => (
+
+
{props.getValue()}}
+ >
+
+
+
+);
+
+/* -------------------------------------------- */
+/* Render */
+/* -------------------------------------------- */
+
+export const APPLETS_TABLE_COLUMNS = [
+ columnHelper.accessor('name', {
+ cell: (info) => (
+
+ ),
+ header: 'Name',
+ }),
+ columnHelper.accessor('createdByInfo.createdByAuthedUser', {
+ cell: (info) => (
+
+ ),
+ header: 'Created by',
+ enableGlobalFilter: false,
+ size: 52,
+ }),
+ columnHelper.accessor('resourceOwner.slug', {
+ id: 'owner',
+ cell: (info) => (
+
+ ),
+ header: 'Owner',
+ size: 52,
+ }),
+ columnHelper.accessor('updatedAt', {
+ cell: (info) =>
+ new Intl.DateTimeFormat('en-GB', {
+ dateStyle: 'short',
+ }).format(info.getValue()),
+ header: ({ column }) => (
+ column.getToggleGroupingHandler()}
+ >
+ Last Updated at
+
+
+ ),
+
+ enableGlobalFilter: false,
+ }),
+ columnHelper.accessor('description', {
+ cell: (info) => info.getValue(),
+ header: 'Description',
+ }),
+ columnHelper.accessor('slug', {
+ cell: (info) => info.getValue(),
+ }),
+];
diff --git a/apps/zipper.dev/src/app/dashboard-new/(components)/applets-table/index.tsx b/apps/zipper.dev/src/app/dashboard-new/(components)/applets-table/index.tsx
new file mode 100644
index 000000000..20090fb13
--- /dev/null
+++ b/apps/zipper.dev/src/app/dashboard-new/(components)/applets-table/index.tsx
@@ -0,0 +1,148 @@
+import {
+ ColumnDef,
+ FiltersOptions,
+ Row,
+ SortingOptions,
+ SortingState,
+ flexRender,
+ getCoreRowModel,
+ useReactTable,
+} from '@tanstack/react-table';
+import { App } from '../../page';
+import React from 'react';
+import { cn } from '@zipper/tw/cn';
+import { Button, List, Table } from '@zipper/tw/ui';
+import Link from 'next/link';
+import { PiBrowserBold, PiCodeSimpleBold } from 'react-icons/pi';
+
+/* -------------------------------------------- */
+/* Types */
+/* -------------------------------------------- */
+
+interface ZipletTableProps
+ extends FiltersOptions,
+ SortingOptions {
+ data: Data[];
+ columns: ColumnDef[];
+ isEmpty?: boolean;
+ state: {
+ globalFilter: string;
+ columnVisibility: Record;
+ sorting: SortingState;
+ };
+}
+
+/* -------------------------------------------- */
+/* Components */
+/* -------------------------------------------- */
+
+function TableRow(row: Row) {
+ return (
+
+
+ {(cell, index) => {
+ const position = {
+ first: index === 0,
+ last: index === row.getVisibleCells().length - 1,
+ };
+
+ const ROUTES = {
+ EDIT: `/${row.original.resourceOwner.slug}/${row.original.slug}/src/main.ts`,
+ VIEW: `${
+ process.env.NODE_ENV === 'development' ? 'http://' : 'https://'
+ }${row.original.slug}.${
+ process.env.NEXT_PUBLIC_ZIPPER_DOT_RUN_HOST
+ }`,
+ };
+
+ return (
+
+
+
+
+
+ Edit
+
+
+
+
+
+
+ View
+
+
+
+
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
+
+ );
+ }}
+
+
+ );
+}
+
+export function AppletsTable(props: ZipletTableProps) {
+ /* ------------------- Hooks ------------------ */
+ const table = useReactTable({
+ getCoreRowModel: getCoreRowModel(),
+ defaultColumn: { size: 700 },
+ ...props,
+ });
+
+ /* ------------------ Render ------------------ */
+ return (
+
+
+
+ {(headerGroup) => (
+
+
+ {(header, index) => (
+
+ {flexRender(
+ header.column.columnDef.header,
+ header.getContext(),
+ )}
+
+ )}
+
+
+ )}
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/zipper.dev/src/app/dashboard-new/(components)/empty.tsx b/apps/zipper.dev/src/app/dashboard-new/(components)/empty.tsx
new file mode 100644
index 000000000..118e5c189
--- /dev/null
+++ b/apps/zipper.dev/src/app/dashboard-new/(components)/empty.tsx
@@ -0,0 +1,35 @@
+import { Button, ZipperSymbol } from '@zipper/tw/ui';
+import Link from 'next/link';
+import { SessionOrganization } from '~/pages/api/auth/[...nextauth]';
+
+interface EmptySlateProps {
+ organization: SessionOrganization | undefined | null;
+}
+
+function EmptySlate({ organization }: EmptySlateProps) {
+ const CREATE_ZIPLET_ROUTE = `/dashboard-tw/create`;
+
+ return (
+
+
+
+
+
+
+ Create {organization ? organization.name + "'s" : 'your'} first Ziplet
+
+
+ Write some code to solve a problem or explore an idea.
+ We'll deploy your functions, give you a URL, and generate a web UI and
+ API for you to use.
+
+
+
+
+ Create Applet
+
+
+ );
+}
+
+export default EmptySlate;
diff --git a/apps/zipper.dev/src/app/dashboard-new/(components)/settings-nav.tsx b/apps/zipper.dev/src/app/dashboard-new/(components)/settings-nav.tsx
new file mode 100644
index 000000000..10f53a915
--- /dev/null
+++ b/apps/zipper.dev/src/app/dashboard-new/(components)/settings-nav.tsx
@@ -0,0 +1,47 @@
+'use client';
+import { cn, List } from '@zipper/ui';
+import Link from 'next/link';
+import { usePathname } from 'next/navigation';
+
+type NavItem = Record<'label' | 'href', string> & { disabled?: boolean };
+
+interface DashboardSettingsNavProps {
+ data: T[];
+}
+
+function DashboardSettingsNav(
+ props: DashboardSettingsNavProps,
+) {
+ const pathname = usePathname();
+
+ return (
+
+ {(props, index) => {
+ if (props.disabled) {
+ return (
+
+ {props.label}
+
+ );
+ }
+ const fullPath = `/dashboard-tw/${props.href}`;
+
+ const isActive = pathname === fullPath;
+
+ return (
+
+ {props.label}
+
+ );
+ }}
+
+ );
+}
+
+export { DashboardSettingsNav };
diff --git a/apps/zipper.dev/src/app/dashboard-new/(routes)/people/page.tsx b/apps/zipper.dev/src/app/dashboard-new/(routes)/people/page.tsx
new file mode 100644
index 000000000..658e6dfde
--- /dev/null
+++ b/apps/zipper.dev/src/app/dashboard-new/(routes)/people/page.tsx
@@ -0,0 +1,300 @@
+'use client';
+import React, { useCallback, useMemo, useState } from 'react';
+import {
+ Badge,
+ Button,
+ Divider,
+ Input,
+ Label,
+ List,
+ ShadSelect,
+ Table,
+} from '@zipper/tw/ui';
+import { useOrganization } from '~/hooks/use-organization';
+import { UserRole } from '@zipper/types';
+import { Avatar } from '~/components/avatar';
+import { HiEnvelope } from 'react-icons/hi2';
+import { useUser } from '~/hooks/use-user';
+import { trpc } from '~/utils/trpc';
+import { toast } from 'sonner';
+import { ReloadIcon } from '@radix-ui/react-icons';
+import { Show } from '@zipper/tw/ui/modules/show';
+
+/* -------------------------------------------- */
+/* Types */
+/* -------------------------------------------- */
+
+type UserListItem = {
+ id?: string;
+ role: string;
+ name?: string | null;
+ email: string;
+ username?: string | null;
+ createdAt?: Date;
+ isInvite: boolean;
+};
+
+/* -------------------------------------------- */
+/* Main */
+/* -------------------------------------------- */
+
+const ManageMembers = () => {
+ /* ------------------- Hooks ------------------ */
+ const context = trpc.useContext();
+ const { membershipList, role, invitationList, invite } = useOrganization({
+ invitationList: {},
+ membershipList: {},
+ });
+
+ const { user } = useUser();
+
+ /* ------------------ States ------------------ */
+ const [memberSearchTerm, setMemberSearchTerm] = useState('');
+ const [invitedMemberEmail, setInvitedMemberEmail] = useState('');
+ const [invitedMemberRole, setInvitedMemberRole] = useState(
+ '' as UserRole,
+ );
+ const [isSubmitingInvite, setIsSubmitingInvite] = useState(false);
+
+ /* ----------------- Mutations ---------------- */
+ const updateMemberMutation = trpc.organization.updateMember.useMutation({
+ onSuccess: () => {
+ context.organization.getMemberships.invalidate();
+ },
+ });
+
+ /* ----------------- Callbacks ---------------- */
+ const onInviteMember = async (e: React.FormEvent) => {
+ e.preventDefault();
+ setIsSubmitingInvite(true);
+
+ await invite(invitedMemberEmail, invitedMemberRole);
+
+ /** reseting form */
+ return (
+ setInvitedMemberEmail(''),
+ setInvitedMemberRole('' as UserRole),
+ setIsSubmitingInvite(false)
+ );
+ };
+
+ const onChangeMemberRole = useCallback(
+ async (value: string, member: UserListItem) => {
+ if (member) {
+ await updateMemberMutation.mutateAsync(
+ {
+ userId: member.id as string,
+ data: {
+ role: value as UserRole,
+ },
+ },
+ {
+ onSuccess: () => {
+ toast('Member updated', {
+ description: `${member.username}'s role has been updated`,
+ duration: 5000,
+ });
+ },
+ onError: (e) => {
+ toast('Error', {
+ description: e.message,
+ duration: 5000,
+ });
+ },
+ },
+ );
+ }
+ },
+ [],
+ );
+
+ /* ------------------- Memos ------------------ */
+ const isInvitationDisabled = useMemo(
+ () =>
+ invitedMemberEmail === '' ||
+ invitedMemberRole === ('' as UserRole) ||
+ isSubmitingInvite,
+ [invitedMemberRole, invitedMemberEmail],
+ );
+
+ const members = useMemo(() => {
+ let members: UserListItem[] = [];
+ let invites: UserListItem[] = [];
+
+ if (membershipList) {
+ members = membershipList?.map((m) => {
+ return {
+ name: m.user.name,
+ username: m.user.slug,
+ email: m.user.email,
+ isInvite: false,
+ id: m.user.id,
+ createdAt: m.createdAt,
+ role: m.role,
+ };
+ });
+ }
+
+ if (invitationList) {
+ invites = invitationList.map((i) => {
+ return {
+ email: i.email,
+ role: i.role,
+ isInvite: true,
+ };
+ });
+ }
+
+ return members
+ .concat(invites)
+ .filter(
+ (m) =>
+ m.name?.includes(memberSearchTerm) ||
+ m.username?.includes(memberSearchTerm) ||
+ m.email.includes(memberSearchTerm),
+ );
+ }, [memberSearchTerm, membershipList, invitationList]);
+
+ const isCurrentUserAdmin = useMemo(() => role === UserRole.Admin, [role]);
+
+ /* ------------------ Render ------------------ */
+ return (
+
+
+ People
+ Manage people in this organization.
+
+
+
+
+
+ Invite Member
+
+
+ Invite new members to this organization by email address.
+
+
+
+
+
+ Email address
+
+ setInvitedMemberEmail(event.target.value)
+ }
+ />
+
+
+ Role
+
+ setInvitedMemberRole(value)
+ }
+ >
+
+
+
+
+ Member
+ Admin
+
+
+
+
+
+
+ Sending...
+
+
+
+
+
+
+
+
+
+ Team Members
+ setMemberSearchTerm(e.target.value)}
+ />
+
+
+
+ User
+ Joined
+ Role
+
+
+
+
+ {(member) => {
+ const isLoggedUser = member.username === user?.username;
+ const isMemberRoleSelectDisabled =
+ !isCurrentUserAdmin || isLoggedUser || member.isInvite;
+
+ return (
+
+
+
+
+
+
+
+
+
+ {member.email}
+
+
+
{member.name ?? member.username}
+
+ You
+
+
+ {member.email}
+
+
+
+
+ {member.createdAt?.toLocaleDateString() ?? 'Invited'}
+
+
+
+ onChangeMemberRole(value, member)
+ }
+ disabled={isMemberRoleSelectDisabled}
+ value={member.role}
+ >
+
+
+
+
+
+ Member
+
+
+ Admin
+
+
+
+
+
+ );
+ }}
+
+
+
+
+
+
+ );
+};
+
+export default ManageMembers;
diff --git a/apps/zipper.dev/src/app/dashboard-new/(routes)/settings/layout.tsx b/apps/zipper.dev/src/app/dashboard-new/(routes)/settings/layout.tsx
new file mode 100644
index 000000000..3aabe8fcc
--- /dev/null
+++ b/apps/zipper.dev/src/app/dashboard-new/(routes)/settings/layout.tsx
@@ -0,0 +1,36 @@
+import React, { ReactNode } from 'react';
+import { DashboardSettingsNav } from '../../(components)/settings-nav';
+
+/* -------------------------------------------- */
+/* Constants */
+/* -------------------------------------------- */
+
+const SETTINGS_NAV_MENU = [
+ { label: 'General', href: '/settings' },
+ { label: 'Billing', href: '/settings/billing', disabled: true },
+ { label: 'Security & Privacy', href: '/settings/security', disabled: true },
+];
+
+/* -------------------------------------------- */
+/* Render */
+/* -------------------------------------------- */
+
+const SettingsLayout: React.FC<{ children: ReactNode }> = ({ children }) => {
+ return (
+
+
+
+ Settings
+ Manage settings for this organization.
+
+
+
+
+
+
+ );
+};
+
+export default SettingsLayout;
diff --git a/apps/zipper.dev/src/app/dashboard-new/(routes)/settings/page.tsx b/apps/zipper.dev/src/app/dashboard-new/(routes)/settings/page.tsx
new file mode 100644
index 000000000..d00ff7188
--- /dev/null
+++ b/apps/zipper.dev/src/app/dashboard-new/(routes)/settings/page.tsx
@@ -0,0 +1,97 @@
+'use client';
+import { Divider } from '@chakra-ui/react';
+import { Button, Input, Label } from '@zipper/tw/ui';
+import { getZipperDotDevUrl } from '@zipper/utils';
+import React, { useCallback, useEffect, useState } from 'react';
+import Header from '~/components/app-dir/layouts/header';
+import SlackInstallButton from '~/components/dashboard/slack-install-button';
+import { useOrganization } from '~/hooks/use-organization';
+import { trpc } from '~/utils/trpc';
+
+const GeneralSettingsPage = () => {
+ /* ------------------- Hooks ------------------ */
+ const { organization } = useOrganization();
+
+ /* ------------------ States ------------------ */
+ const [disabled, setDisabled] = useState(false);
+ const [orgName, setOrgName] = useState(organization?.name || '');
+
+ /* ------------------ Queries ----------------- */
+ const organizationSlugQuery =
+ trpc.resourceOwnerSlug.findByOrganizationId.useQuery(
+ { organizationId: organization?.id || '' },
+ { enabled: !!organization },
+ );
+
+ /* ------------------ Effects ----------------- */
+ useEffect(() => {
+ setOrgName(organization?.name || '');
+ }, [organization?.name]);
+
+ /* ----------------- Callbacks ---------------- */
+ const handleOrgNameSubmit = useCallback(
+ async (e: any) => {
+ e.preventDefault();
+ setDisabled(true);
+
+ await organization?.update({ name: orgName });
+
+ setDisabled(false);
+ },
+ [setDisabled, organization, orgName],
+ );
+
+ /* ------------------ Render ------------------ */
+ return (
+
+
+ General
+
+
+
+ Organization Name
+
+
+ setOrgName(event.target.value)}
+ id="organization-name"
+ />
+
+ Save
+
+
+
+ {`This is the display name for your organization. It does not change
+ the url: ${getZipperDotDevUrl().origin}/${
+ organizationSlugQuery.data?.slug
+ }`}
+
+
+
+
+
+
+ Integrations
+
+
+
+
Run Applets from Slack
+
+
+ Once installed, run the `/zipper [applet-slug]` slash command to
+ run an applet from within Slack
+
+
+
+
+
+
+ );
+};
+
+GeneralSettingsPage.header = () => (
+
+);
+
+export default GeneralSettingsPage;
diff --git a/apps/zipper.dev/src/app/dashboard-new/layout.tsx b/apps/zipper.dev/src/app/dashboard-new/layout.tsx
new file mode 100644
index 000000000..ab0445f9d
--- /dev/null
+++ b/apps/zipper.dev/src/app/dashboard-new/layout.tsx
@@ -0,0 +1,27 @@
+import { Toaster } from '@zipper/tw/ui';
+import React from 'react';
+import { DashboardHeader } from '~/components/app-dir/layouts/header-new';
+import { Link, Navbar } from '~/components/app-dir/layouts/navbar';
+
+const NAVBAR_LINKS: Link[] = [
+ { label: 'Applets', href: `/dashboard-new` },
+ { label: 'People', href: `/dashboard-new/people` },
+ { label: 'Settings', href: `/dashboard-new/settings` },
+];
+
+export default async function GalleryLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+
+
+
+
+
+ {children}
+
+
+ );
+}
diff --git a/apps/zipper.dev/src/app/dashboard-new/page.tsx b/apps/zipper.dev/src/app/dashboard-new/page.tsx
new file mode 100644
index 000000000..9207d8a42
--- /dev/null
+++ b/apps/zipper.dev/src/app/dashboard-new/page.tsx
@@ -0,0 +1,198 @@
+'use client';
+import { NextPageWithLayout } from '~/pages/_app';
+import { trpc } from '~/utils/trpc';
+import React, { useEffect, useMemo, useState } from 'react';
+import { AppOwner, useAppOwner } from '~/hooks/use-app-owner';
+import { RouterOutputs } from '~/utils/trpc';
+import { useOrganization } from '~/hooks/use-organization';
+import {
+ SortingState,
+ getFilteredRowModel,
+ getSortedRowModel,
+} from '@tanstack/react-table';
+import { AppletsTable } from './(components)/applets-table';
+import { APPLETS_TABLE_COLUMNS } from './(components)/applets-table/columns';
+import { Button, Input, List, Show } from '@zipper/tw/ui';
+import { FiTool, FiRadio } from 'react-icons/fi';
+import { PiPlusBold, PiRocket } from 'react-icons/pi';
+import Link from 'next/link';
+import EmptySlate from './(components)/empty';
+
+/* -------------------------------------------- */
+/* Constants */
+/* -------------------------------------------- */
+
+const ZIPPER_STEP_BY_STEP = [
+ {
+ description:
+ 'Use applets to quickly build tools for your team, with built-in auth, APIs and storage.',
+ icon: ,
+ },
+ {
+ description:
+ 'Create an applet from scratch, fork pre-built applets from the Gallery, or use AI to get a jumpstart on code.',
+ icon: ,
+ },
+ {
+ description: 'Share what you build with your team to boost productivity.',
+ icon: ,
+ },
+];
+
+/* -------------------------------------------- */
+/* Types */
+/* -------------------------------------------- */
+
+export type RouterApp = Unpack;
+
+export type App = RouterApp & {
+ createdByInfo: AppOwner;
+ updatedAt: Date;
+};
+
+/* -------------------------------------------- */
+/* Render */
+/* -------------------------------------------- */
+
+const Dashboard: NextPageWithLayout = () => {
+ /* ------------------ States ------------------ */
+ const [appSearchTerm, setAppSearchTerm] = useState('');
+ const [sorting, setSorting] = useState([]);
+
+ const [columnVisibility, setColumnVisibility] = useState<
+ Record
+ >({
+ description: false,
+ owner: false,
+ slug: false,
+ });
+
+ /* ------------------- Hooks ------------------ */
+ const { getAppOwner } = useAppOwner();
+ const { organization } = useOrganization();
+
+ /* ------------------ Queries ----------------- */
+ const { data: orgApps } = trpc.app.byAuthedUser.useQuery({
+ filterByOrganization: !appSearchTerm,
+ });
+
+ /** TO-DO: Add gallery apps carrousel */
+ const { data: galleryApps } = trpc.app.allApproved.useQuery(
+ {
+ amount: 6,
+ },
+ { enabled: (orgApps?.length as number) > 3 ?? false },
+ );
+
+ /* ------------------- Memos ------------------ */
+ const apps = useMemo(() => {
+ if (orgApps && orgApps?.length >= 1) {
+ return orgApps.map((app): App => {
+ const { createdAt, updatedAt, name, slug } = app;
+ const lastUpdatedAt = updatedAt || createdAt;
+ const appOwner = getAppOwner(app);
+
+ return {
+ ...app,
+ updatedAt: lastUpdatedAt,
+ name: name || slug,
+ createdByInfo: appOwner,
+ };
+ });
+ }
+
+ return [] as App[];
+ }, [orgApps, getAppOwner]);
+
+ const states = useMemo(
+ () => ({
+ globalFilter: appSearchTerm,
+ sorting,
+ columnVisibility,
+ }),
+ [appSearchTerm, sorting, columnVisibility],
+ );
+
+ /* ------------------ Effects ----------------- */
+ // useEffect(() => {
+ // appQuery.refetch();
+ // if (!organization && tabIndex > 1) setTabIndex(0);
+ // }, [organization]);
+
+ useEffect(() => {
+ setColumnVisibility({
+ description: false,
+ owner: !!appSearchTerm,
+ createdBy: !appSearchTerm,
+ slug: false,
+ });
+ }, [appSearchTerm]);
+
+ return (
+
+
+
+ Applets
+
+ Applets that you and other organization members have created within
+ this workspace.
+
+
+
+
+
+ New to Zipper? Here’s how it works:
+
+
+
+ {(props) => (
+
+
+ {React.cloneElement(props.icon, {
+ className: 'text-secondary text-lg',
+ })}
+
+ {props.description}
+
+ )}
+
+
+
+
+
+
+
setAppSearchTerm(e.target.value)}
+ />
+
+
+
+ Create Applet
+
+
+
+ = 1}
+ fallback={ }
+ >
+
+
+
+
+ );
+};
+
+export default Dashboard;
diff --git a/apps/zipper.dev/src/app/gallery-new/layout.tsx b/apps/zipper.dev/src/app/gallery-new/layout.tsx
new file mode 100644
index 000000000..f50e5b7bf
--- /dev/null
+++ b/apps/zipper.dev/src/app/gallery-new/layout.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import { GalleryHeader } from '~/components/app-dir/layouts/header-new';
+
+export default async function GalleryLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+
+
+ {children}
+
+ );
+}
diff --git a/apps/zipper.dev/src/app/gallery-new/page.tsx b/apps/zipper.dev/src/app/gallery-new/page.tsx
new file mode 100644
index 000000000..46f9f2eb6
--- /dev/null
+++ b/apps/zipper.dev/src/app/gallery-new/page.tsx
@@ -0,0 +1,57 @@
+import { Show } from '@zipper/tw/ui/modules/show';
+import { List } from '@zipper/tw/ui/modules/list';
+
+import { AnalyticsHead } from '@zipper/utils';
+import React from 'react';
+import { Navbar } from '~/components/app-dir/layouts/navbar';
+import { AppletCard } from '~/components/app-dir/modules/applet/card';
+import { GalleryCategories } from '~/components/app-dir/modules/gallery/components/categories';
+import { GalleryFAQ } from '~/components/app-dir/modules/gallery/components/faq';
+import { api } from '~/trpc/server';
+
+const LINKS = [
+ { label: 'Applets', href: '/gallery-new' },
+ { label: 'Saved Applets', href: '/gallery-new/saved', disabled: true },
+];
+
+export default async function GalleryPage() {
+ const galleryApps = await api.app.allApproved.query();
+
+ return (
+
+
+
+ Ziplets Gallery
+
+
+
+
+
+ Wander through some of the applets we've built to show you what's
+ possible with Zipper.
+
+
+ If something sparks your interest, you can fork it or just browse
+ through the code to see how it works.
+
+
+
+ categories
+
+
+
+
+
+
+
+ 0}>
+
+ {(props) => }
+
+
+
+
+
+
+ );
+}
diff --git a/apps/zipper.dev/src/app/layout.tsx b/apps/zipper.dev/src/app/layout.tsx
new file mode 100644
index 000000000..6bab60e7d
--- /dev/null
+++ b/apps/zipper.dev/src/app/layout.tsx
@@ -0,0 +1,40 @@
+import '@zipper/ui/src/globals.css';
+
+import { Inter } from 'next/font/google';
+import { cookies } from 'next/headers';
+import Header from '~/components/app-dir/layouts/header';
+
+import { TRPCReactProvider } from '~/server/react';
+import SessionProvider from '~/components/app-dir/SessionProvider';
+
+import { getServerAuthSession } from '../pages/api/auth/[...nextauth]';
+import { Providers } from './providers';
+
+const inter = Inter({
+ subsets: ['latin'],
+ variable: '--font-sans',
+});
+
+export default async function RootLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ const session = await getServerAuthSession();
+
+ return (
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+
+ );
+}
diff --git a/apps/zipper.dev/src/app/providers.tsx b/apps/zipper.dev/src/app/providers.tsx
new file mode 100644
index 000000000..7283f7746
--- /dev/null
+++ b/apps/zipper.dev/src/app/providers.tsx
@@ -0,0 +1,47 @@
+'use client';
+
+import { ChakraProvider } from '@chakra-ui/react';
+import { theme } from '@zipper/ui';
+import { extendTheme } from '@chakra-ui/react';
+import localFont from 'next/font/local';
+import { ThemeProvider } from '~/components/theme-provider';
+
+const plaak = localFont({
+ src: [
+ {
+ path: '../../public/fonts/plaak/Plaak - 26-Ney-Light-205TF.otf',
+ weight: '300',
+ style: 'normal',
+ },
+ {
+ path: '../../public/fonts/plaak/Plaak - 36-Ney-Regular-205TF.otf',
+ weight: '400',
+ style: 'normal',
+ },
+ {
+ path: '../../public/fonts/plaak/Plaak - 46-Ney-Bold-205TF.otf',
+ weight: '700',
+ style: 'normal',
+ },
+ {
+ path: '../../public/fonts/plaak/Plaak - 56-Ney-Heavy-205TF.otf',
+ weight: '900',
+ style: 'normal',
+ },
+ ],
+});
+
+const _theme = extendTheme({
+ ...theme,
+ fonts: {
+ plaak: plaak.style.fontFamily,
+ },
+});
+
+export function Providers({ children }: { children: React.ReactNode }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/apps/zipper.dev/src/app/trpc/[trpc]/route.ts b/apps/zipper.dev/src/app/trpc/[trpc]/route.ts
new file mode 100644
index 000000000..26f4112ce
--- /dev/null
+++ b/apps/zipper.dev/src/app/trpc/[trpc]/route.ts
@@ -0,0 +1,35 @@
+import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
+import { NextResponse, type NextRequest } from 'next/server';
+
+// import { env } from '@/env';
+import { trpcRouter as appRouter } from '~/server/routers/_app';
+import { createTRPCContext } from '~/server/root';
+import { CreateNextContextOptions } from '@trpc/server/adapters/next';
+
+/**
+ * This wraps the `createTRPCContext` helper and provides the required context for the tRPC API when
+ * handling a HTTP request (e.g. when you make requests from Client Components).
+ */
+const createContext = async (args: CreateNextContextOptions) => {
+ return createTRPCContext({ ...args });
+};
+
+const handler = (req: NextRequest, res: NextResponse) =>
+ fetchRequestHandler({
+ endpoint: '/api/trpc',
+ req,
+ router: appRouter,
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ //@ts-ignore
+ createContext: async () => await createContext({ req, res }),
+ onError:
+ process.env.NODE_ENV === 'development'
+ ? ({ path, error }) => {
+ console.error(
+ `❌ tRPC failed on ${path ?? ''}: ${error.message}`,
+ );
+ }
+ : undefined,
+ });
+
+export { handler as GET, handler as POST };
diff --git a/apps/zipper.dev/src/components/app-dir/SessionProvider.tsx b/apps/zipper.dev/src/components/app-dir/SessionProvider.tsx
new file mode 100644
index 000000000..57b5c74cf
--- /dev/null
+++ b/apps/zipper.dev/src/components/app-dir/SessionProvider.tsx
@@ -0,0 +1,3 @@
+'use client';
+import { SessionProvider } from 'next-auth/react';
+export default SessionProvider;
diff --git a/apps/zipper.dev/src/components/app-dir/auth/profile-button.tsx b/apps/zipper.dev/src/components/app-dir/auth/profile-button.tsx
index 2029df25c..f7b73a666 100644
--- a/apps/zipper.dev/src/components/app-dir/auth/profile-button.tsx
+++ b/apps/zipper.dev/src/components/app-dir/auth/profile-button.tsx
@@ -1,5 +1,5 @@
'use client';
-import { Dropdown, Button, Avatar, Show } from '@zipper/ui';
+import { Dropdown, Button, Avatar } from '@zipper/ui';
import React, { ReactNode, useCallback, useState } from 'react';
import { signIn, signOut } from 'next-auth/react';
import { SignedIn, SignedOut } from './user-status';
@@ -25,6 +25,7 @@ import {
PiLifebuoyDuotone,
PiSignOutDuotone,
} from 'react-icons/pi';
+import { Show } from '@zipper/tw/ui/modules/show';
const SettingsDialog: React.FC<{ isOpen: boolean; onClose: () => void }> = (
settingsModal,
diff --git a/apps/zipper.dev/src/components/app-dir/auth/signed.tsx b/apps/zipper.dev/src/components/app-dir/auth/signed.tsx
new file mode 100644
index 000000000..7d3d694b9
--- /dev/null
+++ b/apps/zipper.dev/src/components/app-dir/auth/signed.tsx
@@ -0,0 +1,18 @@
+import { FC } from 'react';
+import { useUser } from '~/hooks/use-user';
+
+interface Props {
+ children?: React.ReactNode;
+}
+
+export const SignedIn: FC = (props) => {
+ const { isSignedIn } = useUser();
+
+ return <>{isSignedIn && <>{props.children}>}>;
+};
+
+export const SignedOut: FC = (props) => {
+ const { isSignedIn, isLoaded } = useUser();
+
+ return <>{isLoaded && !isSignedIn && <>{props.children}>}>;
+};
diff --git a/apps/zipper.dev/src/components/app-dir/layouts/header-new.tsx b/apps/zipper.dev/src/components/app-dir/layouts/header-new.tsx
new file mode 100644
index 000000000..1fb377283
--- /dev/null
+++ b/apps/zipper.dev/src/components/app-dir/layouts/header-new.tsx
@@ -0,0 +1,376 @@
+'use client';
+import { useBreakpointValue, useDisclosure } from '@chakra-ui/react';
+import { ChevronRightIcon } from '@radix-ui/react-icons';
+import { cn } from '@zipper/tw/cn';
+import {
+ Divider,
+ Show,
+ Dropdown,
+ Badge,
+ List,
+ Button,
+ ZipperSymbol,
+ Tooltip,
+} from '@zipper/tw/ui';
+import { usePathname } from 'next/navigation';
+import React, { useMemo } from 'react';
+import { FiEye } from 'react-icons/fi';
+import { HiOutlineChevronUpDown } from 'react-icons/hi2';
+import { CreateOrganizationModal } from '~/components/auth/createOrganizationModal';
+import { useOrganization } from '~/hooks/use-organization';
+import { useOrganizationList } from '~/hooks/use-organization-list';
+import { useUser } from '~/hooks/use-user';
+import NextLink from 'next/link';
+import { SignedIn, SignedOut } from '../auth/signed';
+import { FeedbackModal } from '~/components/auth/feedback-modal';
+import { ProfileButton } from '../auth/profile-button';
+import { MobileMenu } from '~/components/header-mobile-menu';
+
+/* -------------------------------------------- */
+/* Constants */
+/* -------------------------------------------- */
+
+const ROUTES = {
+ DASHBOARD: [
+ { label: 'Gallery', path: '/gallery-new' },
+ { label: 'Changelog', path: '/changelog' },
+ { label: 'Docs', path: '/docs' },
+ ],
+ LANDING: [
+ { label: 'Gallery', path: '/gallery-new' },
+ { label: 'About', path: '/about' },
+ { label: 'Changelog', path: '/changelog' },
+ { label: 'Docs', path: '/docs' },
+ { label: 'Blog', path: '/blog' },
+ ],
+};
+
+/* -------------------------------------------- */
+/* Components */
+/* -------------------------------------------- */
+
+const OrganizationSwitcher: React.FC = () => {
+ const { organization, role } = useOrganization();
+ const { user } = useUser();
+ const { setActive, organizationList, currentOrganizationId } =
+ useOrganizationList();
+
+ const OTHER_ORGANIZATIONS = useMemo(
+ () =>
+ organizationList.filter((o) => {
+ return o.organization.id !== (currentOrganizationId || null);
+ }),
+ [organizationList, organization],
+ );
+
+ const USER_ROLE = useMemo(
+ () => (role === 'admin' ? 'Admin' : 'Member'),
+ [role],
+ );
+
+ const {
+ isOpen: isOpenCreateOrg,
+ onOpen: onOpenCreateOrg,
+ onClose: onCloseCreateOrg,
+ } = useDisclosure();
+
+ return (
+
+
+
+
+ {organization?.name ?? user?.username}
+
+
+
+
+
+
+
+
+
+ {organization?.name || 'Personal Workspace'}
+
+ {user?.username} }
+ >
+ {USER_ROLE}
+
+
+
+
+
+ Profile
+
+
+
+
+ Switch workspace:
+
+ {(org) => (
+
+ org.pending
+ ? window.location.replace(
+ `${window.location.host}/${org.organization.slug}`,
+ )
+ : await setActive?.(org.organization.id)
+ }
+ className="group cursor-pointer flex items-center justify-between"
+ >
+ {org.organization.name}
+
+ }
+ >
+ Invited
+
+
+ )}
+
+
+
+ Create Organization
+
+
+
+
+
+
+
+ );
+};
+
+const ZipperBetaLogo = () => {
+ return (
+
+
+
+
+ {/* ZipperSymbol should be adapted or replaced with TailwindCSS styled component. Custom styles may be required */}
+
+
+
+ Beta
+
+
+
+ Go to Dashboard
+
+
+ );
+};
+
+/* -------------------------------------------- */
+/* Root */
+/* -------------------------------------------- */
+
+interface RootHeaderProps extends React.HTMLAttributes {
+ showDivider?: boolean;
+}
+
+const RootHeader: React.FC = ({
+ className,
+ children,
+ showDivider,
+ ...props
+}) => (
+
+);
+
+/* -------------------------------------------- */
+/* Gallery */
+/* -------------------------------------------- */
+
+export const GalleryHeader: React.FC = () => {
+ const pathname = usePathname();
+ const feedbackModal = useDisclosure();
+ const isTablet = useBreakpointValue({ base: false, md: true });
+
+ return (
+
+
+
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {(props) => {
+ const isActive = props.path === pathname;
+ const textDecoration = isActive
+ ? 'border-b border-foreground'
+ : 'none';
+
+ return (
+
+ {props.label}
+
+ );
+ }}
+
+
+
+
+ Feedback
+
+
+
+
+
+
+
+ {!isTablet && (
+
+ )}
+
+ );
+};
+
+/* -------------------------------------------- */
+/* Dashboard */
+/* -------------------------------------------- */
+
+export const DashboardHeader: React.FC = () => {
+ const pathname = usePathname();
+ const feedbackModal = useDisclosure();
+ const isTablet = useBreakpointValue({ base: false, md: true });
+
+ return (
+
+
+
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {(props) => {
+ const isActive = props.path === pathname;
+ const textDecoration = isActive
+ ? 'border-b border-foreground'
+ : 'none';
+
+ return (
+
+ {props.label}
+
+ );
+ }}
+
+
+
+
+ Feedback
+
+
+
+
+
+
+
+ {!isTablet && (
+
+ )}
+
+ );
+};
+
+/* -------------------------------------------- */
+/* Playground */
+/* -------------------------------------------- */
+
+export const PlaygroundHeader: React.FC = () => {
+ return ;
+};
+
+/* -------------------------------------------- */
+/* Main */
+/* -------------------------------------------- */
+
+export type HeaderComponent = typeof RootHeader & {
+ Gallery: typeof GalleryHeader;
+ Dashboard: typeof DashboardHeader;
+ Playground: typeof PlaygroundHeader;
+};
+
+export const Header = RootHeader as HeaderComponent;
+
+Header.Gallery = GalleryHeader;
+Header.Dashboard = DashboardHeader;
+Header.Playground = PlaygroundHeader;
diff --git a/apps/zipper.dev/src/components/app-dir/layouts/header.tsx b/apps/zipper.dev/src/components/app-dir/layouts/header.tsx
index 707cbf582..a27d365b8 100644
--- a/apps/zipper.dev/src/components/app-dir/layouts/header.tsx
+++ b/apps/zipper.dev/src/components/app-dir/layouts/header.tsx
@@ -11,7 +11,6 @@ import {
Button,
Dropdown,
List,
- Show,
ZipperLogo,
ZipperSymbol,
} from '@zipper/ui';
@@ -24,6 +23,7 @@ import { useOrganizationList } from '~/hooks/use-organization-list';
import { HiOutlineChevronUpDown } from 'react-icons/hi2';
import { ChevronRightIcon } from '@radix-ui/react-icons';
import { CreateOrganizationModal } from '~/components/auth/createOrganizationModal';
+import { Show } from '@zipper/tw/ui/modules/show';
/* -------------------------------------------- */
/* Constants */
@@ -37,6 +37,21 @@ const DASHBOARD_ROUTES = [
{ href: '/blog', text: 'Blog' },
];
+const ROUTES = {
+ DASHBOARD: [
+ { label: 'Gallery', path: '/gallery-new' },
+ { label: 'Changelog', path: '/changelog' },
+ { label: 'Docs', path: '/docs' },
+ ],
+ LANDING: [
+ { label: 'Gallery', path: '/gallery-new' },
+ { label: 'About', path: '/about' },
+ { label: 'Changelog', path: '/changelog' },
+ { label: 'Docs', path: '/docs' },
+ { label: 'Blog', path: '/blog' },
+ ],
+};
+
/* -------------------------------------------- */
/* Components */
/* -------------------------------------------- */
@@ -276,7 +291,7 @@ const Header: React.FC = ({
{!isTablet && (
)}
diff --git a/apps/zipper.dev/src/components/app-dir/layouts/navbar.tsx b/apps/zipper.dev/src/components/app-dir/layouts/navbar.tsx
index 2fcacef60..eee617f84 100644
--- a/apps/zipper.dev/src/components/app-dir/layouts/navbar.tsx
+++ b/apps/zipper.dev/src/components/app-dir/layouts/navbar.tsx
@@ -1,7 +1,11 @@
'use client';
-import { cn, List, Show } from '@zipper/ui';
+import { cn } from '@zipper/tw/cn';
+import { Show } from '@zipper/tw/ui/modules/show';
+import { List } from '@zipper/tw/ui/modules/list';
+
import Link from 'next/link';
-import { useRouter } from 'next/router';
+
+import { usePathname } from 'next/navigation';
import React from 'react';
export type Link = {
@@ -44,12 +48,12 @@ interface NavbarProps {
}
export const Navbar: React.FC = ({ links }) => {
- const { asPath } = useRouter();
+ const pathname = usePathname();
return (
- {(props) => }
+ {(props) => }
diff --git a/apps/zipper.dev/src/components/app-dir/modules/applet/card.tsx b/apps/zipper.dev/src/components/app-dir/modules/applet/card.tsx
index ac662652c..7583e747d 100644
--- a/apps/zipper.dev/src/components/app-dir/modules/applet/card.tsx
+++ b/apps/zipper.dev/src/components/app-dir/modules/applet/card.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { Button, cn, Show } from '@zipper/ui';
import Link from 'next/link';
import React, { useState } from 'react';
diff --git a/apps/zipper.dev/src/components/app-dir/modules/dashboard/components/applets-table/columns.tsx b/apps/zipper.dev/src/components/app-dir/modules/dashboard/components/applets-table/columns.tsx
index 6160e5272..04b9658d7 100644
--- a/apps/zipper.dev/src/components/app-dir/modules/dashboard/components/applets-table/columns.tsx
+++ b/apps/zipper.dev/src/components/app-dir/modules/dashboard/components/applets-table/columns.tsx
@@ -3,7 +3,7 @@ import { App } from '../../page';
import Link from 'next/link';
import { getEditAppletLink } from '@zipper/utils';
import { createColumnHelper } from '@tanstack/react-table';
-import { Button, Show, Tooltip } from '@zipper/ui';
+import { Button, Tooltip } from '@zipper/ui';
import {
PiBuildings,
PiLockSimple,
@@ -13,6 +13,7 @@ import {
import React from 'react';
import { ResourceOwnerType } from '@zipper/types';
import { CaretSortIcon } from '@radix-ui/react-icons';
+import { Show } from '@zipper/tw/ui/modules/show';
const columnHelper = createColumnHelper();
diff --git a/apps/zipper.dev/src/components/app-dir/modules/dashboard/components/settings-nav.tsx b/apps/zipper.dev/src/components/app-dir/modules/dashboard/components/settings-nav.tsx
index e13223461..10f53a915 100644
--- a/apps/zipper.dev/src/components/app-dir/modules/dashboard/components/settings-nav.tsx
+++ b/apps/zipper.dev/src/components/app-dir/modules/dashboard/components/settings-nav.tsx
@@ -30,7 +30,7 @@ function DashboardSettingsNav(
return (
({
name: generateDefaultSlug(),
@@ -68,7 +68,7 @@ const CreateFormSchema = z.object({
const DashboardCreateZiplet: NextPageWithLayout = () => {
/* ------------------- Hooks ------------------ */
const createAppForm = useForm>({
- resolver: zodResolver(CreateFormSchema),
+ resolver: zodResolver(CreateFormSchema as any),
defaultValues: getDefaultCreateAppFormValues(),
});
diff --git a/apps/zipper.dev/src/components/app-dir/modules/dashboard/routes/members.tsx b/apps/zipper.dev/src/components/app-dir/modules/dashboard/routes/members.tsx
index 191173e81..35cecc86e 100644
--- a/apps/zipper.dev/src/components/app-dir/modules/dashboard/routes/members.tsx
+++ b/apps/zipper.dev/src/components/app-dir/modules/dashboard/routes/members.tsx
@@ -10,7 +10,6 @@ import {
Label,
List,
ShadSelect,
- Show,
Table,
} from '@zipper/ui';
import { useOrganization } from '~/hooks/use-organization';
@@ -21,6 +20,7 @@ import { useUser } from '~/hooks/use-user';
import { trpc } from '~/utils/trpc';
import { toast } from 'sonner';
import { ReloadIcon } from '@radix-ui/react-icons';
+import { Show } from '@zipper/tw/ui/modules/show';
/* -------------------------------------------- */
/* Types */
diff --git a/apps/zipper.dev/src/components/app-dir/modules/gallery/components/categories.tsx b/apps/zipper.dev/src/components/app-dir/modules/gallery/components/categories.tsx
index 6ed88437b..e0ade5d55 100644
--- a/apps/zipper.dev/src/components/app-dir/modules/gallery/components/categories.tsx
+++ b/apps/zipper.dev/src/components/app-dir/modules/gallery/components/categories.tsx
@@ -21,12 +21,16 @@ const GalleryCategories: React.FC = () => {
return (
{(props, index) => {
- const cateogory = searchParams.get('category');
+ const cateogory = searchParams?.get('category');
const isActive = cateogory === props.type;
return (
{
return (
-
+
What are Applets?
@@ -14,7 +14,7 @@ const GalleryFAQ: React.FC = () => {
-
+
What is Zipper?
diff --git a/apps/zipper.dev/src/components/app-dir/modules/gallery/page.tsx b/apps/zipper.dev/src/components/app-dir/modules/gallery/page.tsx
index 80ae92180..d0cfe47fe 100644
--- a/apps/zipper.dev/src/components/app-dir/modules/gallery/page.tsx
+++ b/apps/zipper.dev/src/components/app-dir/modules/gallery/page.tsx
@@ -1,5 +1,5 @@
'use client';
-import { List, Show } from '@zipper/ui';
+import { List } from '@zipper/ui';
import Header from '~/components/app-dir/layouts/header';
import { AppletCard } from '~/components/app-dir/modules/applet/card';
import { GalleryCategories } from '~/components/app-dir/modules/gallery/components/categories';
@@ -15,6 +15,7 @@ import { trpcRouter } from '~/server/routers/_app';
import SuperJSON from 'superjson';
import { createContext } from '~/server/context';
import { AnalyticsHead } from '@zipper/utils';
+import { Show } from '@zipper/tw/ui/modules/show';
const LINKS = [
{ label: 'Applets', href: '/gallery-test' },
diff --git a/apps/zipper.dev/src/components/auth/createOrganizationModal.tsx b/apps/zipper.dev/src/components/auth/createOrganizationModal.tsx
index ad5602dcf..28399d104 100644
--- a/apps/zipper.dev/src/components/auth/createOrganizationModal.tsx
+++ b/apps/zipper.dev/src/components/auth/createOrganizationModal.tsx
@@ -1,3 +1,4 @@
+'use client';
import {
Modal,
ModalOverlay,
@@ -37,8 +38,6 @@ export const CreateOrganizationModal = ({
isOpen: boolean;
onClose: () => void;
}) => {
- const router = useRouter();
-
const { setActive, createOrganization } = useOrganizationList();
const [organizationName, setOrganizationName] = useState('');
diff --git a/apps/zipper.dev/src/components/auth/user-profile-button.tsx b/apps/zipper.dev/src/components/auth/user-profile-button.tsx
index d8fda885b..799febe0d 100644
--- a/apps/zipper.dev/src/components/auth/user-profile-button.tsx
+++ b/apps/zipper.dev/src/components/auth/user-profile-button.tsx
@@ -1,3 +1,4 @@
+'use client';
import {
Menu,
MenuButton,
diff --git a/apps/zipper.dev/src/components/context/editor-context.tsx b/apps/zipper.dev/src/components/context/editor-context.tsx
index 9c8387a6a..7ade8ec61 100644
--- a/apps/zipper.dev/src/components/context/editor-context.tsx
+++ b/apps/zipper.dev/src/components/context/editor-context.tsx
@@ -1,3 +1,4 @@
+'use client';
import { Script } from '@prisma/client';
import * as monaco from 'monaco-editor';
import { EditorProps, Monaco } from '@monaco-editor/react';
@@ -958,4 +959,5 @@ const EditorContextProvider = ({
};
export const useEditorContext = () => useContext(EditorContext);
+
export default EditorContextProvider;
diff --git a/apps/zipper.dev/src/components/dashboard/index.tsx b/apps/zipper.dev/src/components/dashboard/index.tsx
index 5c5157b40..bf58a884f 100644
--- a/apps/zipper.dev/src/components/dashboard/index.tsx
+++ b/apps/zipper.dev/src/components/dashboard/index.tsx
@@ -1,4 +1,5 @@
-import { RouterOutputs, trpc } from '~/utils/trpc';
+import { RouterOutputs } from '~/utils/trpc';
+import { api as trpc } from '~/server/react';
import {
TableContainer,
Text,
diff --git a/apps/zipper.dev/src/components/gallery/index.tsx b/apps/zipper.dev/src/components/gallery/index.tsx
index ccdebf59a..ec264946e 100644
--- a/apps/zipper.dev/src/components/gallery/index.tsx
+++ b/apps/zipper.dev/src/components/gallery/index.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import {
Heading,
VStack,
@@ -145,6 +147,7 @@ export function Gallery({
Accept Invitation
)}
+
{isPublicGallery && (
<>
@@ -165,45 +168,6 @@ export function Gallery({
- {/*
-
-
-
- What are Applets?
-
-
-
-
- Applets are web-services that have been built and deployed
- on Zipper. Applets can be forked and customized to your
- needs.
-
-
-
-
-
-
- What is Zipper?
-
-
-
-
- Zipper is a platform for building web services using simple
- Typescript functions. We take care of UI, APIs, and auth for
- you.
-
-
- */}
>
)}
diff --git a/apps/zipper.dev/src/components/header-mobile-menu.tsx b/apps/zipper.dev/src/components/header-mobile-menu.tsx
index abb43ca56..d9f42f6d7 100644
--- a/apps/zipper.dev/src/components/header-mobile-menu.tsx
+++ b/apps/zipper.dev/src/components/header-mobile-menu.tsx
@@ -1,3 +1,4 @@
+'use client';
import {
Menu,
MenuButton,
@@ -6,11 +7,11 @@ import {
MenuItem,
UseDisclosureReturn,
} from '@chakra-ui/react';
-import { useRouter } from 'next/router';
+import { useRouter } from 'next/navigation';
import { FiMinimize2, FiMenu } from 'react-icons/fi';
import { FeedbackModal } from './auth/feedback-modal';
-export type NavRoutes = { href: string; text: string };
+export type NavRoutes = { path: string; label: string };
type MobileMenuProps = {
navRoutes: NavRoutes[];
@@ -42,8 +43,8 @@ export const MobileMenu: React.FC = ({
{navRoutes.map((r) => {
return (
- router.push(r.href)}>
- {r.text}
+ router.push(r.path)}>
+ {r.label}
);
})}
diff --git a/apps/zipper.dev/src/components/playground/playground-sidebar.tsx b/apps/zipper.dev/src/components/playground/playground-sidebar.tsx
index acb2b70f5..2faa62c36 100644
--- a/apps/zipper.dev/src/components/playground/playground-sidebar.tsx
+++ b/apps/zipper.dev/src/components/playground/playground-sidebar.tsx
@@ -43,8 +43,9 @@ import {
isLib,
isConnector,
} from '~/utils/playground.utils';
-import { Markdown, Show } from '@zipper/ui';
+import { Markdown } from '@zipper/ui';
import { getFileExtension } from '@zipper/utils';
+import { Show } from '@zipper/tw/ui/modules/show';
// Order should always be:
// - README.md
diff --git a/apps/zipper.dev/src/components/playground/tab-schedules.tsx b/apps/zipper.dev/src/components/playground/tab-schedules.tsx
index 7a0fe6417..22ce974ea 100644
--- a/apps/zipper.dev/src/components/playground/tab-schedules.tsx
+++ b/apps/zipper.dev/src/components/playground/tab-schedules.tsx
@@ -3,7 +3,6 @@ import {
VStack,
useDisclosure,
HStack,
- Icon,
IconButton,
Text,
Heading,
@@ -31,8 +30,6 @@ import {
} from './add-schedule-modal';
import { Avatar } from '../avatar';
import { TITLE_COLUMN_MIN_WIDTH } from './constants';
-import { HiPencil } from 'react-icons/hi';
-import Link from 'next/link';
const tableHeaderStyles: ChakraProps = {
fontWeight: 'normal',
diff --git a/apps/zipper.dev/src/emails/index.tsx b/apps/zipper.dev/src/emails/index.tsx
index ac749b337..cfb4c1ac7 100644
--- a/apps/zipper.dev/src/emails/index.tsx
+++ b/apps/zipper.dev/src/emails/index.tsx
@@ -37,13 +37,7 @@ export const MagicLinkEmail = ({ loginUrl, token }: MagicLinkEmailProps) => (
Your login link for Zipper
@@ -87,13 +81,7 @@ export const InvitationEmail = ({
diff --git a/apps/zipper.dev/src/pages/[resource-owner]/[app-slug]/[...playground].tsx b/apps/zipper.dev/src/pages/[resource-owner]/[app-slug]/[...playground].tsx
index 1dc4ae1c8..e167059d5 100644
--- a/apps/zipper.dev/src/pages/[resource-owner]/[app-slug]/[...playground].tsx
+++ b/apps/zipper.dev/src/pages/[resource-owner]/[app-slug]/[...playground].tsx
@@ -4,6 +4,7 @@ import { TRPCError } from '@trpc/server';
import { NOT_FOUND, UNAUTHORIZED } from '@zipper/utils';
import { GetServerSideProps, GetServerSidePropsContext } from 'next';
import Head from 'next/head';
+
import SuperJSON from 'superjson';
import SignedIn from '~/components/auth/signed-in';
import EditorContextProvider from '~/components/context/editor-context';
@@ -15,7 +16,8 @@ import { NextPageWithLayout } from '~/pages/_app';
import { createContext } from '~/server/context';
import { trpcRouter } from '~/server/routers/_app';
import { parsePlaygroundQuery, Props } from '~/utils/playground.utils';
-import { trpc } from '~/utils/trpc';
+
+import { api as trpc } from '~/server/react';
const PlaygroundPage: NextPageWithLayout = ({
resourceOwnerSlug,
@@ -99,11 +101,12 @@ export const getServerSideProps: GetServerSideProps = async ({
res,
query,
}: GetServerSidePropsContext) => {
+ const ctx = await createContext({ req, res });
const props = parsePlaygroundQuery(query);
const ssg = createServerSideHelpers({
router: trpcRouter,
transformer: SuperJSON,
- ctx: await createContext({ req, res }),
+ ctx,
});
try {
@@ -128,7 +131,6 @@ export const getServerSideProps: GetServerSideProps = async ({
return { props: { ...props, trpcState: ssg.dehydrate() } };
};
-PlaygroundPage.skipAuth = true;
PlaygroundPage.header = () => <>>;
PlaygroundPage.getLayout = (page) => (
>} p="0" h="full" w="full">
diff --git a/apps/zipper.dev/src/pages/api/auth/[...nextauth].ts b/apps/zipper.dev/src/pages/api/auth/[...nextauth].ts
index 543886c1b..6f674eb4c 100644
--- a/apps/zipper.dev/src/pages/api/auth/[...nextauth].ts
+++ b/apps/zipper.dev/src/pages/api/auth/[...nextauth].ts
@@ -1,4 +1,9 @@
-import NextAuth, { AuthOptions, Session, SessionStrategy } from 'next-auth';
+import NextAuth, {
+ AuthOptions,
+ getServerSession,
+ Session,
+ SessionStrategy,
+} from 'next-auth';
import GithubProvider from 'next-auth/providers/github';
import GoogleProvider from 'next-auth/providers/google';
import EmailProvider, {
@@ -539,3 +544,5 @@ export interface SessionOrganization {
name: string;
slug: string;
}
+
+export const getServerAuthSession = () => getServerSession(authOptions);
diff --git a/apps/zipper.dev/src/pages/gallery/index.tsx b/apps/zipper.dev/src/pages/gallery/index.tsx
index af1690ad6..04f214e15 100644
--- a/apps/zipper.dev/src/pages/gallery/index.tsx
+++ b/apps/zipper.dev/src/pages/gallery/index.tsx
@@ -1,7 +1,8 @@
import { NextPageWithLayout } from '~/pages/_app';
import React from 'react';
import { Gallery } from '~/components/gallery';
-import { trpc } from '~/utils/trpc';
+import { api as trpc } from '~/trpc/react';
+
import NextError from 'next/error';
import { GetServerSideProps } from 'next';
import { createServerSideHelpers } from '@trpc/react-query/server';
diff --git a/apps/zipper.dev/src/server/context.ts b/apps/zipper.dev/src/server/context.ts
index 3fca77932..34ed4278a 100644
--- a/apps/zipper.dev/src/server/context.ts
+++ b/apps/zipper.dev/src/server/context.ts
@@ -10,6 +10,7 @@ import {
} from 'next';
import { getServerSession, Session } from 'next-auth';
+
import { authOptions } from '../pages/api/auth/[...nextauth]';
type RequestLike = GetServerSidePropsContext['req'] | NextApiRequest;
@@ -22,7 +23,7 @@ type ResponseLike = NextApiResponse | ServerResponse;
export const createContextInner = ({
userId,
orgId,
- organizations,
+ organizations = {},
req,
session,
}: {
@@ -32,7 +33,14 @@ export const createContextInner = ({
req?: RequestLike;
session?: Session;
}) => {
- return { userId, orgId, organizations, req, session };
+ return {
+ userId,
+ orgId,
+ organizations,
+ req,
+ session,
+ headers: new Headers(),
+ };
};
/**
@@ -46,6 +54,7 @@ export async function createContext(opts: {
const getAuthAndCreateContext = async () => {
const session =
(await getServerSession(opts.req, opts.res, authOptions)) || undefined;
+ // Initialize orgMems as an empty record if organizationMemberships is not defined
const orgMems: Record = {};
session?.organizationMemberships?.forEach((m) => {
orgMems[m.organization.id] = m.role;
diff --git a/apps/zipper.dev/src/server/react.tsx b/apps/zipper.dev/src/server/react.tsx
new file mode 100644
index 000000000..f129ff643
--- /dev/null
+++ b/apps/zipper.dev/src/server/react.tsx
@@ -0,0 +1,48 @@
+'use client';
+
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { loggerLink, unstable_httpBatchStreamLink } from '@trpc/client';
+import { createTRPCReact } from '@trpc/react-query';
+import { useState } from 'react';
+
+import { type AppRouter } from '~/server/routers/_app';
+import { getUrl, transformer } from '../trpc/shared';
+
+export const api = createTRPCReact();
+
+export function TRPCReactProvider(props: {
+ children: React.ReactNode;
+ cookies: string;
+}) {
+ const [queryClient] = useState(() => new QueryClient());
+
+ const [trpcClient] = useState(() =>
+ api.createClient({
+ transformer,
+ links: [
+ loggerLink({
+ enabled: (op) =>
+ process.env.NODE_ENV === 'development' ||
+ (op.direction === 'down' && op.result instanceof Error),
+ }),
+ unstable_httpBatchStreamLink({
+ url: getUrl(),
+ headers() {
+ return {
+ cookie: props.cookies,
+ 'x-trpc-source': 'react',
+ };
+ },
+ }),
+ ],
+ }),
+ );
+
+ return (
+
+
+ {props.children}
+
+
+ );
+}
diff --git a/apps/zipper.dev/src/server/root.ts b/apps/zipper.dev/src/server/root.ts
index 0340bd1b7..b9efce3f3 100644
--- a/apps/zipper.dev/src/server/root.ts
+++ b/apps/zipper.dev/src/server/root.ts
@@ -2,21 +2,35 @@ import { TRPCError, initTRPC } from '@trpc/server';
import superjson from 'superjson';
import { Context } from './context';
import { hasOrgAdminPermission } from './utils/authz.utils';
+import { ZodError } from 'zod';
+import { getSession } from 'next-auth/react';
+import { CreateNextContextOptions } from '@trpc/server/adapters/next';
+import { Session } from 'next-auth';
const t = initTRPC.context().create({
transformer: superjson,
- // Optional:
- // errorFormatter(opts) {
- // const { shape } = opts;
- // return {
- // ...shape,
- // data: {
- // ...shape.data,
- // },
- // };
- // },
+ errorFormatter({ shape, error }) {
+ return {
+ ...shape,
+ data: {
+ ...shape.data,
+ zodError:
+ error.cause instanceof ZodError ? error.cause.flatten() : null,
+ },
+ };
+ },
});
+export const createTRPCContext = async (
+ opts: Partial,
+) => {
+ const session = await getSession({ req: opts.req });
+
+ return {
+ session,
+ };
+};
+
const enforceAuth = t.middleware(({ ctx, next }) => {
if (!ctx.userId) {
throw new TRPCError({ code: 'UNAUTHORIZED' });
diff --git a/apps/zipper.dev/src/server/utils/omni.utils.ts b/apps/zipper.dev/src/server/utils/omni.utils.ts
index a5a124cdc..4bec4823a 100644
--- a/apps/zipper.dev/src/server/utils/omni.utils.ts
+++ b/apps/zipper.dev/src/server/utils/omni.utils.ts
@@ -177,7 +177,8 @@ export const createOmniApiHandler =
export const getOmniContext = (req: NextApiRequest): Context => ({
userId: OMNI_USER_ID,
orgId: undefined,
- organizations: undefined,
+ organizations: undefined as any,
req,
session: undefined,
+ headers: undefined as any,
});
diff --git a/apps/zipper.dev/src/trpc/react.tsx b/apps/zipper.dev/src/trpc/react.tsx
new file mode 100644
index 000000000..98360a4a9
--- /dev/null
+++ b/apps/zipper.dev/src/trpc/react.tsx
@@ -0,0 +1,48 @@
+'use client';
+
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { loggerLink, unstable_httpBatchStreamLink } from '@trpc/client';
+import { createTRPCReact } from '@trpc/react-query';
+import { useState } from 'react';
+
+import { type AppRouter } from '~/server/routers/_app';
+import { getUrl, transformer } from '~/trpc/shared';
+
+export const api = createTRPCReact();
+
+export function TRPCReactProvider(props: {
+ children: React.ReactNode;
+ cookies: string;
+}) {
+ const [queryClient] = useState(() => new QueryClient());
+
+ const [trpcClient] = useState(() =>
+ api.createClient({
+ transformer,
+ links: [
+ loggerLink({
+ enabled: (op) =>
+ process.env.NODE_ENV === 'development' ||
+ (op.direction === 'down' && op.result instanceof Error),
+ }),
+ unstable_httpBatchStreamLink({
+ url: getUrl(),
+ headers() {
+ return {
+ cookie: props.cookies,
+ 'x-trpc-source': 'react',
+ };
+ },
+ }),
+ ],
+ }),
+ );
+
+ return (
+
+
+ {props.children}
+
+
+ );
+}
diff --git a/apps/zipper.dev/src/trpc/server.ts b/apps/zipper.dev/src/trpc/server.ts
new file mode 100644
index 000000000..42917e0d7
--- /dev/null
+++ b/apps/zipper.dev/src/trpc/server.ts
@@ -0,0 +1,67 @@
+import 'server-only';
+
+import {
+ createTRPCProxyClient,
+ loggerLink,
+ TRPCClientError,
+} from '@trpc/client';
+import { callProcedure } from '@trpc/server';
+import { observable } from '@trpc/server/observable';
+import { type TRPCErrorResponse } from '@trpc/server/rpc';
+import { cookies } from 'next/headers';
+import { cache } from 'react';
+
+import { trpcRouter as appRouter, type AppRouter } from '~/server/routers/_app';
+import { createTRPCContext } from '~/server/root';
+import { transformer } from './shared';
+
+/**
+ * This wraps the `createTRPCContext` helper and provides the required context for the tRPC API when
+ * handling a tRPC call from a React Server Component.
+ */
+const createContext = cache(() => {
+ return createTRPCContext({
+ req: {
+ headers: new Headers({
+ cookie: cookies().toString(),
+ 'x-trpc-source': 'rsc',
+ }),
+ },
+ } as Record);
+});
+
+export const api = createTRPCProxyClient({
+ transformer,
+ links: [
+ loggerLink({
+ enabled: (op) =>
+ process.env.NODE_ENV === 'development' ||
+ (op.direction === 'down' && op.result instanceof Error),
+ }),
+ /**
+ * Custom RSC link that lets us invoke procedures without using http requests. Since Server
+ * Components always run on the server, we can just call the procedure as a function.
+ */
+ () =>
+ ({ op }) =>
+ observable((observer) => {
+ createContext()
+ .then((ctx) => {
+ return callProcedure({
+ procedures: appRouter._def.procedures,
+ path: op.path,
+ rawInput: op.input,
+ ctx,
+ type: op.type,
+ });
+ })
+ .then((data) => {
+ observer.next({ result: { data } });
+ observer.complete();
+ })
+ .catch((cause: TRPCErrorResponse) => {
+ observer.error(TRPCClientError.from(cause));
+ });
+ }),
+ ],
+});
diff --git a/apps/zipper.dev/src/trpc/shared.ts b/apps/zipper.dev/src/trpc/shared.ts
new file mode 100644
index 000000000..8f0b1d33f
--- /dev/null
+++ b/apps/zipper.dev/src/trpc/shared.ts
@@ -0,0 +1,30 @@
+import { type inferRouterInputs, type inferRouterOutputs } from '@trpc/server';
+import superjson from 'superjson';
+
+import { type AppRouter } from '~/server/routers/_app';
+
+export const transformer = superjson;
+
+function getBaseUrl() {
+ if (typeof window !== 'undefined') return '';
+ if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`;
+ return `http://localhost:${process.env.PORT ?? 3000}`;
+}
+
+export function getUrl() {
+ return getBaseUrl() + '/api/trpc';
+}
+
+/**
+ * Inference helper for inputs.
+ *
+ * @example type HelloInput = RouterInputs['example']['hello']
+ */
+export type RouterInputs = inferRouterInputs;
+
+/**
+ * Inference helper for outputs.
+ *
+ * @example type HelloOutput = RouterOutputs['example']['hello']
+ */
+export type RouterOutputs = inferRouterOutputs;
diff --git a/apps/zipper.dev/src/utils/ai-generate-applet.ts b/apps/zipper.dev/src/utils/ai-generate-applet.ts
index 4964b9bdd..05024e706 100644
--- a/apps/zipper.dev/src/utils/ai-generate-applet.ts
+++ b/apps/zipper.dev/src/utils/ai-generate-applet.ts
@@ -719,7 +719,7 @@ export const codeOutputParser = StructuredOutputParser.fromZodSchema(
.describe('The filename of the typescript code in kebab-case'),
code: z.string().describe('The code that got generated'),
}),
- ),
+ ) as any,
);
const createBasicCode = new LLMChain({
diff --git a/apps/zipper.dev/src/utils/boot-info-utils.ts b/apps/zipper.dev/src/utils/boot-info-utils.ts
index 443d59f92..862e30785 100644
--- a/apps/zipper.dev/src/utils/boot-info-utils.ts
+++ b/apps/zipper.dev/src/utils/boot-info-utils.ts
@@ -113,7 +113,7 @@ export async function getCanUserEdit({
};
},
{},
- );
+ ) as Record;
return canUserEditFn(appInfo, {
req,
@@ -121,6 +121,7 @@ export async function getCanUserEdit({
orgId: undefined,
organizations: organizations,
session: undefined,
+ headers: undefined as any,
});
}
diff --git a/apps/zipper.dev/tsconfig.json b/apps/zipper.dev/tsconfig.json
index db21a8756..d0d4df286 100644
--- a/apps/zipper.dev/tsconfig.json
+++ b/apps/zipper.dev/tsconfig.json
@@ -6,7 +6,7 @@
},
"compilerOptions": {
"target": "es5",
- "lib": ["dom", "dom.iterable", "esnext"],
+ "lib": ["dom", "dom.iterable", "ES2021"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@@ -39,7 +39,8 @@
"**/*.tsx",
"./*.js",
"./src/**/*.js",
- ".next/types/**/*.ts"
-, "tailwind.config.cjs" ],
+ ".next/types/**/*.ts",
+ "tailwind.config.cjs"
+ ],
"exclude": ["node_modules", "**/*.deno.ts", "**/*.test.*"]
}
diff --git a/apps/zipper.run/next.config.js b/apps/zipper.run/next.config.js
index cfefb3df8..f0bb37a4c 100644
--- a/apps/zipper.run/next.config.js
+++ b/apps/zipper.run/next.config.js
@@ -62,6 +62,7 @@ module.exports = getConfig({
'@zipper/framework',
'@zipper/types',
'@zipper/ui',
+ '@zipper/tw',
'@zipper/utils',
],
diff --git a/apps/zipper.run/package.json b/apps/zipper.run/package.json
index e555d8fd1..3db1ef17e 100644
--- a/apps/zipper.run/package.json
+++ b/apps/zipper.run/package.json
@@ -35,6 +35,7 @@
"@sentry/nextjs": "^7.51.0",
"@vercel/kv": "^1.0.0",
"@zipper/types": "*",
+ "@zipper/tw": "*",
"@zipper/ui": "*",
"@zipper/utils": "*",
"chrono-node": "^2.5.0",
diff --git a/packages/@zipper-tw/components.json b/packages/@zipper-tw/components.json
new file mode 100644
index 000000000..bab50879c
--- /dev/null
+++ b/packages/@zipper-tw/components.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "new-york",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.cjs",
+ "css": "src/globals.css",
+ "baseColor": "slate",
+ "cssVariables": true
+ },
+ "aliases": {
+ "ui": "~/ui",
+ "utils": "~/utils/cn"
+ }
+}
diff --git a/packages/@zipper-tw/package.json b/packages/@zipper-tw/package.json
new file mode 100644
index 000000000..ad68171e1
--- /dev/null
+++ b/packages/@zipper-tw/package.json
@@ -0,0 +1,65 @@
+{
+ "name": "@zipper/tw",
+ "version": "0.0.0",
+ "private": true,
+ "exports": {
+ "./ui/*": "./src/ui/*",
+ "./ui/modules/*": "./src/ui/modules/*",
+ "./ui/common/*": "./src/ui/common/*",
+ "./ui/templates/*": "./src/ui/templates/*",
+ "./ui": "./src/ui/index.ts",
+ "./cn": "./src/utils/cn.ts"
+ },
+ "typesVersions": {
+ "*": {
+ "cn": [
+ "./src/utils/cn.ts"
+ ],
+ "ui": [
+ "./src/ui/index.ts"
+ ],
+ "ui/*": [
+ "./src/ui/*",
+ "./src/ui/*",
+ "./src/ui/modules*",
+ "./src/ui/common/*",
+ "./src/ui/templates/*"
+ ]
+ }
+ },
+ "scripts": {
+ "format": "prettier . --check --cache --cache-location=\"node_modules/.cache/prettiercache\"",
+ "format:fix": "prettier . --write --cache --cache-location=\"node_modules/.cache/prettiercache\" --log-level=warn",
+ "lint": "eslint . --cache --cache-location \"node_modules/.cache/.eslintcache\" --max-warnings 0",
+ "lint:fix": "eslint . --fix --cache --cache-location \"node_modules/.cache/.eslintcache\" --max-warnings 0",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {
+ "@radix-ui/react-accordion": "^1.1.2",
+ "@radix-ui/react-avatar": "^1.0.4",
+ "@radix-ui/react-dialog": "^1.0.5",
+ "@radix-ui/react-dropdown-menu": "^2.0.6",
+ "@radix-ui/react-icons": "^1.3.0",
+ "@radix-ui/react-label": "^2.0.2",
+ "@radix-ui/react-select": "^2.0.0",
+ "@radix-ui/react-slot": "^1.0.2",
+ "@radix-ui/react-switch": "^1.0.3",
+ "@radix-ui/react-tabs": "^1.0.4",
+ "@radix-ui/react-tooltip": "^1.0.7",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.0.0",
+ "javascript-color-gradient": "^2.4.4",
+ "react-hook-form": "^7.49.3",
+ "lucide-react": "^0.297.0",
+ "react": "^18.2.0",
+ "rehype-sanitize": "^6.0.0",
+ "remark-gemoji": "^8.0.0",
+ "remark-gfm": "^1.0.0",
+ "sonner": "^1.3.1",
+ "tailwind-merge": "^2.1.0",
+ "tailwindcss": "^3.3.6",
+ "tailwindcss-animate": "^1.0.7",
+ "typescript": "^5.3.3"
+ },
+ "devDependencies": {}
+}
diff --git a/packages/@zipper-tw/postcss.config.js b/packages/@zipper-tw/postcss.config.js
new file mode 100644
index 000000000..12a703d90
--- /dev/null
+++ b/packages/@zipper-tw/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/packages/@zipper-tw/src/globals.css b/packages/@zipper-tw/src/globals.css
new file mode 100644
index 000000000..5e10db580
--- /dev/null
+++ b/packages/@zipper-tw/src/globals.css
@@ -0,0 +1,75 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 223 15% 9%;
+
+ --muted: 0 0% 94%;
+ --muted-foreground: 221 18% 39%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 223 15% 9%;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 223 15% 9%;
+
+ --border: 222 18% 86%;
+ --input: 222 18% 86%;
+
+ --primary: 289 59% 45%;
+ --primary-foreground: 0 0% 100%;
+
+ --secondary: 208 85% 43%;
+ --secondary-foreground: 0 0% 100%;
+
+ --accent: 220 19% 94%;
+ --accent-foreground: 223 15% 9%;
+
+ --destructive: 1 79% 51%;
+ --destructive-foreground: 0 0% 100%;
+
+ --ring: 284 79% 91%;
+
+ --disabled: 0 0% 86%;
+
+ --radius: 0rem;
+ }
+
+ .dark {
+ --background: 223 15% 9%;
+ --foreground: 220 20% 97%;
+
+ --muted: 223 15% 24%;
+ --muted-foreground: 220 20% 97%;
+
+ --card: 223 15% 9%;
+ --card-foreground: 220 20% 97%;
+
+ --popover: 223 15% 9%;
+ --popover-foreground: 220 20% 97%;
+
+ --primary: 288 77% 73%;
+ --secondary: 206 81% 60%;
+ --destructive: 1 99% 71%;
+
+ --border: 223 15% 24%;
+ --input: 223 15% 24%;
+
+ --disabled: 0 0% 86%;
+ --accent: 223 15% 24%;
+ --accent-foreground: 220 20% 97%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+
+ body {
+ @apply bg-background text-foreground;
+ }
+}
diff --git a/packages/@zipper-tw/src/tokens/animation.ts b/packages/@zipper-tw/src/tokens/animation.ts
new file mode 100644
index 000000000..0365b8372
--- /dev/null
+++ b/packages/@zipper-tw/src/tokens/animation.ts
@@ -0,0 +1,15 @@
+export const keyframes = {
+ 'accordion-down': {
+ from: { height: 0 },
+ to: { height: 'var(--radix-accordion-content-height)' },
+ },
+ 'accordion-up': {
+ from: { height: 'var(--radix-accordion-content-height)' },
+ to: { height: 0 },
+ },
+};
+
+export const animation = {
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out',
+};
diff --git a/packages/@zipper-tw/src/tokens/colors.ts b/packages/@zipper-tw/src/tokens/colors.ts
new file mode 100644
index 000000000..b1f163a52
--- /dev/null
+++ b/packages/@zipper-tw/src/tokens/colors.ts
@@ -0,0 +1,169 @@
+export const primary = {
+ 'primary-purple': {
+ '50': 'hsl(280, 82%, 98%)',
+ '100': 'hsl(284, 83%, 95%)',
+ '200': 'hsl(284, 79%, 91%)',
+ '300': 'hsl(287, 79%, 83%)',
+ '400': 'hsl(288, 77%, 73%)',
+ '500': 'hsl(287, 71%, 61%)',
+ '600': 'hsl(289, 59%, 45%)',
+ '700': 'hsl(290, 61%, 40%)',
+ '800': 'hsl(290, 60%, 33%)',
+ '900': 'hsl(292, 54%, 28%)',
+ '950': 'hsl(292, 76%, 16%)',
+ DEFAULT: 'hsl(289, 59%, 45%)',
+ },
+
+ 'primary-blue': {
+ '50': 'hsl(212, 87%, 97%)',
+ '100': 'hsl(210, 81%, 94%)',
+ '200': 'hsl(207, 80%, 86%)',
+ '300': 'hsl(207, 82%, 74%)',
+ '400': 'hsl(206, 81%, 60%)',
+ '500': 'hsl(206, 77%, 48%)',
+ '600': 'hsl(208, 85%, 43%)',
+ '700': 'hsl(209, 83%, 32%)',
+ '800': 'hsl(209, 77%, 27%)',
+ '900': 'hsl(210, 69%, 24%)',
+ '950': 'hsl(212, 70%, 16%)',
+ DEFAULT: 'hsl(208, 85%, 43%)',
+ },
+
+ 'primary-red': {
+ '50': 'hsl(0, 100%, 97%)',
+ '100': 'hsl(0, 100%, 94%)',
+ '200': 'hsl(1, 100%, 89%)',
+ '300': 'hsl(1, 100%, 82%)',
+ '400': 'hsl(1, 99%, 71%)',
+ '500': 'hsl(1, 92%, 61%)',
+ '600': 'hsl(1, 79%, 51%)',
+ '700': 'hsl(1, 80%, 42%)',
+ '800': 'hsl(1, 77%, 35%)',
+ '900': 'hsl(1, 68%, 31%)',
+ '950': 'hsl(1, 82%, 15%)',
+ DEFAULT: 'hsl(1, 92%, 61%)',
+ },
+};
+
+export const secondary = {
+ yellow: {
+ '50': 'hsl(47, 100%, 96%)',
+ '100': 'hsl(49, 100%, 92%)',
+ '200': 'hsl(46, 100%, 83%)',
+ '300': 'hsl(44, 100%, 72%)',
+ '400': 'hsl(41, 100%, 61%)',
+ '500': 'hsl(38, 98%, 53%)',
+ '600': 'hsl(34, 94%, 50%)',
+ '700': 'hsl(31, 91%, 40%)',
+ '800': 'hsl(29, 83%, 34%)',
+ '900': 'hsl(29, 77%, 28%)',
+ '950': 'hsl(26, 84%, 15%)',
+ },
+ green: {
+ '50': 'hsl(148, 100%, 97%)',
+ '100': 'hsl(152, 100%, 92%)',
+ '200': 'hsl(152, 100%, 85%)',
+ '300': 'hsl(153, 100%, 73%)',
+ '400': 'hsl(152, 93%, 58%)',
+ '500': 'hsl(153, 95%, 45%)',
+ '600': 'hsl(152, 100%, 37%)',
+ '700': 'hsl(153, 96%, 30%)',
+ '800': 'hsl(154, 85%, 24%)',
+ '900': 'hsl(155, 83%, 20%)',
+ '950': 'hsl(154, 100%, 10%)',
+ },
+ indigo: {
+ '50': 'hsl(212, 87%, 97%)',
+ '100': 'hsl(210, 81%, 94%)',
+ '200': 'hsl(207, 80%, 86%)',
+ '300': 'hsl(207, 82%, 74%)',
+ '400': 'hsl(206, 81%, 60%)',
+ '500': 'hsl(206, 77%, 48%)',
+ '600': 'hsl(208, 85%, 43%)',
+ '700': 'hsl(209, 83%, 32%)',
+ '800': 'hsl(209, 77%, 27%)',
+ '900': 'hsl(210, 69%, 24%)',
+ '950': 'hsl(212, 70%, 16%)',
+ },
+ pink: {
+ '50': 'hsl(316, 73%, 97%)',
+ '100': 'hsl(314, 78%, 95%)',
+ '200': 'hsl(313, 88%, 90%)',
+ '300': 'hsl(315, 89%, 82%)',
+ '400': 'hsl(316, 88%, 70%)',
+ '500': 'hsl(318, 83%, 60%)',
+ '600': 'hsl(321, 73%, 51%)',
+ '700': 'hsl(323, 79%, 42%)',
+ '800': 'hsl(323, 77%, 35%)',
+ '900': 'hsl(323, 70%, 30%)',
+ '950': 'hsl(323, 86%, 17%)',
+ },
+};
+
+export const neutral = {
+ white: {
+ '50': 'hsl(0, 0%, 100%)',
+ '100': 'hsl(0, 0%, 94%)',
+ '200': 'hsl(0, 0%, 86%)',
+ '300': 'hsl(0, 0%, 74%)',
+ '400': 'hsl(0, 0%, 60%)',
+ '500': 'hsl(0, 0%, 49%)',
+ '600': 'hsl(0, 0%, 40%)',
+ '700': 'hsl(0, 0%, 32%)',
+ '800': 'hsl(0, 0%, 27%)',
+ '900': 'hsl(0, 0%, 24%)',
+ '950': 'hsl(0, 0%, 16%)',
+ },
+ gray: {
+ '50': 'hsl(220, 20%, 97%)',
+ '100': 'hsl(220, 19%, 94%)',
+ '200': 'hsl(222, 18%, 86%)',
+ '300': 'hsl(217, 17%, 74%)',
+ '400': 'hsl(217, 17%, 60%)',
+ '500': 'hsl(218, 17%, 48%)',
+ '600': 'hsl(221, 18%, 39%)',
+ '700': 'hsl(220, 18%, 32%)',
+ '800': 'hsl(220, 17%, 27%)',
+ '900': 'hsl(223, 15%, 24%)',
+ '950': 'hsl(223, 15%, 9%)',
+ },
+};
+
+export const brand = {
+ 'brand-purple': primary['primary-purple']['600'],
+ 'brand-blue': primary['primary-blue']['600'],
+ 'brand-red': primary['primary-red']['500'],
+ 'brand-dark-purple': primary['primary-purple']['950'],
+ 'brand-dark-blue': primary['primary-blue']['950'],
+ 'brand-dark-red': primary['primary-red']['950'],
+};
+
+export const status = {
+ success: secondary.green[600],
+ warning: secondary.yellow[600],
+ error: primary['primary-red'][600],
+};
+
+export const layout = {
+ background: 'hsl(var(--background))',
+ foreground: 'hsl(var(--foreground))',
+ muted: 'hsl(var(--muted))',
+ 'muted-foreground': 'hsl(var(--muted-foreground))',
+ card: 'hsl(var(--card))',
+ 'card-foreground': 'hsl(var(--card-foreground))',
+ popover: 'hsl(var(--popover))',
+ 'popover-foreground': 'hsl(var(--popover-foreground))',
+ border: 'hsl(var(--border))',
+ input: 'hsl(var(--input))',
+ primary: 'hsl(var(--primary))',
+ 'primary-foreground': 'hsl(var(--primary-foreground))',
+ secondary: 'hsl(var(--secondary))',
+ 'secondary-foreground': 'hsl(var(--secondary-foreground))',
+ accent: 'hsl(var(--accent))',
+ 'accent-foreground': 'hsl(var(--accent-foreground))',
+ destructive: 'hsl(var(--destructive))',
+ 'destructive-foreground': 'hsl(var(--destructive-foreground))',
+ ring: 'hsl(var(--ring))',
+ radius: 'hsl(var(--radius))',
+ disabled: 'hsl(var--disabled))',
+};
diff --git a/packages/@zipper-tw/src/tokens/fonts.ts b/packages/@zipper-tw/src/tokens/fonts.ts
new file mode 100644
index 000000000..f31936543
--- /dev/null
+++ b/packages/@zipper-tw/src/tokens/fonts.ts
@@ -0,0 +1,6 @@
+export const fontFamily = {
+ body: ['var(--font-inter)'],
+ heading: ['var(--font-plaak)', 'sans-serif'],
+ mono: ['Monaco', 'Monaco', 'monospace'],
+ plaak: ['"Plaak"', 'sans-serif'],
+};
diff --git a/packages/@zipper-tw/src/ui/common/badge.tsx b/packages/@zipper-tw/src/ui/common/badge.tsx
new file mode 100644
index 000000000..87b8dcf28
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/common/badge.tsx
@@ -0,0 +1,38 @@
+import * as React from 'react';
+import { cva, type VariantProps } from 'class-variance-authority';
+
+import { cn } from '../../utils/cn';
+
+const badgeVariants = cva(
+ 'inline-flex items-center rounded-md px-2 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',
+ {
+ variants: {
+ variant: {
+ default:
+ 'border-transparent bg-primary/10 text-primary shadow hover:bg-primary/15',
+ success:
+ 'border-transparent bg-success/10 text-success shadow hover:bg-success/15',
+ secondary:
+ 'border-transparent bg-secondary/10 text-secondary hover:bg-secondary/15',
+ destructive:
+ 'border-transparent bg-destructive/10 text-destructive shadow hover:bg-destructive/15',
+ outline: 'text-foreground',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ },
+ },
+);
+
+export interface BadgeProps
+ extends React.HTMLAttributes,
+ VariantProps {}
+
+function Badge({ className, variant, ...props }: BadgeProps) {
+ return (
+
+ );
+}
+
+export { Badge, badgeVariants };
diff --git a/packages/@zipper-tw/src/ui/common/button.tsx b/packages/@zipper-tw/src/ui/common/button.tsx
new file mode 100644
index 000000000..555e2fa92
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/common/button.tsx
@@ -0,0 +1,62 @@
+import * as React from 'react';
+import { Slot } from '@radix-ui/react-slot';
+import { cva, type VariantProps } from 'class-variance-authority';
+
+import { cn } from '../../utils/cn';
+
+const buttonVariants = cva(
+ 'inline-flex items-center justify-center whitespace-nowrap rounded-sm text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',
+ {
+ variants: {
+ variant: {
+ default:
+ 'bg-primary text-primary-foreground hover:bg-primary/90 dark:text-background',
+ destructive:
+ 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
+ outline:
+ 'border border-input bg-none hover:bg-accent hover:text-accent-foreground',
+ 'outline-primary':
+ 'border border-primary bg-none text-primary hover:bg-primary/10 focus:bg-primary/10',
+ 'outline-secondary':
+ 'border border-secondary bg-none text-secondary hover:bg-secondary/10 focus:bg-secondary/10',
+ secondary:
+ 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
+ 'ghost-primary': 'text-primary hover:bg-primary/10 focus:bg-primary/10',
+ link: 'text-primary underline-offset-4 hover:underline',
+ },
+ size: {
+ default: 'h-9 px-4 py-2',
+ sm: 'h-8 rounded-sm px-3 text-xs',
+ lg: 'h-10 rounded-sm px-8',
+ icon: 'h-9 w-9',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ size: 'default',
+ },
+ },
+);
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ VariantProps {
+ asChild?: boolean;
+}
+
+const Button = React.forwardRef(
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : 'button';
+ return (
+
+ );
+ },
+);
+Button.displayName = 'Button';
+
+export { Button, buttonVariants };
diff --git a/packages/@zipper-tw/src/ui/common/divider.tsx b/packages/@zipper-tw/src/ui/common/divider.tsx
new file mode 100644
index 000000000..0b6036b00
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/common/divider.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import { cn } from '../../utils/cn';
+
+const Divider = React.forwardRef<
+ HTMLSpanElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+
+Divider.displayName = 'Divider';
+
+export { Divider };
diff --git a/packages/@zipper-tw/src/ui/common/input.tsx b/packages/@zipper-tw/src/ui/common/input.tsx
new file mode 100644
index 000000000..af9bdbf7f
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/common/input.tsx
@@ -0,0 +1,24 @@
+import * as React from 'react';
+import { cn } from '../../utils/cn';
+
+export interface InputProps
+ extends React.InputHTMLAttributes {}
+
+const Input = React.forwardRef(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ );
+ },
+);
+Input.displayName = 'Input';
+
+export { Input };
diff --git a/packages/@zipper-tw/src/ui/common/label.tsx b/packages/@zipper-tw/src/ui/common/label.tsx
new file mode 100644
index 000000000..bac0e9e03
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/common/label.tsx
@@ -0,0 +1,25 @@
+'use client';
+
+import * as React from 'react';
+import * as LabelPrimitive from '@radix-ui/react-label';
+import { cva, type VariantProps } from 'class-variance-authority';
+import { cn } from '../../utils/cn';
+
+const labelVariants = cva(
+ 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',
+);
+
+const Label = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, ...props }, ref) => (
+
+));
+Label.displayName = LabelPrimitive.Root.displayName;
+
+export { Label };
diff --git a/packages/@zipper-tw/src/ui/common/sonner.tsx b/packages/@zipper-tw/src/ui/common/sonner.tsx
new file mode 100644
index 000000000..b38ad1e0d
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/common/sonner.tsx
@@ -0,0 +1,31 @@
+'use client';
+
+import { useTheme } from 'next-themes';
+import { Toaster as Sonner } from 'sonner';
+
+type ToasterProps = React.ComponentProps;
+
+const Toaster = ({ ...props }: ToasterProps) => {
+ const { theme = 'system' } = useTheme();
+
+ return (
+
+ );
+};
+
+export { Toaster };
diff --git a/packages/@zipper-tw/src/ui/common/switch.tsx b/packages/@zipper-tw/src/ui/common/switch.tsx
new file mode 100644
index 000000000..335e23579
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/common/switch.tsx
@@ -0,0 +1,28 @@
+'use client';
+
+import * as React from 'react';
+import * as SwitchPrimitives from '@radix-ui/react-switch';
+import { cn } from '../../utils/cn';
+
+const Switch = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+Switch.displayName = SwitchPrimitives.Root.displayName;
+
+export { Switch };
diff --git a/packages/@zipper-tw/src/ui/common/text-area.tsx b/packages/@zipper-tw/src/ui/common/text-area.tsx
new file mode 100644
index 000000000..531de4335
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/common/text-area.tsx
@@ -0,0 +1,23 @@
+import * as React from 'react';
+import { cn } from '../../utils/cn';
+
+export interface TextareaProps
+ extends React.TextareaHTMLAttributes {}
+
+const Textarea = React.forwardRef(
+ ({ className, ...props }, ref) => {
+ return (
+
+ );
+ },
+);
+Textarea.displayName = 'Textarea';
+
+export { Textarea };
diff --git a/packages/@zipper-tw/src/ui/common/zipper-logo.tsx b/packages/@zipper-tw/src/ui/common/zipper-logo.tsx
new file mode 100644
index 000000000..83663a631
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/common/zipper-logo.tsx
@@ -0,0 +1,205 @@
+import { type CSSProperties } from 'react';
+
+type Props = {
+ className?: string;
+ fill?: string;
+ style?: CSSProperties;
+ type?: 'mono' | 'color' | 'horizontal' | 'sliced' | 'dark';
+ height?: number;
+};
+
+export const ZipperLogo: React.FC = ({
+ fill = '#231f20',
+ className,
+ type = 'mono',
+ style,
+ height,
+} = {}) => {
+ if (type === 'horizontal')
+ return (
+
+
+
+
+
+
+
+
+ );
+
+ if (type === 'dark') {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+
+ if (type === 'mono')
+ return (
+
+
+
+
+
+ );
+
+ if (type === 'sliced') {
+ return (
+
+
+
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/packages/@zipper-tw/src/ui/common/zipper-symbol.tsx b/packages/@zipper-tw/src/ui/common/zipper-symbol.tsx
new file mode 100644
index 000000000..48fb87061
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/common/zipper-symbol.tsx
@@ -0,0 +1,46 @@
+interface PathProps {
+ fill?: string;
+ className?: string;
+ style?: React.CSSProperties;
+}
+
+interface Props extends PathProps {
+ top?: PathProps;
+ middle?: PathProps;
+ bottom?: PathProps;
+ width?: number;
+ height?: number;
+}
+
+export const ZipperSymbol: React.FC = ({
+ fill,
+ className,
+ style,
+ top,
+ middle,
+ bottom,
+ height,
+ width,
+} = {}) => (
+
+ {/* Top of Z */}
+
+
+ {/* Middle of Z */}
+
+
+ {/* Bottom of Z */}
+
+
+);
diff --git a/packages/@zipper-tw/src/ui/index.ts b/packages/@zipper-tw/src/ui/index.ts
new file mode 100644
index 000000000..f4ead9f7c
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/index.ts
@@ -0,0 +1,26 @@
+/* ------------------ Common ------------------ */
+export * from './common/badge';
+export * from './common/button';
+export * from './common/divider';
+export * from './common/input';
+export * from './common/label';
+export * from './common/sonner';
+export * from './common/switch';
+export * from './common/text-area';
+export * from './common/zipper-logo';
+export * from './common/zipper-symbol';
+
+/* ------------------ Modules ----------------- */
+export * from './modules/group';
+export * from './modules/list';
+export * from './modules/show';
+
+/* ----------------- Templates ---------------- */
+export * from './templates/avatar';
+export * from './templates/dialog';
+export * from './templates/dropdown';
+export * from './templates/form';
+export * from './templates/select';
+export * from './templates/table';
+export * from './templates/tabs';
+export * from './templates/tooltip';
diff --git a/packages/@zipper-tw/src/ui/modules/group.tsx b/packages/@zipper-tw/src/ui/modules/group.tsx
new file mode 100644
index 000000000..94ad35aec
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/modules/group.tsx
@@ -0,0 +1,116 @@
+import { cn } from '../../utils/cn';
+import React, { type ReactNode } from 'react';
+import { Show } from './show';
+import { cva, type VariantProps } from 'class-variance-authority';
+
+const groupStyles = cva('flex', {
+ variants: {
+ direction: {
+ row: 'flex-row',
+ column: 'flex-col',
+ },
+
+ spacing: {
+ sm: '',
+ md: '',
+ lg: '',
+ xl: '',
+ },
+ },
+
+ defaultVariants: {
+ spacing: 'md',
+ direction: 'row',
+ },
+
+ compoundVariants: [
+ {
+ direction: 'column',
+ spacing: 'sm',
+ className: '-space-y-5',
+ },
+ {
+ direction: 'column',
+ spacing: 'md',
+ className: '-space-y-4',
+ },
+ {
+ direction: 'column',
+ spacing: 'lg',
+ className: '-space-y-3',
+ },
+ {
+ direction: 'column',
+ spacing: 'xl',
+ className: '-space-y-2',
+ },
+ {
+ direction: 'row',
+ spacing: 'sm',
+ className: '-space-x-5',
+ },
+ {
+ direction: 'row',
+ spacing: 'md',
+ className: '-space-x-4',
+ },
+ {
+ direction: 'row',
+ spacing: 'lg',
+ className: '-space-x-3',
+ },
+ {
+ direction: 'row',
+ spacing: 'xl',
+ className: '-spacing-x-2',
+ },
+ ],
+});
+
+export interface GroupProps
+ extends React.HTMLAttributes,
+ VariantProps {
+ children: React.ReactElement[];
+ limit?: number;
+ offset?: ReactNode;
+}
+
+export function Group({
+ direction,
+ spacing,
+ children,
+ className,
+ offset,
+ limit,
+ ...props
+}: GroupProps) {
+ if (!children) {
+ return null;
+ }
+
+ const execiveChildren = !!limit && children.length >= limit;
+
+ const filteredChildren = execiveChildren
+ ? children.filter((_, index) => index + 1 <= limit)
+ : children;
+
+ return (
+
+ {React.Children.map(
+ filteredChildren as React.ReactElement[],
+ (child, index) => (
+
+ {React.cloneElement(child, {
+ ...child.props,
+ key: index,
+ })}
+
+ ),
+ )}
+ {offset}
+
+ );
+}
diff --git a/packages/@zipper-tw/src/ui/modules/list.tsx b/packages/@zipper-tw/src/ui/modules/list.tsx
new file mode 100644
index 000000000..71d4412eb
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/modules/list.tsx
@@ -0,0 +1,31 @@
+import { Slot } from '@radix-ui/react-slot';
+import React, { type ReactNode } from 'react';
+
+interface ListProps {
+ data: T[] | undefined;
+ as?: 'ul' | 'ol' | 'nav';
+ children?: (props: T, index: number) => ReactNode;
+ component?: (props: T, index: number) => ReactNode;
+ className?: string;
+}
+
+function List(props: ListProps) {
+ const Comp = !props.as ? React.Fragment : !!props.as ? props.as : Slot;
+
+ return (
+
+ {props.data &&
+ props.data.map((item, index) => {
+ const key = index;
+
+ return (
+
+ {(props.component || props.children)?.(item, index)}
+
+ );
+ })}
+
+ );
+}
+
+export { List };
diff --git a/packages/@zipper-tw/src/ui/modules/show.tsx b/packages/@zipper-tw/src/ui/modules/show.tsx
new file mode 100644
index 000000000..946f3e4e7
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/modules/show.tsx
@@ -0,0 +1,21 @@
+import { type ReactNode } from 'react';
+
+interface ShowProps {
+ when: boolean;
+ fallback?: any;
+ children: ReactNode;
+}
+
+function Show(props: ShowProps) {
+ if (!!props.fallback && props.when === false) {
+ return <>{props.fallback}>;
+ }
+
+ if (props.when === true) {
+ return <>{props.children}>;
+ }
+
+ return null;
+}
+
+export { Show };
diff --git a/packages/@zipper-tw/src/ui/templates/avatar.tsx b/packages/@zipper-tw/src/ui/templates/avatar.tsx
new file mode 100644
index 000000000..1748ff5c8
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/templates/avatar.tsx
@@ -0,0 +1,85 @@
+'use client';
+
+import * as React from 'react';
+import * as AvatarPrimitive from '@radix-ui/react-avatar';
+
+import { cn } from '../../utils/cn';
+
+const AvatarRoot = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ size?: 'xs' | 'sm' | 'md';
+ }
+>(({ className, size = 'md', ...props }, ref) => (
+
+));
+AvatarRoot.displayName = AvatarPrimitive.Root.displayName;
+
+const AvatarImage = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+AvatarImage.displayName = AvatarPrimitive.Image.displayName;
+
+const AvatarFallback = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
+
+const AvatarBadge = ({
+ className,
+ status = 'online',
+ ...props
+}: React.HTMLAttributes & {
+ status: 'online' | 'idle' | 'offline';
+}) => {
+ return (
+
+ );
+};
+
+type AvatarComponent = typeof AvatarRoot & {
+ Image: typeof AvatarImage;
+ Fallback: typeof AvatarFallback;
+ Badge: typeof AvatarBadge;
+};
+
+export const Avatar = AvatarRoot as AvatarComponent;
+
+Avatar.Fallback = AvatarFallback;
+Avatar.Image = AvatarImage;
+Avatar.Badge = AvatarBadge;
diff --git a/packages/@zipper-tw/src/ui/templates/dialog.tsx b/packages/@zipper-tw/src/ui/templates/dialog.tsx
new file mode 100644
index 000000000..e86355caf
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/templates/dialog.tsx
@@ -0,0 +1,134 @@
+'use client';
+
+import * as React from 'react';
+import * as DialogPrimitive from '@radix-ui/react-dialog';
+import { Cross2Icon } from '@radix-ui/react-icons';
+import { cn } from '../../utils/cn';
+
+const DialogRoot = DialogPrimitive.Root;
+
+const DialogTrigger = DialogPrimitive.Trigger;
+
+const DialogPortal = DialogPrimitive.Portal;
+
+const DialogClose = DialogPrimitive.Close;
+
+const DialogOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
+
+const DialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+ {children}
+
+
+ Close
+
+
+
+));
+DialogContent.displayName = DialogPrimitive.Content.displayName;
+
+const DialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+);
+DialogHeader.displayName = 'DialogHeader';
+
+const DialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+);
+DialogFooter.displayName = 'DialogFooter';
+
+const DialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DialogTitle.displayName = DialogPrimitive.Title.displayName;
+
+const DialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DialogDescription.displayName = DialogPrimitive.Description.displayName;
+
+type DialogComponent = {
+ Root: typeof DialogRoot;
+ Portal: typeof DialogPortal;
+ Overlay: typeof DialogOverlay;
+ Trigger: typeof DialogTrigger;
+ Close: typeof DialogClose;
+ Content: typeof DialogContent;
+ Header: typeof DialogHeader;
+ Footer: typeof DialogFooter;
+ Title: typeof DialogTitle;
+ Description: typeof DialogDescription;
+};
+
+export const Dialog = {} as DialogComponent;
+
+Dialog.Root = DialogRoot;
+Dialog.Portal = DialogPortal;
+Dialog.Overlay = DialogOverlay;
+Dialog.Trigger = DialogTrigger;
+Dialog.Close = DialogClose;
+Dialog.Content = DialogContent;
+Dialog.Header = DialogHeader;
+Dialog.Footer = DialogFooter;
+Dialog.Title = DialogTitle;
+Dialog.Description = DialogDescription;
diff --git a/packages/@zipper-tw/src/ui/templates/dropdown.tsx b/packages/@zipper-tw/src/ui/templates/dropdown.tsx
new file mode 100644
index 000000000..d9f75f7b7
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/templates/dropdown.tsx
@@ -0,0 +1,223 @@
+'use client';
+
+import * as React from 'react';
+import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
+import {
+ CheckIcon,
+ ChevronRightIcon,
+ DotFilledIcon,
+} from '@radix-ui/react-icons';
+
+import { cn } from '../../utils/cn';
+
+const DropdownMenu = DropdownMenuPrimitive.Root;
+
+const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
+
+const DropdownMenuGroup = DropdownMenuPrimitive.Group;
+
+const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
+
+const DropdownMenuSub = DropdownMenuPrimitive.Sub;
+
+const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
+
+const DropdownMenuSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+));
+DropdownMenuSubTrigger.displayName =
+ DropdownMenuPrimitive.SubTrigger.displayName;
+
+const DropdownMenuSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DropdownMenuSubContent.displayName =
+ DropdownMenuPrimitive.SubContent.displayName;
+
+const DropdownMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+
+
+));
+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
+
+const DropdownMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
+
+const DropdownMenuCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+));
+DropdownMenuCheckboxItem.displayName =
+ DropdownMenuPrimitive.CheckboxItem.displayName;
+
+const DropdownMenuRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+));
+DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
+
+const DropdownMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
+
+const DropdownMenuSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
+
+const DropdownMenuShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ );
+};
+DropdownMenuShortcut.displayName = 'DropdownMenuShortcut';
+
+type DropdownComponent = {
+ Root: typeof DropdownMenu;
+ Trigger: typeof DropdownMenuTrigger;
+ Content: typeof DropdownMenuContent;
+ Item: typeof DropdownMenuItem;
+ CheckboxItem: typeof DropdownMenuCheckboxItem;
+ RadioItem: typeof DropdownMenuRadioItem;
+ Label: typeof DropdownMenuLabel;
+ Separator: typeof DropdownMenuSeparator;
+ Shortcut: typeof DropdownMenuShortcut;
+ Group: typeof DropdownMenuGroup;
+ Portal: typeof DropdownMenuPortal;
+ Sub: typeof DropdownMenuSub;
+ SubContent: typeof DropdownMenuSubContent;
+ SubTrigger: typeof DropdownMenuSubTrigger;
+ RadioGroup: typeof DropdownMenuRadioGroup;
+};
+
+export const Dropdown = {} as DropdownComponent;
+
+Dropdown.Root = DropdownMenu;
+Dropdown.Trigger = DropdownMenuTrigger;
+Dropdown.Content = DropdownMenuContent;
+Dropdown.Item = DropdownMenuItem;
+Dropdown.CheckboxItem = DropdownMenuCheckboxItem;
+Dropdown.RadioItem = DropdownMenuRadioItem;
+Dropdown.Label = DropdownMenuLabel;
+Dropdown.Separator = DropdownMenuSeparator;
+Dropdown.Shortcut = DropdownMenuShortcut;
+Dropdown.Group = DropdownMenuGroup;
+Dropdown.Portal = DropdownMenuPortal;
+Dropdown.Sub = DropdownMenuSub;
+Dropdown.SubContent = DropdownMenuSubContent;
+Dropdown.SubTrigger = DropdownMenuSubTrigger;
+Dropdown.RadioGroup = DropdownMenuRadioGroup;
diff --git a/packages/@zipper-tw/src/ui/templates/form.tsx b/packages/@zipper-tw/src/ui/templates/form.tsx
new file mode 100644
index 000000000..ab8f1128e
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/templates/form.tsx
@@ -0,0 +1,187 @@
+'use client';
+import * as React from 'react';
+import * as LabelPrimitive from '@radix-ui/react-label';
+import { Slot } from '@radix-ui/react-slot';
+import {
+ Controller,
+ type ControllerProps,
+ type FieldPath,
+ type FieldValues,
+ FormProvider,
+ useFormContext,
+} from 'react-hook-form';
+
+import { cn } from '../../utils/cn';
+import { Label } from '../common/label';
+
+const FormRoot = FormProvider;
+
+type FormFieldContextValue<
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath,
+> = {
+ name: TName;
+};
+
+const FormFieldContext = React.createContext(
+ {} as FormFieldContextValue,
+);
+
+const FormField = <
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath,
+>({
+ ...props
+}: ControllerProps) => {
+ return (
+
+
+
+ );
+};
+
+const useFormField = () => {
+ const fieldContext = React.useContext(FormFieldContext);
+ const itemContext = React.useContext(FormItemContext);
+ const { getFieldState, formState } = useFormContext();
+
+ const fieldState = getFieldState(fieldContext.name, formState);
+
+ if (!fieldContext) {
+ throw new Error('useFormField should be used within ');
+ }
+
+ const { id } = itemContext;
+
+ return {
+ id,
+ name: fieldContext.name,
+ formItemId: `${id}-form-item`,
+ formDescriptionId: `${id}-form-item-description`,
+ formMessageId: `${id}-form-item-message`,
+ ...fieldState,
+ };
+};
+
+type FormItemContextValue = {
+ id: string;
+};
+
+const FormItemContext = React.createContext(
+ {} as FormItemContextValue,
+);
+
+const FormItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const id = React.useId();
+
+ return (
+
+
+
+ );
+});
+FormItem.displayName = 'FormItem';
+
+const FormLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField();
+
+ return (
+
+ );
+});
+FormLabel.displayName = 'FormLabel';
+
+const FormControl = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } =
+ useFormField();
+
+ return (
+
+ );
+});
+FormControl.displayName = 'FormControl';
+
+const FormDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField();
+
+ return (
+
+ );
+});
+FormDescription.displayName = 'FormDescription';
+
+const FormMessage = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, children, ...props }, ref) => {
+ const { error, formMessageId } = useFormField();
+ const body = error ? String(error?.message) : children;
+
+ if (!body) {
+ return null;
+ }
+
+ return (
+
+ {body}
+
+ );
+});
+FormMessage.displayName = 'FormMessage';
+
+export type FormComponet = typeof FormRoot & {
+ Item: typeof FormItem;
+ Label: typeof FormLabel;
+ Control: typeof FormControl;
+ Description: typeof FormDescription;
+ Message: typeof FormMessage;
+ Field: typeof FormField;
+};
+
+const Form = FormRoot as FormComponet;
+
+Form.Item = FormItem;
+Form.Label = FormLabel;
+Form.Control = FormControl;
+Form.Description = FormDescription;
+Form.Message = FormMessage;
+Form.Field = FormField;
+
+export { useFormField, Form };
diff --git a/packages/@zipper-tw/src/ui/templates/select.tsx b/packages/@zipper-tw/src/ui/templates/select.tsx
new file mode 100644
index 000000000..bd610bf1c
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/templates/select.tsx
@@ -0,0 +1,175 @@
+'use client';
+
+import * as React from 'react';
+import {
+ CaretSortIcon,
+ CheckIcon,
+ ChevronDownIcon,
+ ChevronUpIcon,
+} from '@radix-ui/react-icons';
+import * as SelectPrimitive from '@radix-ui/react-select';
+
+import { cn } from '../../utils/cn';
+
+const SelectRoot = SelectPrimitive.Root;
+
+const SelectGroup = SelectPrimitive.Group;
+
+const SelectValue = SelectPrimitive.Value;
+
+const SelectTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+ span]:line-clamp-1',
+ className,
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+
+));
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
+
+const SelectScrollUpButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
+
+const SelectScrollDownButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollDownButton.displayName =
+ SelectPrimitive.ScrollDownButton.displayName;
+
+const SelectContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, position = 'popper', ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+
+
+));
+SelectContent.displayName = SelectPrimitive.Content.displayName;
+
+const SelectLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectLabel.displayName = SelectPrimitive.Label.displayName;
+
+const SelectItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+));
+SelectItem.displayName = SelectPrimitive.Item.displayName;
+
+const SelectSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
+
+export type SelectComponent = typeof SelectRoot & {
+ Group: typeof SelectGroup;
+ Value: typeof SelectValue;
+ Trigger: typeof SelectTrigger;
+ Content: typeof SelectContent;
+ Label: typeof SelectLabel;
+ Item: typeof SelectItem;
+ Separator: typeof SelectSeparator;
+ ScrollUpButton: typeof SelectScrollUpButton;
+ ScrollDownButton: typeof SelectScrollDownButton;
+};
+
+export const ShadSelect = SelectRoot as SelectComponent;
+
+ShadSelect.Group = SelectGroup;
+ShadSelect.Value = SelectValue;
+ShadSelect.Trigger = SelectTrigger;
+ShadSelect.Content = SelectContent;
+ShadSelect.Label = SelectLabel;
+ShadSelect.Item = SelectItem;
+ShadSelect.Separator = SelectSeparator;
+ShadSelect.ScrollUpButton = SelectScrollUpButton;
+ShadSelect.ScrollDownButton = SelectScrollDownButton;
diff --git a/packages/@zipper-tw/src/ui/templates/table.tsx b/packages/@zipper-tw/src/ui/templates/table.tsx
new file mode 100644
index 000000000..cfd98658e
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/templates/table.tsx
@@ -0,0 +1,130 @@
+import * as React from 'react';
+
+import { cn } from '../../utils/cn';
+
+const TableRoot = React.forwardRef<
+ HTMLTableElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+
+TableRoot.displayName = 'Table';
+
+const TableHeader = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableHeader.displayName = 'TableHeader';
+
+const TableBody = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableBody.displayName = 'TableBody';
+
+const TableFooter = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+ tr]:last:border-b-0',
+ className,
+ )}
+ {...props}
+ />
+));
+TableFooter.displayName = 'TableFooter';
+
+const TableRow = React.forwardRef<
+ HTMLTableRowElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableRow.displayName = 'TableRow';
+
+const TableHead = React.forwardRef<
+ HTMLTableCellElement,
+ React.ThHTMLAttributes
+>(({ className, ...props }, ref) => (
+ [role=checkbox]]:translate-y-[2px]',
+ className,
+ )}
+ {...props}
+ />
+));
+TableHead.displayName = 'TableHead';
+
+const TableCell = React.forwardRef<
+ HTMLTableCellElement,
+ React.TdHTMLAttributes
+>(({ className, ...props }, ref) => (
+ [role=checkbox]]:translate-y-[2px]',
+ className,
+ )}
+ {...props}
+ />
+));
+TableCell.displayName = 'TableCell';
+
+const TableCaption = React.forwardRef<
+ HTMLTableCaptionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableCaption.displayName = 'TableCaption';
+
+type TableComponent = typeof TableRoot & {
+ Header: typeof TableHeader;
+ Body: typeof TableBody;
+ Footer: typeof TableFooter;
+ Head: typeof TableHead;
+ Row: typeof TableRow;
+ Cell: typeof TableCell;
+ Caption: typeof TableCaption;
+};
+
+export const Table = TableRoot as TableComponent;
+
+Table.Header = TableHeader;
+Table.Body = TableBody;
+Table.Footer = TableFooter;
+Table.Head = TableHead;
+Table.Row = TableRow;
+Table.Cell = TableCell;
+Table.Caption = TableCaption;
diff --git a/packages/@zipper-tw/src/ui/templates/tabs.tsx b/packages/@zipper-tw/src/ui/templates/tabs.tsx
new file mode 100644
index 000000000..35776db37
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/templates/tabs.tsx
@@ -0,0 +1,65 @@
+'use client';
+
+import * as React from 'react';
+import * as TabsPrimitive from '@radix-ui/react-tabs';
+
+import { cn } from '../../utils/cn';
+
+const TabsRoot = TabsPrimitive.Root;
+
+const TabsList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsList.displayName = TabsPrimitive.List.displayName;
+
+const TabsTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
+
+const TabsContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsContent.displayName = TabsPrimitive.Content.displayName;
+
+type TabsComponent = typeof TabsRoot & {
+ List: typeof TabsList;
+ Trigger: typeof TabsTrigger;
+ Content: typeof TabsContent;
+};
+
+export const Tabs = TabsRoot as TabsComponent;
+
+Tabs.List = TabsList;
+Tabs.Trigger = TabsTrigger;
+Tabs.Content = TabsContent;
diff --git a/packages/@zipper-tw/src/ui/templates/tooltip.tsx b/packages/@zipper-tw/src/ui/templates/tooltip.tsx
new file mode 100644
index 000000000..73e0f0590
--- /dev/null
+++ b/packages/@zipper-tw/src/ui/templates/tooltip.tsx
@@ -0,0 +1,40 @@
+'use client';
+
+import * as React from 'react';
+import * as TooltipPrimitive from '@radix-ui/react-tooltip';
+
+import { cn } from '../../utils/cn';
+
+const TooltipProvider = TooltipPrimitive.Provider;
+
+const TooltipRoot = TooltipPrimitive.Root;
+
+const TooltipTrigger = TooltipPrimitive.Trigger;
+
+const TooltipContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+));
+TooltipContent.displayName = TooltipPrimitive.Content.displayName;
+
+export type TooltipComponent = typeof TooltipRoot & {
+ Trigger: typeof TooltipTrigger;
+ Content: typeof TooltipContent;
+ Provider: typeof TooltipProvider;
+};
+
+export const Tooltip = TooltipRoot as TooltipComponent;
+
+Tooltip.Trigger = TooltipTrigger;
+Tooltip.Content = TooltipContent;
+Tooltip.Provider = TooltipProvider;
diff --git a/packages/@zipper-tw/src/utils/cn.ts b/packages/@zipper-tw/src/utils/cn.ts
new file mode 100644
index 000000000..e57f98028
--- /dev/null
+++ b/packages/@zipper-tw/src/utils/cn.ts
@@ -0,0 +1,6 @@
+import { ClassValue, clsx } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/packages/@zipper-tw/src/utils/hslCollorPallete.ts b/packages/@zipper-tw/src/utils/hslCollorPallete.ts
new file mode 100644
index 000000000..55612a8ee
--- /dev/null
+++ b/packages/@zipper-tw/src/utils/hslCollorPallete.ts
@@ -0,0 +1,9 @@
+export function genHslCollorPallet(cssVar: string) {
+ return [50, 100, 200, 300, 400, 500, 600, 800, 900, 950].reduce(
+ (acc, curr) => ({
+ ...acc,
+ [curr]: `hsl(var(--${cssVar}-${curr}))`,
+ }),
+ {},
+ );
+}
diff --git a/packages/@zipper-tw/src/utils/prettier.ts b/packages/@zipper-tw/src/utils/prettier.ts
new file mode 100644
index 000000000..e28851abb
--- /dev/null
+++ b/packages/@zipper-tw/src/utils/prettier.ts
@@ -0,0 +1,9 @@
+import typescript from 'prettier/parser-typescript';
+import prettier from 'prettier/standalone';
+
+export function prettierFormat(source: string) {
+ return prettier.format(source, {
+ parser: 'typescript',
+ plugins: [typescript],
+ });
+}
diff --git a/packages/@zipper-tw/src/utils/user-agent.ts b/packages/@zipper-tw/src/utils/user-agent.ts
new file mode 100644
index 000000000..ef1f88069
--- /dev/null
+++ b/packages/@zipper-tw/src/utils/user-agent.ts
@@ -0,0 +1,27 @@
+import Bowser from 'bowser';
+
+const MAC_OS = 'macOS';
+const WINDOWS = 'Windows';
+const LINUX = 'Linux';
+const IOS = 'iOS';
+const ANDROID = 'Android';
+
+let parser: Bowser.Parser.Parser | undefined;
+
+export const getParser = () => {
+ parser =
+ parser || typeof window !== 'undefined'
+ ? Bowser.getParser(window.navigator.userAgent)
+ : undefined;
+ return parser;
+};
+
+export const getOS = () => getParser()?.getOS();
+export const getOSName = () => getParser()?.getOSName();
+export const isMac = () => getOSName() === MAC_OS;
+export const isWindows = () => getOSName() === WINDOWS;
+export const isLinux = () => getOSName() === LINUX;
+export const isIOS = () => getOSName() === IOS;
+export const isAndroid = () => getOSName() === ANDROID;
+export const isMobile = () => isIOS() || isAndroid();
+export const isApple = () => isMac() || isIOS();
diff --git a/packages/@zipper-tw/tailwind.config.cjs b/packages/@zipper-tw/tailwind.config.cjs
new file mode 100644
index 000000000..c8788f447
--- /dev/null
+++ b/packages/@zipper-tw/tailwind.config.cjs
@@ -0,0 +1,57 @@
+import {
+ brand,
+ neutral,
+ primary,
+ secondary,
+ status,
+ layout,
+} from './src/tokens/colors';
+import { animation, keyframes } from './src/tokens/animation';
+import { fontFamily } from './src/tokens/fonts';
+
+/** @type {import('tailwindcss').Config} */
+const config = {
+ darkMode: ['class'],
+ content: [
+ './pages/**/*.{ts,tsx}',
+ './components/**/*.{ts,tsx}',
+ './app/**/*.{ts,tsx}',
+ './src/**/*.{ts,tsx}',
+ '../../packages/@zipper-ui/src/**/*.{ts,tsx}',
+ ],
+ theme: {
+ container: {
+ center: true,
+ padding: '1rem',
+ screens: {
+ '2xl': '1400px',
+ },
+ },
+ colors: {
+ ...primary,
+ ...secondary,
+ ...neutral,
+ ...brand,
+ ...status,
+ ...layout,
+ },
+ extend: {
+ fontSize: {
+ /** 0.625rem /* 10px /* line-height: 0.75rem /* 12px */
+ xxs: [
+ '0.625rem',
+ {
+ lineHeight: '0.75rem',
+ letterSpacing: '-0.01em',
+ },
+ ],
+ },
+ keyframes,
+ animation,
+ fontFamily,
+ },
+ },
+ plugins: [require('tailwindcss-animate')],
+};
+
+module.exports = config;
diff --git a/packages/@zipper-tw/tsconfig.json b/packages/@zipper-tw/tsconfig.json
new file mode 100644
index 000000000..ebf24b548
--- /dev/null
+++ b/packages/@zipper-tw/tsconfig.json
@@ -0,0 +1,28 @@
+{
+ "compilerOptions": {
+ "composite": false,
+ "declaration": true,
+ "declarationMap": true,
+ "esModuleInterop": true,
+ "verbatimModuleSyntax": true,
+ "forceConsistentCasingInFileNames": true,
+ "inlineSources": false,
+ "isolatedModules": true,
+ "moduleResolution": "node",
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noUncheckedIndexedAccess": true,
+ "preserveWatchOutput": true,
+ "noImplicitAny": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "incremental": true,
+ "lib": ["ES2015", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "target": "ES6",
+ "jsx": "react-jsx",
+ "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json"
+ },
+ "include": ["**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/packages/@zipper-ui/components.json b/packages/@zipper-ui/components.json
index e6e21724e..23e5f9192 100644
--- a/packages/@zipper-ui/components.json
+++ b/packages/@zipper-ui/components.json
@@ -4,7 +4,7 @@
"rsc": true,
"tsx": true,
"tailwind": {
- "config": "tailwind.config.js",
+ "config": "tailwind.config.cjs",
"css": "src/globals.css",
"baseColor": "slate",
"cssVariables": true
@@ -13,4 +13,4 @@
"components": "~/components",
"utils": "~/utils/cn"
}
-}
\ No newline at end of file
+}
diff --git a/packages/@zipper-ui/postcss.config.js b/packages/@zipper-ui/postcss.config.js
index e69de29bb..12a703d90 100644
--- a/packages/@zipper-ui/postcss.config.js
+++ b/packages/@zipper-ui/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/packages/@zipper-ui/src/components/accordion.tsx b/packages/@zipper-ui/src/components/accordion.tsx
index 327c38e24..5bf049724 100644
--- a/packages/@zipper-ui/src/components/accordion.tsx
+++ b/packages/@zipper-ui/src/components/accordion.tsx
@@ -4,7 +4,7 @@ import * as React from 'react';
import * as AccordionPrimitive from '@radix-ui/react-accordion';
import { ChevronDown } from 'lucide-react';
-import { cn } from '../utils/cn';
+import { cn } from '@zipper/ui';
const AccordionRoot = AccordionPrimitive.Root;
@@ -28,7 +28,7 @@ const AccordionTrigger = React.forwardRef<
svg]:rotate-180',
+ 'flex flex-1 items-center justify-between py-4 font-medium font-mono transition-all hover:underline [&[data-state=open]>svg]:rotate-180',
className,
)}
{...props}
diff --git a/packages/@zipper-ui/src/components/function-inputs.tsx b/packages/@zipper-ui/src/components/function-inputs.tsx
index 28a6910c9..e1de24351 100644
--- a/packages/@zipper-ui/src/components/function-inputs.tsx
+++ b/packages/@zipper-ui/src/components/function-inputs.tsx
@@ -1,3 +1,4 @@
+'use client';
import './file-upload/uploadthing.css';
import { Select, Spinner } from '@chakra-ui/react';
import { Suspense, useRef, useState } from 'react';
diff --git a/packages/@zipper-ui/src/components/function-output/action-button.tsx b/packages/@zipper-ui/src/components/function-output/action-button.tsx
index 69f4d6d88..d11e7c070 100644
--- a/packages/@zipper-ui/src/components/function-output/action-button.tsx
+++ b/packages/@zipper-ui/src/components/function-output/action-button.tsx
@@ -1,3 +1,4 @@
+'flex';
import { Button, Flex, Spinner } from '@chakra-ui/react';
import { useState } from 'react';
import { normalizeAppPath } from '@zipper/utils';
diff --git a/packages/@zipper-ui/src/globals.css b/packages/@zipper-ui/src/globals.css
index 3a136896e..5e10db580 100644
--- a/packages/@zipper-ui/src/globals.css
+++ b/packages/@zipper-ui/src/globals.css
@@ -72,4 +72,4 @@
body {
@apply bg-background text-foreground;
}
-}
\ No newline at end of file
+}
diff --git a/yarn.lock b/yarn.lock
index eacacfef2..7d05f0226 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -23,10 +23,10 @@
"@jridgewell/gen-mapping" "^0.3.0"
"@jridgewell/trace-mapping" "^0.3.9"
-"@anthropic-ai/sdk@^0.5.7":
- version "0.5.10"
- resolved "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.5.10.tgz"
- integrity sha512-P8xrIuTUO/6wDzcjQRUROXp4WSqtngbXaE4GpEu0PhEmnq/1Q8vbF1s0o7W07EV3j8zzRoyJxAKovUJtNXH7ew==
+"@anthropic-ai/sdk@^0.9.1":
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88"
+ integrity sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA==
dependencies:
"@types/node" "^18.11.18"
"@types/node-fetch" "^2.6.4"
@@ -36,6 +36,7 @@
form-data-encoder "1.7.2"
formdata-node "^4.3.2"
node-fetch "^2.6.7"
+ web-streams-polyfill "^3.2.1"
"@ava/babel-plugin-throws-helper@^2.0.0":
version "2.0.0"
@@ -3019,6 +3020,69 @@
dependencies:
"@segment/analytics-node" "^1.1.0"
+"@langchain/community@^0.0.17":
+ version "0.0.17"
+ resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.17.tgz#a66c45bdd9e7699e0591720a62d4caaf559f4834"
+ integrity sha512-BI7WJv3rtIbmKrvUNeTaxGGrz8jnu4boLnpl+4cH3WE2lrKTdzuvp6Ot4dACowWInvNSfXcdMzG3BrtTMSaDcQ==
+ dependencies:
+ "@langchain/core" "~0.1.9"
+ "@langchain/openai" "~0.0.10"
+ flat "^5.0.2"
+ langsmith "~0.0.48"
+ uuid "^9.0.0"
+ zod "^3.22.3"
+
+"@langchain/community@~0.0.20":
+ version "0.0.20"
+ resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.20.tgz#a64307e959545fa0b4ed6b67d5aba3437cd76879"
+ integrity sha512-maPMjvF50Z+4eMs7HKmY3wfT+k6IjULqLUVPtVdN1zSGobRvnUIbQMKUY2IXVTZmaMXKBAIob+49X8vjO2snDQ==
+ dependencies:
+ "@langchain/core" "~0.1.16"
+ "@langchain/openai" "~0.0.10"
+ flat "^5.0.2"
+ langsmith "~0.0.48"
+ uuid "^9.0.0"
+ zod "^3.22.3"
+
+"@langchain/core@^0.1.12", "@langchain/core@~0.1.13", "@langchain/core@~0.1.16", "@langchain/core@~0.1.9":
+ version "0.1.18"
+ resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.18.tgz#8a1167801b4d97619771dc19c271f00dfdfb21da"
+ integrity sha512-fDjocs899HDq3nf3PE0TveQoVabO0vyedt9i74Yef4Ds2o22TEDSh3MfoMxM8stcHiV3/9i+0wH4Xdm0E2YLdg==
+ dependencies:
+ ansi-styles "^5.0.0"
+ camelcase "6"
+ decamelize "1.2.0"
+ js-tiktoken "^1.0.8"
+ langsmith "~0.0.48"
+ ml-distance "^4.0.0"
+ p-queue "^6.6.2"
+ p-retry "4"
+ uuid "^9.0.0"
+ zod "^3.22.4"
+ zod-to-json-schema "^3.22.3"
+
+"@langchain/openai@^0.0.11":
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.11.tgz#fa7fa81e55e2535480b09487ba0602d92c4352dd"
+ integrity sha512-km0N+b1bcbtHVDmTEGs7LJFsCrjAcOMnkYlBQrhuIcyhJ052iF4zPpfptScQcZ25dW1yJJI8DS6dVVeM76l52w==
+ dependencies:
+ "@langchain/core" "~0.1.9"
+ js-tiktoken "^1.0.7"
+ openai "^4.24.2"
+ zod "^3.22.3"
+ zod-to-json-schema "3.20.3"
+
+"@langchain/openai@~0.0.10", "@langchain/openai@~0.0.12":
+ version "0.0.12"
+ resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.12.tgz#4c6a4dda3ca96f103482f389299e018340aa2b75"
+ integrity sha512-MR9x1xRXwJpdYlVx9Tga89q/MvxPrSTYyA5vy9tQ8dfQHNWnlgmI4gB/hDIsWUu1ooScagD4wW+aTnohTX+g+g==
+ dependencies:
+ "@langchain/core" "~0.1.13"
+ js-tiktoken "^1.0.7"
+ openai "^4.24.2"
+ zod "^3.22.3"
+ zod-to-json-schema "3.20.3"
+
"@liveblocks/client@1.9.6", "@liveblocks/client@^1.9.6":
version "1.9.6"
resolved "https://registry.yarnpkg.com/@liveblocks/client/-/client-1.9.6.tgz#d8399c6c209b113ced9898b9de7b6d56f5e568d5"
@@ -3372,16 +3436,21 @@
"@napi-rs/simple-git-win32-arm64-msvc" "0.1.9"
"@napi-rs/simple-git-win32-x64-msvc" "0.1.9"
-"@next/env@13.2.4", "@next/env@^13.2.4":
- version "13.2.4"
- resolved "https://registry.npmjs.org/@next/env/-/env-13.2.4.tgz"
- integrity sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==
-
"@next/env@13.4.17":
version "13.4.17"
resolved "https://registry.npmjs.org/@next/env/-/env-13.4.17.tgz"
integrity sha512-rSGmt25Wxk0vGzZxDWBLE8jVW/C/JN20P3IhHc2tKVajEGy/oxStD9PbqcbCz6yOub82jYAWLqnoMITnssB+3g==
+"@next/env@13.5.6":
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.6.tgz#c1148e2e1aa166614f05161ee8f77ded467062bc"
+ integrity sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==
+
+"@next/env@^13.2.4":
+ version "13.2.4"
+ resolved "https://registry.npmjs.org/@next/env/-/env-13.2.4.tgz"
+ integrity sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==
+
"@next/eslint-plugin-next@12.3.4", "@next/eslint-plugin-next@^12.3.1":
version "12.3.4"
resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.4.tgz"
@@ -3389,116 +3458,96 @@
dependencies:
glob "7.1.7"
-"@next/swc-android-arm-eabi@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz#758d0403771e549f9cee71cbabc0cb16a6c947c0"
- integrity sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==
-
-"@next/swc-android-arm64@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz#834d586523045110d5602e0c8aae9028835ac427"
- integrity sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==
-
-"@next/swc-darwin-arm64@13.2.4":
- version "13.2.4"
- resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz"
- integrity sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==
-
"@next/swc-darwin-arm64@13.4.17":
version "13.4.17"
resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.17.tgz"
integrity sha512-dzsHchMmBwa6w6Gf5sp5+WmVt9/H4KWdSHy45aFE/UNmgr9V9eKfTW29k9Np9glLCEzrwnU1MztbAqDrnV9gEA==
-"@next/swc-darwin-x64@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz#6549c7c04322766acc3264ccdb3e1b43fcaf7946"
- integrity sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==
+"@next/swc-darwin-arm64@13.5.6":
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz#b15d139d8971360fca29be3bdd703c108c9a45fb"
+ integrity sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==
"@next/swc-darwin-x64@13.4.17":
version "13.4.17"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.17.tgz#7d80d23e6aad3139f1782b03f7b1147874097c0d"
integrity sha512-iH6UpMj3S40cZkJwYD+uBsAYACNu9TUCae47q2kqx1WzO3JuN/m5Zg22Cpwum/HLRJUa7ysJva/FG2noXbI0yw==
-"@next/swc-freebsd-x64@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz#0bbe28979e3e868debc2cc06e45e186ce195b7f4"
- integrity sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==
-
-"@next/swc-linux-arm-gnueabihf@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz#1d28d2203f5a7427d6e7119d7bcb5fc40959fb3e"
- integrity sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==
-
-"@next/swc-linux-arm64-gnu@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz#eb26448190948cdf4c44b8f34110a3ecea32f1d0"
- integrity sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==
+"@next/swc-darwin-x64@13.5.6":
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz#9c72ee31cc356cb65ce6860b658d807ff39f1578"
+ integrity sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==
"@next/swc-linux-arm64-gnu@13.4.17":
version "13.4.17"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.17.tgz#e27c20da9cf2b4c192bae8963598d3b68cdad145"
integrity sha512-yj3YKGkSg52GL+4XhdfidibYJoq/5pYkQAc8Z4Q1e1nJ7CTOKn4KobTDLXqC5QVJncQRxC2u6vGaMLBe2UUa5Q==
-"@next/swc-linux-arm64-musl@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz#c4227c0acd94a420bb14924820710e6284d234d3"
- integrity sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==
+"@next/swc-linux-arm64-gnu@13.5.6":
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz#59f5f66155e85380ffa26ee3d95b687a770cfeab"
+ integrity sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==
"@next/swc-linux-arm64-musl@13.4.17":
version "13.4.17"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.17.tgz#77b95db731b872cba05982a762365b5fdf251687"
integrity sha512-w8+8ShThIgIgIkLk22NY+ZMF/yf5Dl6+tqOaNUzXy6b0gQSwtpVb0t4eSTx2VUqRxLl36dv9cqomGbthvuPiGA==
-"@next/swc-linux-x64-gnu@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz#6bcb540944ee9b0209b33bfc23b240c2044dfc3e"
- integrity sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==
+"@next/swc-linux-arm64-musl@13.5.6":
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz#f012518228017052736a87d69bae73e587c76ce2"
+ integrity sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==
"@next/swc-linux-x64-gnu@13.4.17":
version "13.4.17"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.17.tgz#79b0062b881880502e032b9a3c96ac7a6e63e2c1"
integrity sha512-IQlJNdxvfqgHxJU6ITERf9qaA0m6mRo/gD0al/5CcXvs6cDihR/UzI09Bc+3vQSJV3ACAzrZjsF7dtdzVutvog==
-"@next/swc-linux-x64-musl@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz#ce21e43251eaf09a09df39372b2c3e38028c30ff"
- integrity sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==
+"@next/swc-linux-x64-gnu@13.5.6":
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz#339b867a7e9e7ee727a700b496b269033d820df4"
+ integrity sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==
"@next/swc-linux-x64-musl@13.4.17":
version "13.4.17"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.17.tgz#0b8badfeb1e14c2c4825bd61f3d8bf2d05bf251c"
integrity sha512-retAiJGtOS216pqAcNOwBUOqgqDH7kYzzj4jLrfVcb/sCQJ+JawMwayc3LEbpvMDZx8CHLECcs6bB45mMxkZEw==
-"@next/swc-win32-arm64-msvc@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz#68220063d8e5e082f5465498675640dedb670ff1"
- integrity sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==
+"@next/swc-linux-x64-musl@13.5.6":
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz#ae0ae84d058df758675830bcf70ca1846f1028f2"
+ integrity sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==
"@next/swc-win32-arm64-msvc@13.4.17":
version "13.4.17"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.17.tgz#eed22e61653293397e9bf33fdb4ab3c074f3f4b3"
integrity sha512-PtaemQL9rwoRtS6kgjXxfRQLUbzBmtMxaXZTBnKnb+EjrDFkC+YI82kktL97LMrHRGQsMJcBQQtNQDJCBJmu2Q==
-"@next/swc-win32-ia32-msvc@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz#7c120ab54a081be9566df310bed834f168252990"
- integrity sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==
+"@next/swc-win32-arm64-msvc@13.5.6":
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz#a5cc0c16920485a929a17495064671374fdbc661"
+ integrity sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==
"@next/swc-win32-ia32-msvc@13.4.17":
version "13.4.17"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.17.tgz#05560747ef930d764557780abfb92b3ced520ad3"
integrity sha512-5jJVxit2B3g/zRWJJ6/YeMHBch7PL10O5qR5BZyuFCoO/bg6MPtz5+U+FvbVCSgCKePU19lRGNsyX+BAu/V+vw==
-"@next/swc-win32-x64-msvc@13.2.4":
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz#5abda92fe12b9829bf7951c4a221282c56041144"
- integrity sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==
+"@next/swc-win32-ia32-msvc@13.5.6":
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz#6a2409b84a2cbf34bf92fe714896455efb4191e4"
+ integrity sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==
"@next/swc-win32-x64-msvc@13.4.17":
version "13.4.17"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.17.tgz#6723562b3a6e194ce9205bebb136ea66a2516e62"
integrity sha512-3QOf2LfziycZW1iVgiA63xVVUMkawurZJ/jwgBqziUNw4r8XHLenNTgbn5XcdHqKuZKUuLSi/6v1/4myGWM0GA==
+"@next/swc-win32-x64-msvc@13.5.6":
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz#4a3e2a206251abc729339ba85f60bc0433c2865d"
+ integrity sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==
+
"@nicksrandall/console-feed@^3.5.0":
version "3.5.0"
resolved "https://registry.npmjs.org/@nicksrandall/console-feed/-/console-feed-3.5.0.tgz"
@@ -3798,6 +3847,15 @@
resolved "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz"
integrity sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==
+"@pinecone-database/pinecone@^1.1.2":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@pinecone-database/pinecone/-/pinecone-1.1.3.tgz#0dce083a26b0a85bcea32f78093543b5f2dff314"
+ integrity sha512-bGldvvoAr4agVZ2ql4RZesXIDjMLjnuqNmKYfMQoVO3UFRYeuO9z+1WJodvanGIPY2iGh1w9yz0jDAkBiT53qw==
+ dependencies:
+ "@sinclair/typebox" "^0.29.0"
+ ajv "^8.12.0"
+ cross-fetch "^3.1.5"
+ encoding "^0.1.13"
"@pkgjs/parseargs@^0.11.0":
version "0.11.0"
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
@@ -3912,13 +3970,6 @@
"@radix-ui/react-primitive" "1.0.3"
"@radix-ui/react-slot" "1.0.2"
-"@radix-ui/react-compose-refs@1.0.0":
- version "1.0.0"
- resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz"
- integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==
- dependencies:
- "@babel/runtime" "^7.13.10"
-
"@radix-ui/react-compose-refs@1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989"
@@ -4248,14 +4299,6 @@
aria-hidden "^1.1.1"
react-remove-scroll "2.5.5"
-"@radix-ui/react-slot@1.0.0":
- version "1.0.0"
- resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz"
- integrity sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==
- dependencies:
- "@babel/runtime" "^7.13.10"
- "@radix-ui/react-compose-refs" "1.0.0"
-
"@radix-ui/react-slot@1.0.2", "@radix-ui/react-slot@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz#a9ff4423eade67f501ffb32ec22064bc9d3099ab"
@@ -4410,112 +4453,91 @@
dependencies:
"@babel/runtime" "^7.13.10"
-"@react-email/body@0.0.2":
- version "0.0.2"
- resolved "https://registry.npmjs.org/@react-email/body/-/body-0.0.2.tgz"
- integrity sha512-SqZrZdxZlH7viwnrLvrMnVzOKpiofVAtho09bmm2siDzy0VMDGItXRzUPLcpg9vcbVJCHZRCIKoNXqA+PtokzQ==
- dependencies:
- react "18.2.0"
-
-"@react-email/button@0.0.9":
- version "0.0.9"
- resolved "https://registry.npmjs.org/@react-email/button/-/button-0.0.9.tgz"
- integrity sha512-eYWQ1X4RFlkKYYSPgSrT6rk98wuLOieEAGENrp9j37t1v/1C+jMmBu0UjZvwHsHWdbOMRjbVDFeMI/+MxWKSEg==
- dependencies:
- react "18.2.0"
-
-"@react-email/column@0.0.7":
- version "0.0.7"
- resolved "https://registry.npmjs.org/@react-email/column/-/column-0.0.7.tgz"
- integrity sha512-B29wVXyIcuVprgGpLkR23waPh/twlqmugZQsCKk05JlMCQ80/Puv4Lgj4dRsIJzgyTLMwG6xq17+Uxc5iGfuaQ==
- dependencies:
- react "18.2.0"
+"@react-email/body@0.0.4":
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/@react-email/body/-/body-0.0.4.tgz#785d8b373b05a900048cb9464401d2690c4509e0"
+ integrity sha512-NmHOumdmyjWvOXomqhQt06KbgRxhHrVznxQp/oWiPWes8nAJo2Y4L27aPHR9nTcs7JF7NmcJe9YSN42pswK+GQ==
-"@react-email/components@^0.0.7":
- version "0.0.7"
- resolved "https://registry.npmjs.org/@react-email/components/-/components-0.0.7.tgz"
- integrity sha512-GpRKV8E7EvK9OPf61f5Z8hliB3p0hTot8tslmEUVCTtX7tdL0wM2YEcZiDWU4PJcudJ/QWHJ7Y5wGzNEARcooA==
- dependencies:
- "@react-email/body" "0.0.2"
- "@react-email/button" "0.0.9"
- "@react-email/column" "0.0.7"
- "@react-email/container" "0.0.8"
- "@react-email/font" "0.0.2"
- "@react-email/head" "0.0.5"
- "@react-email/heading" "0.0.8"
- "@react-email/hr" "0.0.5"
- "@react-email/html" "0.0.4"
- "@react-email/img" "0.0.5"
- "@react-email/link" "0.0.5"
- "@react-email/preview" "0.0.6"
- "@react-email/render" "0.0.7"
- "@react-email/row" "0.0.5"
- "@react-email/section" "0.0.9"
- "@react-email/tailwind" "0.0.8"
- "@react-email/text" "0.0.5"
- react "18.2.0"
+"@react-email/button@0.0.11":
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/@react-email/button/-/button-0.0.11.tgz#299d12e4595518d09611a93c57e8a360f4f2db97"
+ integrity sha512-mB5ySfZifwE5ybtIWwXGbmKk1uKkH4655gftL4+mMxZAZCkINVa2KXTi5pO+xZhMtJI9xtAsikOrOEU1gTDoww==
-"@react-email/container@0.0.8":
+"@react-email/column@0.0.8":
version "0.0.8"
- resolved "https://registry.npmjs.org/@react-email/container/-/container-0.0.8.tgz"
- integrity sha512-MQZQxvTOoLWjJR+Jm689jltm0I/mtZbEaDnwZbNkkHKgccr++wwb9kOKMgXG777Y7tGa1JATAsZpvFYiCITwUg==
- dependencies:
- react "18.2.0"
+ resolved "https://registry.yarnpkg.com/@react-email/column/-/column-0.0.8.tgz#6d24379fa91a7820fdc4171a1060695686692d61"
+ integrity sha512-blChqGU8e/L6KZiB5EPww8bkZfdyHDuS0vKIvU+iS14uK+xfAw+5P5CU9BYXccEuJh2Gftfngu1bWMFp2Sc6ag==
-"@react-email/font@0.0.2":
- version "0.0.2"
- resolved "https://registry.npmjs.org/@react-email/font/-/font-0.0.2.tgz"
- integrity sha512-mmkyOCAcbgytE7DfIuOBVG1YVDUZY9rPCor4o7pUEzGJiU2y/TNuV8CgNPSU/VgXeBKL/94QDjB62OrGHlFNMQ==
- dependencies:
- react "18.2.0"
-
-"@react-email/head@0.0.5":
- version "0.0.5"
- resolved "https://registry.npmjs.org/@react-email/head/-/head-0.0.5.tgz"
- integrity sha512-s84OxJxZMee2z5b1a+RVwY1NOSUNNf1ecjPf6n64aZmMNcNUyn4gOl7RO6xbfBrZko7TigBwsFB1Cgjxtn/ydg==
- dependencies:
- react "18.2.0"
+"@react-email/components@^0.0.11":
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/@react-email/components/-/components-0.0.11.tgz#aa83268ffe593d1804387dace4cb3ef953278f4e"
+ integrity sha512-wj9Sra/AGQvadb3ZABz44ll9Fb9FvXPEmODXRWbNRSc8pJTFGWorrsm4M/yj8dnewd4HtnbLkV1eDOvuiLAVLA==
+ dependencies:
+ "@react-email/body" "0.0.4"
+ "@react-email/button" "0.0.11"
+ "@react-email/column" "0.0.8"
+ "@react-email/container" "0.0.10"
+ "@react-email/font" "0.0.4"
+ "@react-email/head" "0.0.6"
+ "@react-email/heading" "0.0.9"
+ "@react-email/hr" "0.0.6"
+ "@react-email/html" "0.0.6"
+ "@react-email/img" "0.0.6"
+ "@react-email/link" "0.0.6"
+ "@react-email/preview" "0.0.7"
+ "@react-email/render" "0.0.9"
+ "@react-email/row" "0.0.6"
+ "@react-email/section" "0.0.10"
+ "@react-email/tailwind" "0.0.12"
+ "@react-email/text" "0.0.6"
+
+"@react-email/container@0.0.10":
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/@react-email/container/-/container-0.0.10.tgz#1f9e883d77cb1b1cbd3cbbe271a545ed1ce622be"
+ integrity sha512-goishY7ocq+lord0043/LZK268bqvMFW/sxpUt/dSCPJyrrZZNCbpW2t8w8HztU38cYj0qGQLxO5Qvpn/RER3w==
+
+"@react-email/font@0.0.4":
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/@react-email/font/-/font-0.0.4.tgz#c03bb49239098b584ff5852b2bd47a0ff7a7a713"
+ integrity sha512-rN/pFlAcDNmfYFxpufT/rFRrM5KYBJM4nTA2uylTehlVOro6fb/q6n0zUwLF6OmQ4QIuRbqdEy7DI9mmJiNHxA==
-"@react-email/heading@0.0.8":
- version "0.0.8"
- resolved "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.8.tgz"
- integrity sha512-7atATmoHBHTk7hFYFsFFzOIBV3u1zPpsSOWkLBojdjSUdenpk2SbX8GP8/3aBhWl/tuFX9RBGcu1Xes+ZijFLg==
- dependencies:
- "@radix-ui/react-slot" "1.0.0"
- react "18.2.0"
+"@react-email/head@0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/@react-email/head/-/head-0.0.6.tgz#7b6ef34675ab530e1e099c42b7cd2f3379c05689"
+ integrity sha512-9BrBDalb34nBOmmQVQc7/pjJotcuAeC3rhBl4G88Ohiipuv15vPIKqwy8vPJcFNi4l7yGlitfG3EESIjkLkoIw==
-"@react-email/hr@0.0.5":
- version "0.0.5"
- resolved "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.5.tgz"
- integrity sha512-nwB8GmSdvPlR/bWjDS07yHtgdfJqtvCaPXee3SVUY69YYP7NeDO/VACJlgrS9V2l79bj1lUpH0MJMU6MNAk5FQ==
+"@react-email/heading@0.0.9":
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/@react-email/heading/-/heading-0.0.9.tgz#c8252d5986c6384c96b33c8e32f3352a3de0510c"
+ integrity sha512-xzkcGlm+/aFrNlJZBKzxRKkRYJ2cRx92IqmSKAuGnwuKQ/uMKomXzPsHPu3Dclmnhn3wVKj4uprkgQOoxP6uXQ==
dependencies:
+ "@radix-ui/react-slot" "1.0.2"
react "18.2.0"
-"@react-email/html@0.0.4":
- version "0.0.4"
- resolved "https://registry.npmjs.org/@react-email/html/-/html-0.0.4.tgz"
- integrity sha512-7tRYSnudYAWez+NkPWOM8yLZH7EuYFtYdiLPnzpD+pf4cdk16Gz4up531DaIX6dNBbfbyEFpQxhXZxGeJ5ZkfQ==
+"@react-email/hr@0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/@react-email/hr/-/hr-0.0.6.tgz#f5bd575e7607cecc0cabc61f0ab50644a7e1aac0"
+ integrity sha512-W+wINBz7z7BRv3i9GS+QoJBae1PESNhv6ZY6eLnEpqtBI/2++suuRNJOU/KpZzE6pykeTp6I/Z7UcL0LEYKgyg==
-"@react-email/img@0.0.5":
- version "0.0.5"
- resolved "https://registry.npmjs.org/@react-email/img/-/img-0.0.5.tgz"
- integrity sha512-9ziFgBfrIAL+DpVlsraFcd2KwsTRyobLpqTnoiBYCcVZGod59xbYkmsmB3CbUosmLwPYg6AeD7Q7e+hCiwkWgg==
- dependencies:
- react "18.2.0"
+"@react-email/html@0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/@react-email/html/-/html-0.0.6.tgz#a54b51849b21ec131c491b16f7695867bbe7ac81"
+ integrity sha512-8Fo20VOqxqc087gGEPjT8uos06fTXIC8NSoiJxpiwAkwiKtQnQH/jOdoLv6XaWh5Zt2clj1uokaoklnaM5rY1w==
-"@react-email/link@0.0.5":
- version "0.0.5"
- resolved "https://registry.npmjs.org/@react-email/link/-/link-0.0.5.tgz"
- integrity sha512-z+QW9f4gXBdyfhl7iYMY3td+rXKeZYK/2AGElEMsxVoywn5D0b6cF8m5w2jbf0U2V3enT+zy9yc1R6AyT59NOg==
- dependencies:
- react "18.2.0"
+"@react-email/img@0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/@react-email/img/-/img-0.0.6.tgz#d1e7edf3a8a74c80e7148d0bfef0bb32cc3cee9f"
+ integrity sha512-Wd7xKI3b1Jvb2ZEHyVpJ9D98u0GHrRl+578b8LV24PavM/65V61Q5LN5Fr9sAhj+4VGqnHDIVeXIYEzVbWaa3Q==
-"@react-email/preview@0.0.6":
+"@react-email/link@0.0.6":
version "0.0.6"
- resolved "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.6.tgz"
- integrity sha512-mXDCc3NGpm/4W7gowBtjsTxYXowLNOLsJsYhIfrsjNJWGlVhVFB9uEHm55LjBLpxSG020g6/8LIrpJU6g22qvg==
- dependencies:
- react "18.2.0"
+ resolved "https://registry.yarnpkg.com/@react-email/link/-/link-0.0.6.tgz#f1c611cf7c4e08a05d5ae0291f8644510923a7a9"
+ integrity sha512-bYYHroWGS//nDl9yhh8V6K2BrNwAsyX7N/XClSCRku3x56NrZ6D0nBKWewYDPlJ9rW9TIaJm1jDYtO9XBzLlkQ==
+
+"@react-email/preview@0.0.7":
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/@react-email/preview/-/preview-0.0.7.tgz#8d1c9fd27ba45f0449ef6e35484c94da5a6a0de5"
+ integrity sha512-YLfIwHdexPi8IgP1pSuVXdAmKzMQ8ctCCLEjkMttT2vkSFqT6m/e6UFWK2l30rKm2dDsLvQyEvo923mPXjnNzg==
"@react-email/render@0.0.6":
version "0.0.6"
@@ -4527,44 +4549,49 @@
react "18.2.0"
react-dom "18.2.0"
-"@react-email/render@0.0.7":
- version "0.0.7"
- resolved "https://registry.npmjs.org/@react-email/render/-/render-0.0.7.tgz"
- integrity sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==
+"@react-email/render@0.0.9":
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/@react-email/render/-/render-0.0.9.tgz#145d3c3fcbc9c4277234e44a58214bb48e8f79bb"
+ integrity sha512-nrim7wiACnaXsGtL7GF6jp3Qmml8J6vAjAH88jkC8lIbfNZaCyuPQHANjyYIXlvQeAbsWADQJFZgOHUqFqjh/A==
dependencies:
- html-to-text "9.0.3"
+ html-to-text "9.0.5"
pretty "2.0.0"
react "18.2.0"
react-dom "18.2.0"
-"@react-email/row@0.0.5":
- version "0.0.5"
- resolved "https://registry.npmjs.org/@react-email/row/-/row-0.0.5.tgz"
- integrity sha512-dir5l1M7Z/1BQqQkUrKUPIIDPt6ueEf6ScMGoBOcUh+VNNqmnqJE2Q2CH5X3w2uo6a5X7tnVhoJHGa2KTKe8Sw==
-
-"@react-email/section@0.0.9":
- version "0.0.9"
- resolved "https://registry.npmjs.org/@react-email/section/-/section-0.0.9.tgz"
- integrity sha512-3EbcWJ1jUZrzquWSvXrv8Hbk9V+BGvLcMWQIli4NdIpQlddmlGKUYfXU2mB2d2pf+5ojqkGcFZZ9fWxycB84jQ==
+"@react-email/render@0.0.9-canary.2":
+ version "0.0.9-canary.2"
+ resolved "https://registry.yarnpkg.com/@react-email/render/-/render-0.0.9-canary.2.tgz#f94f879b33c043d3fd930240dceb253d92376588"
+ integrity sha512-+bMkqkZwT4ZNZ3dp3eRYik53D1ehaPpnbUvVcfE5fZrSJ3VMymqnghGr6RasvnFci3DPObSB4Zk2VTrOuXYvnA==
dependencies:
+ html-to-text "9.0.5"
+ pretty "2.0.0"
react "18.2.0"
+ react-dom "18.2.0"
-"@react-email/tailwind@0.0.8":
- version "0.0.8"
- resolved "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.8.tgz"
- integrity sha512-0BLjD5GpiyBK7YDlaDrjHIpj9eTrrZrMJud3f1UPoCZhS+0S/M8LcR8WMbQsR+8/aLGmiy4F4TGZuRQcsJEsFw==
+"@react-email/row@0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/@react-email/row/-/row-0.0.6.tgz#5fe0bb959e4f629f4ded2e5e4a02c2dac459505e"
+ integrity sha512-msJ2TnDJNwpgDfDzUO63CvhusJHeaGLMM+8Zz86VPvxzwe/DkT7N48QKRWRCkt8urxVz5U+EgivORA9Dum9p3Q==
+
+"@react-email/section@0.0.10":
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/@react-email/section/-/section-0.0.10.tgz#69e0d9956f74a804ad6c5077b7a26e1e8c07edcc"
+ integrity sha512-x9B2KYFqj+d8I1fK9bgeVm/3mLE4Qgn4mm/GbDtcJeSzKU/G7bTb7/3+BMDk9SARPGkg5XAuZm1XgcqQQutt2A==
+
+"@react-email/tailwind@0.0.12":
+ version "0.0.12"
+ resolved "https://registry.yarnpkg.com/@react-email/tailwind/-/tailwind-0.0.12.tgz#1037843cbe7c0ffc48e468456e3dd2397803323a"
+ integrity sha512-s8Ch7GL30qRKScn9NWwItMqxjtzbyUtCnXfC6sL2YTVtulbfvZZ06W+aA0S6f7fdrVlOOlQzZuK/sVaQCHhcSw==
dependencies:
- html-react-parser "3.0.9"
react "18.2.0"
react-dom "18.2.0"
- tw-to-css "0.0.11"
+ tw-to-css "0.0.12"
-"@react-email/text@0.0.5":
- version "0.0.5"
- resolved "https://registry.npmjs.org/@react-email/text/-/text-0.0.5.tgz"
- integrity sha512-LXhHiaC6oRRsNAfOzJDos4wQA22eIdVJvR6G7uu4QzUvYNOAatDMf89jRQcKGrxX7InkS640v8sHd9jl5ztM5w==
- dependencies:
- react "18.2.0"
+"@react-email/text@0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/@react-email/text/-/text-0.0.6.tgz#c28a2b70f3e17de8e93e3fbdf9a18afff3623a29"
+ integrity sha512-PDUTAD1PjlzXFOIUrR1zuV2xxguL62yne5YLcn1k+u/dVUyzn6iU/5lFShxCfzuh3QDWCf4+JRNnXN9rmV6jzw==
"@react-spring/animated@~9.7.3":
version "9.7.3"
@@ -4707,6 +4734,33 @@
domhandler "^5.0.3"
selderee "^0.10.0"
+"@selderee/plugin-htmlparser2@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517"
+ integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==
+ dependencies:
+ domhandler "^5.0.3"
+ selderee "^0.11.0"
+
+"@sentry-internal/feedback@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.98.0.tgz#2dabbdc060dca49e79536ae99a9bd55f9c6f806f"
+ integrity sha512-t/mATvwkLcQLKRlx8SO5vlUjaadF6sT3lfR0PdWYyBy8qglbMTHDW4KP6JKh1gdzTVQGnwMByy+/4h9gy4AVzw==
+ dependencies:
+ "@sentry/core" "7.98.0"
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+
+"@sentry-internal/replay-canvas@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.98.0.tgz#108160c49f714a6021368fd60e08b7291fe44450"
+ integrity sha512-vAR6KIycyazaY9HwxG5UONrPTe8jeKtZr6k04svPC8OvcoI0xF+l1jMEYcarffuzKpZlPfssYb5ChHtKuXCB+Q==
+ dependencies:
+ "@sentry/core" "7.98.0"
+ "@sentry/replay" "7.98.0"
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+
"@sentry-internal/tracing@7.51.0":
version "7.51.0"
resolved "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.51.0.tgz"
@@ -4717,6 +4771,15 @@
"@sentry/utils" "7.51.0"
tslib "^1.9.3"
+"@sentry-internal/tracing@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.98.0.tgz#812ef7fce6b64794784f3279c66bc6b5cfd29d7f"
+ integrity sha512-FnhD2uMLIAJvv4XsYPv3qsTTtxrImyLxiZacudJyaWFhxoeVQ8bKKbWJ/Ar68FAwqTtjXMeY5evnEBbRMcQlaA==
+ dependencies:
+ "@sentry/core" "7.98.0"
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+
"@sentry/browser@7.51.0":
version "7.51.0"
resolved "https://registry.npmjs.org/@sentry/browser/-/browser-7.51.0.tgz"
@@ -4729,6 +4792,19 @@
"@sentry/utils" "7.51.0"
tslib "^1.9.3"
+"@sentry/browser@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.98.0.tgz#f249e6e38351de4cea1142f498e1169006e5dd76"
+ integrity sha512-/MzTS31N2iM6Qwyh4PSpHihgmkVD5xdfE5qi1mTlwQZz5Yz8t7MdMriX8bEDPlLB8sNxl7+D6/+KUJO8akX0nQ==
+ dependencies:
+ "@sentry-internal/feedback" "7.98.0"
+ "@sentry-internal/replay-canvas" "7.98.0"
+ "@sentry-internal/tracing" "7.98.0"
+ "@sentry/core" "7.98.0"
+ "@sentry/replay" "7.98.0"
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+
"@sentry/cli@^1.74.6":
version "1.75.2"
resolved "https://registry.npmjs.org/@sentry/cli/-/cli-1.75.2.tgz"
@@ -4741,6 +4817,18 @@
proxy-from-env "^1.1.0"
which "^2.0.2"
+"@sentry/cli@^1.77.1":
+ version "1.77.3"
+ resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.77.3.tgz#c40b4d09b0878d6565d42a915855add99db4fec3"
+ integrity sha512-c3eDqcDRmy4TFz2bFU5Y6QatlpoBPPa8cxBooaS4aMQpnIdLYPF1xhyyiW0LQlDUNc3rRjNF7oN5qKoaRoMTQQ==
+ dependencies:
+ https-proxy-agent "^5.0.0"
+ mkdirp "^0.5.5"
+ node-fetch "^2.6.7"
+ progress "^2.0.3"
+ proxy-from-env "^1.1.0"
+ which "^2.0.2"
+
"@sentry/core@7.51.0":
version "7.51.0"
resolved "https://registry.npmjs.org/@sentry/core/-/core-7.51.0.tgz"
@@ -4750,6 +4838,14 @@
"@sentry/utils" "7.51.0"
tslib "^1.9.3"
+"@sentry/core@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.98.0.tgz#e4f5353bc3986e510b8dd2507355787440d6e25d"
+ integrity sha512-baRUcpCNGyk7cApQHMfqEZJkXdvAKK+z/dVWiMqWc5T5uhzMnPE8/gjP1JZsMtJSQ8g5nHimBdI5TwOyZtxPaA==
+ dependencies:
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+
"@sentry/integrations@7.51.0":
version "7.51.0"
resolved "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.51.0.tgz"
@@ -4760,6 +4856,16 @@
localforage "^1.8.1"
tslib "^1.9.3"
+"@sentry/integrations@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.98.0.tgz#f497864fae2522375d83f4242f14818b175c2b3e"
+ integrity sha512-iHPA6oxG2Vkv3irWyWH714vSMwzESmD5fmU8MUWjr7XXzf8XeVqgn3HkftIaAWCIfZu5mDsfOlJ9qvM5Avst5g==
+ dependencies:
+ "@sentry/core" "7.98.0"
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+ localforage "^1.8.1"
+
"@sentry/nextjs@^7.51.0":
version "7.51.0"
resolved "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-7.51.0.tgz"
@@ -4778,6 +4884,25 @@
stacktrace-parser "^0.1.10"
tslib "^1.9.3"
+"@sentry/nextjs@^7.72.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.98.0.tgz#4e819914cef53e647d37f45d65c0f02539fa4ded"
+ integrity sha512-9j+fw5xiJyhVSG7yW/YhGrWSNRVw/DeyuEd3WX5He9UPNpXHOokCM7sQs61LIEvv2hAu5d4bK+U6/Ad85HWLhg==
+ dependencies:
+ "@rollup/plugin-commonjs" "24.0.0"
+ "@sentry/core" "7.98.0"
+ "@sentry/integrations" "7.98.0"
+ "@sentry/node" "7.98.0"
+ "@sentry/react" "7.98.0"
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+ "@sentry/vercel-edge" "7.98.0"
+ "@sentry/webpack-plugin" "1.21.0"
+ chalk "3.0.0"
+ resolve "1.22.8"
+ rollup "2.78.0"
+ stacktrace-parser "^0.1.10"
+
"@sentry/node@7.51.0":
version "7.51.0"
resolved "https://registry.npmjs.org/@sentry/node/-/node-7.51.0.tgz"
@@ -4792,6 +4917,16 @@
lru_map "^0.3.3"
tslib "^1.9.3"
+"@sentry/node@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.98.0.tgz#49d0a46e72f4e6116b4929d033322951e5a7e88b"
+ integrity sha512-9cHW217DnU9wC4iR+QxmY3q59N1Touh23hPMDtpMRmbRHSgrmLMoHTVPhK9zHsXRs0mUeidmMqY1ubAWauQByw==
+ dependencies:
+ "@sentry-internal/tracing" "7.98.0"
+ "@sentry/core" "7.98.0"
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+
"@sentry/react@7.51.0":
version "7.51.0"
resolved "https://registry.npmjs.org/@sentry/react/-/react-7.51.0.tgz"
@@ -4803,6 +4938,17 @@
hoist-non-react-statics "^3.3.2"
tslib "^1.9.3"
+"@sentry/react@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.98.0.tgz#f71598b7060e56b831da28bd3ddeeb455356fa89"
+ integrity sha512-rTvsAaGPuOGm2FvJAD8aB7iE+rUIrwYWKT4gANvg8zxRzPCK7ukKkpmL3SeJi7bvLNHYLATl1hUVDgm8VpHDng==
+ dependencies:
+ "@sentry/browser" "7.98.0"
+ "@sentry/core" "7.98.0"
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+ hoist-non-react-statics "^3.3.2"
+
"@sentry/replay@7.51.0":
version "7.51.0"
resolved "https://registry.npmjs.org/@sentry/replay/-/replay-7.51.0.tgz"
@@ -4812,11 +4958,26 @@
"@sentry/types" "7.51.0"
"@sentry/utils" "7.51.0"
+"@sentry/replay@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.98.0.tgz#21ba96d501260c1a33bc1af445f5cfbe02d0ba30"
+ integrity sha512-CQabv/3KnpMkpc2TzIquPu5krpjeMRAaDIO0OpTj5SQeH2RqSq3fVWNZkHa8tLsADxcfLFINxqOg2jd1NxvwxA==
+ dependencies:
+ "@sentry-internal/tracing" "7.98.0"
+ "@sentry/core" "7.98.0"
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+
"@sentry/types@7.51.0":
version "7.51.0"
resolved "https://registry.npmjs.org/@sentry/types/-/types-7.51.0.tgz"
integrity sha512-8REzzY0DslDryp6Yxj+tJ4NkXFHulLW9k8dgZV2Qo/0rBDMKir8g0IHYeN8ZBcnWrx2F+6rQb6uN6BjyLZY7Dg==
+"@sentry/types@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.98.0.tgz#6a88bf60679aea88ac6cba4d1517958726c2bafb"
+ integrity sha512-pc034ziM0VTETue4bfBcBqTWGy4w0okidtoZJjGVrYAfE95ObZnUGVj/XYIQ3FeCYWIa7NFN2MvdsCS0buwivQ==
+
"@sentry/utils@7.51.0":
version "7.51.0"
resolved "https://registry.npmjs.org/@sentry/utils/-/utils-7.51.0.tgz"
@@ -4825,6 +4986,23 @@
"@sentry/types" "7.51.0"
tslib "^1.9.3"
+"@sentry/utils@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.98.0.tgz#54355a197f7f71a6d17354a3d043022df402b502"
+ integrity sha512-0/LY+kpHxItVRY0xPDXPXVsKRb95cXsGSQf8sVMtfSjz++0bLL1U4k7PFz1c5s2/Vk0B8hS6duRrgMv6dMIZDw==
+ dependencies:
+ "@sentry/types" "7.98.0"
+
+"@sentry/vercel-edge@7.98.0":
+ version "7.98.0"
+ resolved "https://registry.yarnpkg.com/@sentry/vercel-edge/-/vercel-edge-7.98.0.tgz#34662365be874abb7a0f200f5563d28f560b0b47"
+ integrity sha512-sjUGy0sosKRBHPa73nAcJ1botb6t4Ib5lDfRIhNNVET7ywb1k51IvxL6o6SfKZ1+HgOuMc+N8ovcE+HuaWfXIw==
+ dependencies:
+ "@sentry-internal/tracing" "7.98.0"
+ "@sentry/core" "7.98.0"
+ "@sentry/types" "7.98.0"
+ "@sentry/utils" "7.98.0"
+
"@sentry/webpack-plugin@1.20.0":
version "1.20.0"
resolved "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.20.0.tgz"
@@ -4833,6 +5011,14 @@
"@sentry/cli" "^1.74.6"
webpack-sources "^2.0.0 || ^3.0.0"
+"@sentry/webpack-plugin@1.21.0":
+ version "1.21.0"
+ resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.21.0.tgz#bbe7cb293751f80246a4a56f9a7dd6de00f14b58"
+ integrity sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==
+ dependencies:
+ "@sentry/cli" "^1.77.1"
+ webpack-sources "^2.0.0 || ^3.0.0"
+
"@sideway/address@^4.1.3":
version "4.1.4"
resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz"
@@ -4855,6 +5041,11 @@
resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz"
integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==
+"@sinclair/typebox@^0.29.0":
+ version "0.29.6"
+ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.29.6.tgz#4cd8372f9247372edd5fc5af44f67e2032c46e2f"
+ integrity sha512-aX5IFYWlMa7tQ8xZr3b2gtVReCvg7f3LEhjir/JAjX2bJCMVJA5tIPv30wTD4KDfcwMd7DDYY3hFDeGmOgtrZQ==
+
"@sinonjs/commons@^2.0.0":
version "2.0.0"
resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz"
@@ -6265,13 +6456,6 @@
resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz"
integrity sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==
-"@swc/helpers@0.4.14":
- version "0.4.14"
- resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz"
- integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==
- dependencies:
- tslib "^2.4.0"
-
"@swc/helpers@0.5.1":
version "0.5.1"
resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz"
@@ -6279,6 +6463,13 @@
dependencies:
tslib "^2.4.0"
+"@swc/helpers@0.5.2":
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d"
+ integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==
+ dependencies:
+ tslib "^2.4.0"
+
"@swc/types@^0.1.5":
version "0.1.5"
resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz"
@@ -6341,27 +6532,25 @@
npm-to-yarn "^2.0.0"
unist-util-visit "^5.0.0"
-"@trpc/client@^10.38.4":
- version "10.38.4"
- resolved "https://registry.npmjs.org/@trpc/client/-/client-10.38.4.tgz"
- integrity sha512-svpZ9Iq9cnn+XfXQZF8PMt1YxAtNYeGiKZ/pGpcume7RqJrra/kWwU41gbax8d/cAg3YKUgNft9dZFKMYtXuYw==
+"@trpc/client@^10.43.6":
+ version "10.45.0"
+ resolved "https://registry.yarnpkg.com/@trpc/client/-/client-10.45.0.tgz#67cf34857cfa7e77bc498cb837c2226a42d24bf4"
+ integrity sha512-m091R1qte9rvkvL8N1e/mzrbb8S4gb+Q4ZNJnEGDgd7kic/6a8DFgSciBTiCoSp0YwOTVhyQzSrrA/sZI6PhBg==
-"@trpc/next@^10.38.4":
- version "10.38.4"
- resolved "https://registry.npmjs.org/@trpc/next/-/next-10.38.4.tgz"
- integrity sha512-PBpzJtHv6ycNOinydO546eIIgqqZ5SaI4gIO7CZGVD039lEWsQadHoTAEo3n3KLvwjo4kxtzGCl6WHUs6EOtTA==
- dependencies:
- react-ssr-prepass "^1.5.0"
+"@trpc/next@^10.43.6":
+ version "10.45.0"
+ resolved "https://registry.yarnpkg.com/@trpc/next/-/next-10.45.0.tgz#25422a28ef441445d5a3281c0aa6a0968381866d"
+ integrity sha512-saXajAb5GBpos9BNEtq/BeTOxmM4oCP3kyuGlMopNtHoacr71xHCItFnLsPWffM4DVW88uOXCFWaOtpOs5ThBw==
-"@trpc/react-query@^10.38.4":
- version "10.38.4"
- resolved "https://registry.npmjs.org/@trpc/react-query/-/react-query-10.38.4.tgz"
- integrity sha512-wEreUn9E+ZMKn/oRWlhHzmSgG5SG9WpmE1F27PPjn3I0S92aYRQvVsmV43v2OAL1VUYP2aHLk7gXx2luKLLRyw==
+"@trpc/react-query@^10.43.6":
+ version "10.45.0"
+ resolved "https://registry.yarnpkg.com/@trpc/react-query/-/react-query-10.45.0.tgz#848929e79399119e860d0212f8233d2ee83328c9"
+ integrity sha512-MMc2pLwoaLZVwvLQyzJv3uEmdG3lORhifhVzR/drtavwDYwt+OEvH0w3s1zC7RaDdFpc6Nj2kkpHmdoU7BlAAw==
-"@trpc/server@^10.38.4":
- version "10.38.4"
- resolved "https://registry.npmjs.org/@trpc/server/-/server-10.38.4.tgz"
- integrity sha512-xSMTwnKA/Unxu5fbAkQ7cApHeWj1rTEA3XgrGDcPHn03fmeIidIKxronM46N46ZF4CCexey4JWzu89XxA16uIA==
+"@trpc/server@^10.43.6":
+ version "10.45.0"
+ resolved "https://registry.yarnpkg.com/@trpc/server/-/server-10.45.0.tgz#be43a1a6e7f41ae86534716933717e80218ccdcb"
+ integrity sha512-2Fwzv6nqpE0Ie/G7PeS0EVR89zLm+c1Mw7T+RAGtU807j4oaUx0zGkBXTu5u9AI+j+BYNN2GZxJcuDTAecbr1A==
"@ts-morph/common@~0.21.0":
version "0.21.0"
@@ -6383,6 +6572,16 @@
mkdirp "^3.0.1"
path-browserify "^1.0.1"
+"@ts-morph/common@~0.22.0":
+ version "0.22.0"
+ resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.22.0.tgz#8951d451622a26472fbc3a227d6c3a90e687a683"
+ integrity sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==
+ dependencies:
+ fast-glob "^3.3.2"
+ minimatch "^9.0.3"
+ mkdirp "^3.0.1"
+ path-browserify "^1.0.1"
+
"@tsconfig/node10@^1.0.7":
version "1.0.9"
resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz"
@@ -7152,26 +7351,12 @@ acorn-jsx@^5.0.0, acorn-jsx@^5.3.1:
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn-node@^1.8.2:
- version "1.8.2"
- resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz"
- integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==
- dependencies:
- acorn "^7.0.0"
- acorn-walk "^7.0.0"
- xtend "^4.0.2"
-
-acorn-walk@^7.0.0:
- version "7.2.0"
- resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz"
- integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
-
acorn-walk@^8.1.1:
version "8.2.0"
resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
-acorn@^7.0.0, acorn@^7.4.0:
+acorn@^7.4.0:
version "7.4.1"
resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
@@ -7221,7 +7406,7 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^8.0.1:
+ajv@^8.0.1, ajv@^8.12.0:
version "8.12.0"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz"
integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
@@ -7470,15 +7655,6 @@ axe-core@^4.6.2:
resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz"
integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==
-axios@1.4.0:
- version "1.4.0"
- resolved "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz"
- integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==
- dependencies:
- follow-redirects "^1.15.0"
- form-data "^4.0.0"
- proxy-from-env "^1.1.0"
-
axios@^0.26.0:
version "0.26.1"
resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz"
@@ -8491,6 +8667,11 @@ code-block-writer@^12.0.0:
resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-12.0.0.tgz#4dd58946eb4234105aff7f0035977b2afdc2a770"
integrity sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==
+code-block-writer@^12.0.0:
+ version "12.0.0"
+ resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-12.0.0.tgz#4dd58946eb4234105aff7f0035977b2afdc2a770"
+ integrity sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==
+
collect-v8-coverage@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz"
@@ -8515,7 +8696,7 @@ color-name@1.1.3:
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
-color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4:
+color-name@^1.0.0, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
@@ -8783,6 +8964,13 @@ cronstrue@^2.14.0:
resolved "https://registry.npmjs.org/cronstrue/-/cronstrue-2.21.0.tgz"
integrity sha512-YxabE1ZSHA1zJZMPCTSEbc0u4cRRenjqqTgCwJT7OvkspPSvfYFITuPFtsT+VkBuavJtFv2kJXT+mKSnlUJxfg==
+cross-fetch@^3.1.5:
+ version "3.1.8"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82"
+ integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==
+ dependencies:
+ node-fetch "^2.6.12"
+
cross-spawn@^5.0.1:
version "5.1.0"
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz"
@@ -9296,9 +9484,9 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
-decamelize@^1.2.0:
+decamelize@1.2.0:
version "1.2.0"
- resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
decimal.js@^10.4.3:
@@ -9375,6 +9563,11 @@ deepmerge@^4.2.2:
resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz"
integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
+deepmerge@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+
defaults@^1.0.3:
version "1.0.4"
resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz"
@@ -9408,11 +9601,6 @@ define-properties@^1.2.0:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
-defined@^1.0.0:
- version "1.0.1"
- resolved "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz"
- integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==
-
delaunator@4:
version "4.0.1"
resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-4.0.1.tgz#3d779687f57919a7a418f8ab947d3bddb6846957"
@@ -9474,15 +9662,6 @@ detect-package-manager@2.0.1:
dependencies:
execa "^5.1.1"
-detective@^5.2.1:
- version "5.2.1"
- resolved "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz"
- integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==
- dependencies:
- acorn-node "^1.8.2"
- defined "^1.0.0"
- minimist "^1.2.6"
-
devlop@^1.0.0:
version "1.1.0"
resolved "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz"
@@ -9588,13 +9767,6 @@ domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0:
resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz"
integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
-domhandler@5.0.3, domhandler@^5.0.2, domhandler@^5.0.3:
- version "5.0.3"
- resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz"
- integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
- dependencies:
- domelementtype "^2.3.0"
-
domhandler@^2.3.0:
version "2.4.2"
resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz"
@@ -9616,6 +9788,13 @@ domhandler@^4.2.0:
dependencies:
domelementtype "^2.2.0"
+domhandler@^5.0.2, domhandler@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz"
+ integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
+ dependencies:
+ domelementtype "^2.3.0"
+
dompurify@3.0.3:
version "3.0.3"
resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.0.3.tgz"
@@ -9771,6 +9950,13 @@ emotion-theming@^10.0.10:
"@emotion/weak-memoize" "0.2.5"
hoist-non-react-statics "^3.3.0"
+encoding@^0.1.13:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
@@ -9795,7 +9981,7 @@ entities@^2.0.0:
resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz"
integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
-entities@^4.2.0, entities@^4.3.0, entities@^4.4.0:
+entities@^4.2.0, entities@^4.4.0:
version "4.5.0"
resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
@@ -10586,7 +10772,7 @@ focus-visible@^5.2.0:
resolved "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz"
integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==
-follow-redirects@^1.14.8, follow-redirects@^1.14.9, follow-redirects@^1.15.0:
+follow-redirects@^1.14.8, follow-redirects@^1.14.9:
version "1.15.2"
resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
@@ -11302,29 +11488,11 @@ hotkeys-js@3.9.4:
resolved "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.9.4.tgz"
integrity sha512-2zuLt85Ta+gIyvs4N88pCYskNrxf1TFv3LR9t5mdAZIX8BcgQQ48F2opUptvHa6m8zsy5v/a0i9mWzTrlNWU0Q==
-html-dom-parser@3.1.3:
- version "3.1.3"
- resolved "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-3.1.3.tgz"
- integrity sha512-fI0yyNlIeSboxU+jnrA4v8qj4+M8SI9/q6AKYdwCY2qki22UtKCDTxvagHniECu7sa5/o2zFRdLleA67035lsA==
- dependencies:
- domhandler "5.0.3"
- htmlparser2 "8.0.1"
-
html-escaper@^2.0.0:
version "2.0.2"
resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz"
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
-html-react-parser@3.0.9:
- version "3.0.9"
- resolved "https://registry.npmjs.org/html-react-parser/-/html-react-parser-3.0.9.tgz"
- integrity sha512-gOPZmaCMXNYu7Y9+58k2tLhTMXQ+QN8ctNFijzLuBxJaLZ6TsN+tUpN+MhbI+6nGaBCRGT2rpw6y/AqkTFZckg==
- dependencies:
- domhandler "5.0.3"
- html-dom-parser "3.1.3"
- react-property "2.0.0"
- style-to-js "1.1.3"
-
html-to-text@9.0.3:
version "9.0.3"
resolved "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.3.tgz"
@@ -11336,21 +11504,22 @@ html-to-text@9.0.3:
htmlparser2 "^8.0.1"
selderee "^0.10.0"
+html-to-text@9.0.5:
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d"
+ integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==
+ dependencies:
+ "@selderee/plugin-htmlparser2" "^0.11.0"
+ deepmerge "^4.3.1"
+ dom-serializer "^2.0.0"
+ htmlparser2 "^8.0.2"
+ selderee "^0.11.0"
+
html-void-elements@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz"
integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==
-htmlparser2@8.0.1:
- version "8.0.1"
- resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz"
- integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==
- dependencies:
- domelementtype "^2.3.0"
- domhandler "^5.0.2"
- domutils "^3.0.1"
- entities "^4.3.0"
-
htmlparser2@^3.9.1:
version "3.10.1"
resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz"
@@ -11373,7 +11542,7 @@ htmlparser2@^4.1.0:
domutils "^2.0.0"
entities "^2.0.0"
-htmlparser2@^8.0.1:
+htmlparser2@^8.0.1, htmlparser2@^8.0.2:
version "8.0.2"
resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz"
integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==
@@ -11403,7 +11572,7 @@ humanize-ms@^1.2.1:
dependencies:
ms "^2.0.0"
-iconv-lite@0.6, iconv-lite@^0.6.3:
+iconv-lite@0.6, iconv-lite@^0.6.2, iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@@ -12428,7 +12597,7 @@ jest@^29.4.2:
import-local "^3.0.2"
jest-cli "^29.4.2"
-jiti@^1.19.1:
+jiti@^1.18.2, jiti@^1.19.1:
version "1.21.0"
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
@@ -12486,6 +12655,13 @@ js-tiktoken@^1.0.7:
dependencies:
base64-js "^1.5.1"
+js-tiktoken@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.8.tgz#21ab8ae222e71226b2ef0d2f4b507fb10d66a114"
+ integrity sha512-r7XK3E9/I+SOrbAGqb39pyO/rHAS1diAOSRAvaaLfHgXjkUSK9AiSd+r84Vn2f/GvXJYRAxKj8NHrUvqlaH5qg==
+ dependencies:
+ base64-js "^1.5.1"
+
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
@@ -12706,37 +12882,39 @@ kleur@^4.0.3:
resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz"
integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==
-langchain@^0.0.130:
- version "0.0.130"
- resolved "https://registry.npmjs.org/langchain/-/langchain-0.0.130.tgz"
- integrity sha512-/7zsQdPPiR/XLHGJtbcBrOkI2njenmq7cco2MbYg3PDttWcSQar5VEO/bZtsI+PseaBFRZt0LT+6qkkWlyPfvQ==
+langchain@^0.1.2:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.7.tgz#fc7b5f7b995356e4a897232fb8c6257f2b091c51"
+ integrity sha512-aNBakxYcXjoL2KrGrt6gvOeJGgBPAL9MNe8tH8DeFKGWn/VaCPF5Xh7ABdyI1djMFX1if2mJUThSebZRS+KKOg==
dependencies:
- "@anthropic-ai/sdk" "^0.5.7"
- ansi-styles "^5.0.0"
+ "@anthropic-ai/sdk" "^0.9.1"
+ "@langchain/community" "~0.0.20"
+ "@langchain/core" "~0.1.16"
+ "@langchain/openai" "~0.0.12"
binary-extensions "^2.2.0"
- camelcase "6"
- decamelize "^1.2.0"
expr-eval "^2.0.2"
- flat "^5.0.2"
js-tiktoken "^1.0.7"
js-yaml "^4.1.0"
jsonpointer "^5.0.1"
- langsmith "~0.0.16"
+ langchainhub "~0.0.6"
+ langsmith "~0.0.59"
ml-distance "^4.0.0"
- object-hash "^3.0.0"
- openai "^3.3.0"
openapi-types "^12.1.3"
- p-queue "^6.6.2"
p-retry "4"
uuid "^9.0.0"
yaml "^2.2.1"
- zod "^3.21.4"
- zod-to-json-schema "^3.20.4"
+ zod "^3.22.4"
+ zod-to-json-schema "^3.22.3"
+
+langchainhub@~0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.6.tgz#9d2d06e4ce0807b4e8a31e19611f57aef990b54d"
+ integrity sha512-SW6105T+YP1cTe0yMf//7kyshCgvCTyFBMTgH2H3s9rTAR4e+78DA/BBrUL/Mt4Q5eMWui7iGuAYb3pgGsdQ9w==
-langsmith@~0.0.16:
- version "0.0.24"
- resolved "https://registry.npmjs.org/langsmith/-/langsmith-0.0.24.tgz"
- integrity sha512-wp04/ZPUZThVIJ817i4eqpyi2t/SWYeXBRbSr2I9S49AdSoou27X7ZGjmGyKL7U+bQRA7LrPgmcalhq0PUivWQ==
+langsmith@~0.0.48, langsmith@~0.0.59:
+ version "0.0.63"
+ resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.0.63.tgz#74ff8407dc2f4951f58b496533b88af5e7814861"
+ integrity sha512-8KtbiltWP8Ta7xErfXRvLudKgIoc/yRb9oSU8Ozh2215rlz9tnYicl37lS/ZdyeSbpSX8Rh8XhLTN5zVQ+5euA==
dependencies:
"@types/uuid" "^9.0.1"
commander "^10.0.1"
@@ -12810,7 +12988,7 @@ lie@~3.3.0:
dependencies:
immediate "~3.0.5"
-lilconfig@^2.0.5, lilconfig@^2.0.6, lilconfig@^2.1.0:
+lilconfig@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz"
integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
@@ -14120,6 +14298,11 @@ mkdirp@^3.0.1:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50"
integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==
+mkdirp@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50"
+ integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==
+
ml-array-mean@^1.1.6:
version "1.1.6"
resolved "https://registry.npmjs.org/ml-array-mean/-/ml-array-mean-1.1.6.tgz"
@@ -14384,29 +14567,27 @@ next-themes@^0.2.1:
integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==
next@^13.2.0:
- version "13.2.4"
- resolved "https://registry.npmjs.org/next/-/next-13.2.4.tgz"
- integrity sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==
+ version "13.5.6"
+ resolved "https://registry.yarnpkg.com/next/-/next-13.5.6.tgz#e964b5853272236c37ce0dd2c68302973cf010b1"
+ integrity sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==
dependencies:
- "@next/env" "13.2.4"
- "@swc/helpers" "0.4.14"
+ "@next/env" "13.5.6"
+ "@swc/helpers" "0.5.2"
+ busboy "1.6.0"
caniuse-lite "^1.0.30001406"
- postcss "8.4.14"
+ postcss "8.4.31"
styled-jsx "5.1.1"
+ watchpack "2.4.0"
optionalDependencies:
- "@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"
+ "@next/swc-darwin-arm64" "13.5.6"
+ "@next/swc-darwin-x64" "13.5.6"
+ "@next/swc-linux-arm64-gnu" "13.5.6"
+ "@next/swc-linux-arm64-musl" "13.5.6"
+ "@next/swc-linux-x64-gnu" "13.5.6"
+ "@next/swc-linux-x64-musl" "13.5.6"
+ "@next/swc-win32-arm64-msvc" "13.5.6"
+ "@next/swc-win32-ia32-msvc" "13.5.6"
+ "@next/swc-win32-x64-msvc" "13.5.6"
next@^13.4.17:
version "13.4.17"
@@ -14572,6 +14753,13 @@ node-fetch@^2.6.1, node-fetch@^2.6.7:
dependencies:
whatwg-url "^5.0.0"
+node-fetch@^2.6.12:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
+ integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
+ dependencies:
+ whatwg-url "^5.0.0"
+
node-gyp-build-optional-packages@5.0.3:
version "5.0.3"
resolved "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz"
@@ -14854,6 +15042,21 @@ openai@^3.3.0:
axios "^0.26.0"
form-data "^4.0.0"
+openai@^4.24.2:
+ version "4.26.0"
+ resolved "https://registry.yarnpkg.com/openai/-/openai-4.26.0.tgz#0363b9d390727705b89cd1b1ea8e38af2afd53b6"
+ integrity sha512-HPC7tgYdeP38F3uHA5WgnoXZyGbAp9jgcIo23p6It+q/07u4C+NZ8xHKlMShsPbDDmFRpPsa3vdbXYpbhJH3eg==
+ dependencies:
+ "@types/node" "^18.11.18"
+ "@types/node-fetch" "^2.6.4"
+ abort-controller "^3.0.0"
+ agentkeepalive "^4.2.1"
+ digest-fetch "^1.3.0"
+ form-data-encoder "1.7.2"
+ formdata-node "^4.3.2"
+ node-fetch "^2.6.7"
+ web-streams-polyfill "^3.2.1"
+
openapi-types@^12.1.3:
version "12.1.3"
resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz"
@@ -15113,6 +15316,14 @@ parseley@^0.11.0:
leac "^0.6.0"
peberminta "^0.8.0"
+parseley@^0.12.0:
+ version "0.12.1"
+ resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef"
+ integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==
+ dependencies:
+ leac "^0.6.0"
+ peberminta "^0.9.0"
+
pascal-case@^3.1.2:
version "3.1.2"
resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz"
@@ -15196,6 +15407,11 @@ peberminta@^0.8.0:
resolved "https://registry.npmjs.org/peberminta/-/peberminta-0.8.0.tgz"
integrity sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==
+peberminta@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352"
+ integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==
+
periscopic@^3.0.0:
version "3.1.0"
resolved "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz"
@@ -15369,15 +15585,6 @@ postcss-css-variables@0.18.0:
escape-string-regexp "^1.0.3"
extend "^3.0.1"
-postcss-import@^14.1.0:
- version "14.1.0"
- resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz"
- integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==
- dependencies:
- postcss-value-parser "^4.0.0"
- read-cache "^1.0.0"
- resolve "^1.1.7"
-
postcss-import@^15.1.0:
version "15.1.0"
resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70"
@@ -15387,21 +15594,13 @@ postcss-import@^15.1.0:
read-cache "^1.0.0"
resolve "^1.1.7"
-postcss-js@^4.0.0, postcss-js@^4.0.1:
+postcss-js@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz"
integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==
dependencies:
camelcase-css "^2.0.1"
-postcss-load-config@^3.1.4:
- version "3.1.4"
- resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz"
- integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==
- dependencies:
- lilconfig "^2.0.5"
- yaml "^1.10.2"
-
postcss-load-config@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3"
@@ -15410,13 +15609,6 @@ postcss-load-config@^4.0.1:
lilconfig "^3.0.0"
yaml "^2.3.4"
-postcss-nested@6.0.0:
- version "6.0.0"
- resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz"
- integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==
- dependencies:
- postcss-selector-parser "^6.0.10"
-
postcss-nested@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c"
@@ -15424,7 +15616,7 @@ postcss-nested@^6.0.1:
dependencies:
postcss-selector-parser "^6.0.11"
-postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11:
+postcss-selector-parser@^6.0.11:
version "6.0.13"
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz"
integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==
@@ -15446,12 +15638,12 @@ postcss@8.4.14:
picocolors "^1.0.0"
source-map-js "^1.0.2"
-postcss@8.4.21:
- version "8.4.21"
- resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz"
- integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==
+postcss@8.4.31:
+ version "8.4.31"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
+ integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
dependencies:
- nanoid "^3.3.4"
+ nanoid "^3.3.6"
picocolors "^1.0.0"
source-map-js "^1.0.2"
@@ -15463,15 +15655,6 @@ postcss@^7.0.27:
picocolors "^0.2.1"
source-map "^0.6.1"
-postcss@^8.0.9:
- version "8.4.24"
- resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz"
- integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==
- dependencies:
- nanoid "^3.3.6"
- picocolors "^1.0.0"
- source-map-js "^1.0.2"
-
postcss@^8.4.23, postcss@^8.4.32:
version "8.4.32"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9"
@@ -15738,6 +15921,10 @@ queue-tick@^1.0.1:
resolved "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz"
integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==
+quick-format-unescaped@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz"
+ integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==
quick-lru@^5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz"
@@ -15909,11 +16096,6 @@ react-markdown@^6.0.3:
unist-util-visit "^2.0.0"
vfile "^4.0.0"
-react-property@2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz"
- integrity sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==
-
react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.4:
version "2.3.4"
resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9"
@@ -15955,11 +16137,6 @@ react-remove-scroll@^2.5.6:
use-callback-ref "^1.3.0"
use-sidecar "^1.1.2"
-react-ssr-prepass@^1.5.0:
- version "1.5.0"
- resolved "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz"
- integrity sha512-yFNHrlVEReVYKsLI5lF05tZoHveA5pGzjFbFJY/3pOqqjGOmMmqx83N4hIjN2n6E1AOa+eQEUxs3CgRnPmT0RQ==
-
react-style-singleton@^2.2.1:
version "2.2.1"
resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz"
@@ -16344,13 +16521,12 @@ require-from-string@^2.0.2:
resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
-resend@^0.15.3:
- version "0.15.3"
- resolved "https://registry.npmjs.org/resend/-/resend-0.15.3.tgz"
- integrity sha512-dzXHBaOjOS3ufBGjqiJjMe7LnproEn/jiAyBjg6IBtp56MCfih0O4IS4JeBcfj3y2Afm+tZITfoZAylKWLEJOg==
+resend@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/resend/-/resend-2.1.0.tgz#969030fc67d7a24db6533b89d09c4c85e888e20d"
+ integrity sha512-s6LlaEReTUvlbo6w3Eg1M1TMuwK9OKJ1GVgyptIV8smLPHhFZVqnwBTFPZHID9rcsih72t3iuyrtkQ3IIGwnow==
dependencies:
- "@react-email/render" "0.0.7"
- axios "1.4.0"
+ "@react-email/render" "0.0.9"
resolve-cwd@^3.0.0:
version "3.0.0"
@@ -16374,6 +16550,15 @@ resolve.exports@^2.0.0:
resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz"
integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==
+resolve@1.22.8, resolve@^1.22.2:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
resolve@^1.1.6, resolve@^1.1.7, resolve@^1.12.0:
version "1.22.2"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz"
@@ -16392,15 +16577,6 @@ resolve@^1.10.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.2
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
-resolve@^1.22.2:
- version "1.22.8"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
- integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
- dependencies:
- is-core-module "^2.13.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
resolve@^2.0.0-next.4:
version "2.0.0-next.4"
resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz"
@@ -16576,6 +16752,13 @@ selderee@^0.10.0:
dependencies:
parseley "^0.11.0"
+selderee@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a"
+ integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==
+ dependencies:
+ parseley "^0.12.0"
+
"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0, semver@^5.7.1:
version "5.7.1"
resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"
@@ -16624,6 +16807,11 @@ seq-queue@^0.0.5:
resolved "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz"
integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==
+server-only@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/server-only/-/server-only-0.0.1.tgz#0f366bb6afb618c37c9255a314535dc412cd1c9e"
+ integrity sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==
+
set-function-length@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed"
@@ -17206,27 +17394,20 @@ strnum@^1.0.5:
resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz"
integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==
-style-to-js@1.1.3:
- version "1.1.3"
- resolved "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.3.tgz"
- integrity sha512-zKI5gN/zb7LS/Vm0eUwjmjrXWw8IMtyA8aPBJZdYiQTXj4+wQ3IucOLIOnF7zCHxvW8UhIGh/uZh/t9zEHXNTQ==
+style-to-object@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz"
+ integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==
dependencies:
- style-to-object "0.4.1"
+ inline-style-parser "0.1.1"
-style-to-object@0.4.1, style-to-object@^0.4.1:
+style-to-object@^0.4.1:
version "0.4.1"
resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz"
integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==
dependencies:
inline-style-parser "0.1.1"
-style-to-object@^0.3.0:
- version "0.3.0"
- resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz"
- integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==
- dependencies:
- inline-style-parser "0.1.1"
-
styled-jsx@5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz"
@@ -17361,34 +17542,34 @@ tailwindcss-animate@^1.0.7:
resolved "https://registry.yarnpkg.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz#318b692c4c42676cc9e67b19b78775742388bef4"
integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==
-tailwindcss@3.2.7:
- version "3.2.7"
- resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz"
- integrity sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==
+tailwindcss@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3"
+ integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==
dependencies:
+ "@alloc/quick-lru" "^5.2.0"
arg "^5.0.2"
chokidar "^3.5.3"
- color-name "^1.1.4"
- detective "^5.2.1"
didyoumean "^1.2.2"
dlv "^1.1.3"
fast-glob "^3.2.12"
glob-parent "^6.0.2"
is-glob "^4.0.3"
- lilconfig "^2.0.6"
+ jiti "^1.18.2"
+ lilconfig "^2.1.0"
micromatch "^4.0.5"
normalize-path "^3.0.0"
object-hash "^3.0.0"
picocolors "^1.0.0"
- postcss "^8.0.9"
- postcss-import "^14.1.0"
- postcss-js "^4.0.0"
- postcss-load-config "^3.1.4"
- postcss-nested "6.0.0"
+ postcss "^8.4.23"
+ postcss-import "^15.1.0"
+ postcss-js "^4.0.1"
+ postcss-load-config "^4.0.1"
+ postcss-nested "^6.0.1"
postcss-selector-parser "^6.0.11"
postcss-value-parser "^4.2.0"
- quick-lru "^5.1.1"
- resolve "^1.22.1"
+ resolve "^1.22.2"
+ sucrase "^3.32.0"
tailwindcss@^3.3.6:
version "3.3.6"
@@ -17706,6 +17887,14 @@ ts-morph@^21.0.1:
"@ts-morph/common" "~0.22.0"
code-block-writer "^12.0.0"
+ts-morph@^21.0.1:
+ version "21.0.1"
+ resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-21.0.1.tgz#712302a0f6e9dbf1aa8d9cf33a4386c4b18c2006"
+ integrity sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==
+ dependencies:
+ "@ts-morph/common" "~0.22.0"
+ code-block-writer "^12.0.0"
+
ts-node@^10.9.1:
version "10.9.1"
resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz"
@@ -17816,14 +18005,14 @@ turbo@^1.7.3:
turbo-windows-64 "1.7.3"
turbo-windows-arm64 "1.7.3"
-tw-to-css@0.0.11:
- version "0.0.11"
- resolved "https://registry.npmjs.org/tw-to-css/-/tw-to-css-0.0.11.tgz"
- integrity sha512-uIJuEBIwyHzZg9xyGyEgDWHIkbAwEC4bhEHQ4THPuN5SToR7Zlhes5ffMjqtrv+WdtTmudTHTdc9VwUldy0FxQ==
+tw-to-css@0.0.12:
+ version "0.0.12"
+ resolved "https://registry.yarnpkg.com/tw-to-css/-/tw-to-css-0.0.12.tgz#14fb5a6b9ffb10018c7326a9ab3b7bca9bf1b7a1"
+ integrity sha512-rQAsQvOtV1lBkyCw+iypMygNHrShYAItES5r8fMsrhhaj5qrV2LkZyXc8ccEH+u5bFjHjQ9iuxe90I7Kykf6pw==
dependencies:
- postcss "8.4.21"
+ postcss "8.4.31"
postcss-css-variables "0.18.0"
- tailwindcss "3.2.7"
+ tailwindcss "3.3.2"
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
@@ -18439,6 +18628,11 @@ web-streams-polyfill@4.0.0-beta.3:
resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz"
integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==
+web-streams-polyfill@^3.2.1:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz#32e26522e05128203a7de59519be3c648004343b"
+ integrity sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==
+
web-worker@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz"
@@ -18596,7 +18790,7 @@ write-file-atomic@^4.0.2:
imurmurhash "^0.1.4"
signal-exit "^3.0.7"
-xtend@^4.0.0, xtend@^4.0.2:
+xtend@^4.0.0:
version "4.0.2"
resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
@@ -18635,7 +18829,7 @@ yallist@^4.0.0:
resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2:
+yaml@^1.10.0, yaml@^1.7.2:
version "1.10.2"
resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
@@ -18698,10 +18892,15 @@ yocto-queue@^0.1.0:
resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
-zod-to-json-schema@^3.20.4:
- version "3.21.3"
- resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.21.3.tgz"
- integrity sha512-09W/9oyxeF1/wWnzCb6MursW+lOzgKi91QwE7eTBbC+t/qgfuLsUVDai3lHemSQnQu/UONAcT/fv3ZnDvbTeKg==
+zod-to-json-schema@3.20.3:
+ version "3.20.3"
+ resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.20.3.tgz#8c95d8c20f20455ffa0b4b526c29703f35f6d787"
+ integrity sha512-/Q3wnyxAfCt94ZcrGiXXoiAfRqasxl9CX64LZ9fj+4dKH68zulUtU0uk1WMxQPfAxQ0ZI70dKzcoW7hHj+DwSQ==
+
+zod-to-json-schema@^3.22.3:
+ version "3.22.3"
+ resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.3.tgz#1c71f9fa23f80b2f3b5eed537afa8a13a66a5200"
+ integrity sha512-9isG8SqRe07p+Aio2ruBZmLm2Q6Sq4EqmXOiNpDxp+7f0LV6Q/LX65fs5Nn+FV/CzfF3NLBoksXbS2jNYIfpKw==
zod@3.21.4, zod@^3.20.2, zod@^3.21.4:
version "3.21.4"
@@ -18713,6 +18912,11 @@ zod@^3.22.2:
resolved "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz"
integrity sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==
+zod@^3.22.3, zod@^3.22.4:
+ version "3.22.4"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff"
+ integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==
+
zwitch@^1.0.0:
version "1.0.5"
resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz"