diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..be3828ee
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,17 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_style = tab
+indent_size = 1
+tab_width = 2
+insert_final_newline = true
+max_line_length = 100
+trim_trailing_whitespace = true
+
+[*.json]
+indent_style = space
+
+[*.{yaml,yml}]
+indent_style = space
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000..b0251140
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,27 @@
+# yaml-language-server: $schema=https://json.schemastore.org/dependabot-2.0.json
+
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
+
+# It's suppose to work with bun
+# https://github.com/dependabot/dependabot-core/issues/6528
+
+version: 2
+
+updates:
+ - package-ecosystem: github-actions
+ directory: /
+ schedule:
+ interval: monthly
+ commit-message:
+ prefix: ci
+
+ - package-ecosystem: npm # See documentation for possible values
+ directories:
+ - /
+ commit-message:
+ prefix: deps
+ schedule:
+ interval: weekly
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..c958b148
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,25 @@
+# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
+name: CI
+
+on:
+ pull_request:
+ branches: [ main ]
+ push:
+ branches: [ main ]
+
+jobs:
+ lint-format:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Harden the runner (Audit all outbound calls)
+ uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
+ with:
+ egress-policy: audit
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+ # https://biomejs.dev/recipes/continuous-integration/#github-actions
+ - name: Lint with Biome
+ uses: biomejs/setup-biome@c016c38f26f2c4a6eb3662679143614a254263fd # v2.3.0
+ with:
+ version: latest
+ - name: Run Biome
+ run: biome ci .
diff --git a/.prettierignore b/.prettierignore
deleted file mode 100644
index 1380c2e7..00000000
--- a/.prettierignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-.next
\ No newline at end of file
diff --git a/apps/web/components.json b/apps/web/components.json
index a96e8e04..a367f4b0 100644
--- a/apps/web/components.json
+++ b/apps/web/components.json
@@ -1,20 +1,20 @@
{
- "$schema": "https://ui.shadcn.com/schema.json",
- "style": "new-york",
- "rsc": true,
- "tsx": true,
- "tailwind": {
- "config": "",
- "css": "src/app/globals.css",
- "baseColor": "neutral",
- "cssVariables": true
- },
- "iconLibrary": "lucide",
- "aliases": {
- "components": "@/components",
- "utils": "@/lib/utils",
- "hooks": "@/hooks",
- "lib": "@/lib",
- "ui": "@/components/ui"
- }
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "new-york",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "",
+ "css": "src/app/globals.css",
+ "baseColor": "neutral",
+ "cssVariables": true
+ },
+ "iconLibrary": "lucide",
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "hooks": "@/hooks",
+ "lib": "@/lib",
+ "ui": "@/components/ui"
+ }
}
diff --git a/apps/web/eslint.config.mjs b/apps/web/eslint.config.mjs
deleted file mode 100644
index 7e616e6e..00000000
--- a/apps/web/eslint.config.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { config } from "@repo/eslint-config/next";
-
-/** @type {import("eslint").Linter.Config} */
-export default config;
\ No newline at end of file
diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts
index e9ffa308..9fb6c0df 100644
--- a/apps/web/next.config.ts
+++ b/apps/web/next.config.ts
@@ -1,7 +1,9 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
- /* config options here */
+ eslint: {
+ ignoreDuringBuilds: true,
+ },
};
export default nextConfig;
diff --git a/apps/web/package.json b/apps/web/package.json
index f388c860..20321670 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -1,45 +1,40 @@
{
- "name": "@repo/web",
- "version": "0.1.0",
- "private": true,
- "scripts": {
- "dev": "next dev --turbopack --port 3000",
- "build": "next build",
- "start": "next start",
- "lint": "next lint"
- },
- "dependencies": {
- "@radix-ui/react-label": "^2.1.6",
- "@radix-ui/react-slot": "^1.2.2",
- "@repo/api": "workspace:*",
- "@repo/auth": "workspace:*",
- "@repo/env": "workspace:*",
- "@tanstack/react-query": "^5.76.1",
- "@trpc/client": "^11.1.2",
- "@trpc/server": "^11.1.2",
- "@trpc/tanstack-react-query": "^11.1.2",
- "better-auth": "^1.2.8",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "lucide-react": "^0.511.0",
- "next": "15.3.2",
- "react": "^19.0.0",
- "react-dom": "^19.0.0",
- "superjson": "^2.2.2",
- "tailwind-merge": "^3.3.0",
- "tw-animate-css": "^1.3.0"
- },
- "devDependencies": {
- "@eslint/eslintrc": "^3",
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@tailwindcss/postcss": "^4",
- "@types/node": "^20",
- "@types/react": "^19",
- "@types/react-dom": "^19",
- "eslint": "^9",
- "eslint-config-next": "15.3.2",
- "tailwindcss": "^4",
- "typescript": "^5"
- }
+ "name": "@repo/web",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev --turbopack --port 3000",
+ "build": "next build",
+ "start": "next start"
+ },
+ "dependencies": {
+ "@radix-ui/react-label": "^2.1.6",
+ "@radix-ui/react-slot": "^1.2.2",
+ "@repo/api": "workspace:*",
+ "@repo/auth": "workspace:*",
+ "@repo/env": "workspace:*",
+ "@tanstack/react-query": "^5.76.1",
+ "@trpc/client": "^11.1.2",
+ "@trpc/server": "^11.1.2",
+ "@trpc/tanstack-react-query": "^11.1.2",
+ "better-auth": "^1.2.8",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "lucide-react": "^0.511.0",
+ "next": "15.3.2",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "superjson": "^2.2.2",
+ "tailwind-merge": "^3.3.0",
+ "tw-animate-css": "^1.3.0"
+ },
+ "devDependencies": {
+ "@repo/typescript-config": "workspace:*",
+ "@tailwindcss/postcss": "^4",
+ "@types/node": "^20",
+ "@types/react": "^19",
+ "@types/react-dom": "^19",
+ "tailwindcss": "^4",
+ "typescript": "^5"
+ }
}
diff --git a/apps/web/src/app/(auth)/login/page.tsx b/apps/web/src/app/(auth)/login/page.tsx
index aeaf371f..a4dad4d8 100644
--- a/apps/web/src/app/(auth)/login/page.tsx
+++ b/apps/web/src/app/(auth)/login/page.tsx
@@ -5,19 +5,19 @@ import { auth } from "@repo/auth/server";
import { SignInForm } from "./sign-in-form";
export const metadata: Metadata = {
- title: "Sign In - Analog",
+ title: "Sign In - Analog",
};
export default async function Page() {
- const session = await auth.api.getSession({ headers: await headers() });
+ const session = await auth.api.getSession({ headers: await headers() });
- if (session) {
- redirect("/");
- }
+ if (session) {
+ redirect("/");
+ }
- return (
-
-
-
- );
+ return (
+
+
+
+ );
}
diff --git a/apps/web/src/app/(auth)/login/sign-in-form.tsx b/apps/web/src/app/(auth)/login/sign-in-form.tsx
index 2c11239d..13a7d0ae 100644
--- a/apps/web/src/app/(auth)/login/sign-in-form.tsx
+++ b/apps/web/src/app/(auth)/login/sign-in-form.tsx
@@ -5,88 +5,77 @@ import Link from "next/link";
import { authClient } from "@repo/auth/client";
import { Button } from "@/components/ui/button";
import {
- Card,
- CardContent,
- CardHeader,
- CardTitle,
- CardDescription,
- CardFooter,
+ Card,
+ CardContent,
+ CardHeader,
+ CardTitle,
+ CardDescription,
+ CardFooter,
} from "@/components/ui/card";
import { Google } from "@/components/icons/google";
import { cn } from "@/lib/utils";
interface SignInFormProps {
- redirectUrl?: string;
+ redirectUrl?: string;
}
export function SignInForm({ redirectUrl = "/" }: SignInFormProps) {
- const [loading, setLoading] = useState(false);
+ const [loading, setLoading] = useState(false);
- const signInWithGoogle = async () => {
- await authClient.signIn.social(
- {
- provider: "google",
- callbackURL: redirectUrl,
- },
- {
- onRequest: () => {
- setLoading(true);
- },
- onResponse: () => {
- setLoading(false);
- },
- },
- );
- };
+ const signInWithGoogle = async () => {
+ await authClient.signIn.social(
+ {
+ provider: "google",
+ callbackURL: redirectUrl,
+ },
+ {
+ onRequest: () => {
+ setLoading(true);
+ },
+ onResponse: () => {
+ setLoading(false);
+ },
+ },
+ );
+ };
- return (
-
-
- Analog
-
- The calendar that changes everything
-
-
-
-
-
-
-
-
-
-
-
-
- By continuing, you agree to our{" "}
-
- Terms of Service
- {" "}
- and{" "}
-
- Privacy Policy
-
-
-
-
-
- );
+ return (
+
+
+ Analog
+
+ The calendar that changes everything
+
+
+
+
+
+
+
+
+
+
+
+
+ By continuing, you agree to our{" "}
+
+ Terms of Service
+ {" "}
+ and{" "}
+
+ Privacy Policy
+
+
+
+
+
+ );
}
diff --git a/apps/web/src/app/api/trpc/[trpc]/route.ts b/apps/web/src/app/api/trpc/[trpc]/route.ts
index 1e88433c..96fcf4a2 100644
--- a/apps/web/src/app/api/trpc/[trpc]/route.ts
+++ b/apps/web/src/app/api/trpc/[trpc]/route.ts
@@ -4,19 +4,17 @@ import { appRouter, createContext } from "@repo/api";
import { env } from "@repo/env/server";
const handler = (req: NextRequest) =>
- fetchRequestHandler({
- endpoint: "/api/trpc",
- req,
- router: appRouter,
- createContext: () => createContext({ headers: req.headers }),
- onError:
- env.NODE_ENV === "development"
- ? ({ path, error }) => {
- console.error(
- `❌ tRPC failed on ${path ?? ""}: ${error.message}`,
- );
- }
- : undefined,
- });
+ fetchRequestHandler({
+ endpoint: "/api/trpc",
+ req,
+ router: appRouter,
+ createContext: () => createContext({ headers: req.headers }),
+ onError:
+ 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/web/src/app/globals.css b/apps/web/src/app/globals.css
index 43d02bf8..eccd7bf6 100644
--- a/apps/web/src/app/globals.css
+++ b/apps/web/src/app/globals.css
@@ -4,122 +4,122 @@
@custom-variant dark (&:is(.dark *));
:root {
- --background: oklch(1 0 0);
- --foreground: oklch(0.145 0 0);
- --card: oklch(1 0 0);
- --card-foreground: oklch(0.145 0 0);
- --popover: oklch(1 0 0);
- --popover-foreground: oklch(0.145 0 0);
- --primary: oklch(0.205 0 0);
- --primary-foreground: oklch(0.985 0 0);
- --secondary: oklch(0.97 0 0);
- --secondary-foreground: oklch(0.205 0 0);
- --muted: oklch(0.97 0 0);
- --muted-foreground: oklch(0.556 0 0);
- --accent: oklch(0.97 0 0);
- --accent-foreground: oklch(0.205 0 0);
- --destructive: oklch(0.577 0.245 27.325);
- --destructive-foreground: oklch(0.577 0.245 27.325);
- --border: oklch(0.922 0 0);
- --input: oklch(0.922 0 0);
- --ring: oklch(0.708 0 0);
- --chart-1: oklch(0.646 0.222 41.116);
- --chart-2: oklch(0.6 0.118 184.704);
- --chart-3: oklch(0.398 0.07 227.392);
- --chart-4: oklch(0.828 0.189 84.429);
- --chart-5: oklch(0.769 0.188 70.08);
- --radius: 0.625rem;
- --sidebar: oklch(0.985 0 0);
- --sidebar-foreground: oklch(0.145 0 0);
- --sidebar-primary: oklch(0.205 0 0);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.97 0 0);
- --sidebar-accent-foreground: oklch(0.205 0 0);
- --sidebar-border: oklch(0.922 0 0);
- --sidebar-ring: oklch(0.708 0 0);
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.145 0 0);
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.145 0 0);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.145 0 0);
+ --primary: oklch(0.205 0 0);
+ --primary-foreground: oklch(0.985 0 0);
+ --secondary: oklch(0.97 0 0);
+ --secondary-foreground: oklch(0.205 0 0);
+ --muted: oklch(0.97 0 0);
+ --muted-foreground: oklch(0.556 0 0);
+ --accent: oklch(0.97 0 0);
+ --accent-foreground: oklch(0.205 0 0);
+ --destructive: oklch(0.577 0.245 27.325);
+ --destructive-foreground: oklch(0.577 0.245 27.325);
+ --border: oklch(0.922 0 0);
+ --input: oklch(0.922 0 0);
+ --ring: oklch(0.708 0 0);
+ --chart-1: oklch(0.646 0.222 41.116);
+ --chart-2: oklch(0.6 0.118 184.704);
+ --chart-3: oklch(0.398 0.07 227.392);
+ --chart-4: oklch(0.828 0.189 84.429);
+ --chart-5: oklch(0.769 0.188 70.08);
+ --radius: 0.625rem;
+ --sidebar: oklch(0.985 0 0);
+ --sidebar-foreground: oklch(0.145 0 0);
+ --sidebar-primary: oklch(0.205 0 0);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.97 0 0);
+ --sidebar-accent-foreground: oklch(0.205 0 0);
+ --sidebar-border: oklch(0.922 0 0);
+ --sidebar-ring: oklch(0.708 0 0);
}
.dark {
- --background: oklch(0.145 0 0);
- --foreground: oklch(0.985 0 0);
- --card: oklch(0.145 0 0);
- --card-foreground: oklch(0.985 0 0);
- --popover: oklch(0.145 0 0);
- --popover-foreground: oklch(0.985 0 0);
- --primary: oklch(0.985 0 0);
- --primary-foreground: oklch(0.205 0 0);
- --secondary: oklch(0.269 0 0);
- --secondary-foreground: oklch(0.985 0 0);
- --muted: oklch(0.269 0 0);
- --muted-foreground: oklch(0.708 0 0);
- --accent: oklch(0.269 0 0);
- --accent-foreground: oklch(0.985 0 0);
- --destructive: oklch(0.396 0.141 25.723);
- --destructive-foreground: oklch(0.637 0.237 25.331);
- --border: oklch(0.269 0 0);
- --input: oklch(0.269 0 0);
- --ring: oklch(0.439 0 0);
- --chart-1: oklch(0.488 0.243 264.376);
- --chart-2: oklch(0.696 0.17 162.48);
- --chart-3: oklch(0.769 0.188 70.08);
- --chart-4: oklch(0.627 0.265 303.9);
- --chart-5: oklch(0.645 0.246 16.439);
- --sidebar: oklch(0.205 0 0);
- --sidebar-foreground: oklch(0.985 0 0);
- --sidebar-primary: oklch(0.488 0.243 264.376);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.269 0 0);
- --sidebar-accent-foreground: oklch(0.985 0 0);
- --sidebar-border: oklch(0.269 0 0);
- --sidebar-ring: oklch(0.439 0 0);
+ --background: oklch(0.145 0 0);
+ --foreground: oklch(0.985 0 0);
+ --card: oklch(0.145 0 0);
+ --card-foreground: oklch(0.985 0 0);
+ --popover: oklch(0.145 0 0);
+ --popover-foreground: oklch(0.985 0 0);
+ --primary: oklch(0.985 0 0);
+ --primary-foreground: oklch(0.205 0 0);
+ --secondary: oklch(0.269 0 0);
+ --secondary-foreground: oklch(0.985 0 0);
+ --muted: oklch(0.269 0 0);
+ --muted-foreground: oklch(0.708 0 0);
+ --accent: oklch(0.269 0 0);
+ --accent-foreground: oklch(0.985 0 0);
+ --destructive: oklch(0.396 0.141 25.723);
+ --destructive-foreground: oklch(0.637 0.237 25.331);
+ --border: oklch(0.269 0 0);
+ --input: oklch(0.269 0 0);
+ --ring: oklch(0.439 0 0);
+ --chart-1: oklch(0.488 0.243 264.376);
+ --chart-2: oklch(0.696 0.17 162.48);
+ --chart-3: oklch(0.769 0.188 70.08);
+ --chart-4: oklch(0.627 0.265 303.9);
+ --chart-5: oklch(0.645 0.246 16.439);
+ --sidebar: oklch(0.205 0 0);
+ --sidebar-foreground: oklch(0.985 0 0);
+ --sidebar-primary: oklch(0.488 0.243 264.376);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.269 0 0);
+ --sidebar-accent-foreground: oklch(0.985 0 0);
+ --sidebar-border: oklch(0.269 0 0);
+ --sidebar-ring: oklch(0.439 0 0);
}
@theme inline {
- --font-sans: var(--font-geist-sans);
- --font-mono: var(--font-geist-mono);
- --color-background: var(--background);
- --color-foreground: var(--foreground);
- --color-card: var(--card);
- --color-card-foreground: var(--card-foreground);
- --color-popover: var(--popover);
- --color-popover-foreground: var(--popover-foreground);
- --color-primary: var(--primary);
- --color-primary-foreground: var(--primary-foreground);
- --color-secondary: var(--secondary);
- --color-secondary-foreground: var(--secondary-foreground);
- --color-muted: var(--muted);
- --color-muted-foreground: var(--muted-foreground);
- --color-accent: var(--accent);
- --color-accent-foreground: var(--accent-foreground);
- --color-destructive: var(--destructive);
- --color-destructive-foreground: var(--destructive-foreground);
- --color-border: var(--border);
- --color-input: var(--input);
- --color-ring: var(--ring);
- --color-chart-1: var(--chart-1);
- --color-chart-2: var(--chart-2);
- --color-chart-3: var(--chart-3);
- --color-chart-4: var(--chart-4);
- --color-chart-5: var(--chart-5);
- --radius-sm: calc(var(--radius) - 4px);
- --radius-md: calc(var(--radius) - 2px);
- --radius-lg: var(--radius);
- --radius-xl: calc(var(--radius) + 4px);
- --color-sidebar: var(--sidebar);
- --color-sidebar-foreground: var(--sidebar-foreground);
- --color-sidebar-primary: var(--sidebar-primary);
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
- --color-sidebar-accent: var(--sidebar-accent);
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
- --color-sidebar-border: var(--sidebar-border);
- --color-sidebar-ring: var(--sidebar-ring);
+ --font-sans: var(--font-geist-sans);
+ --font-mono: var(--font-geist-mono);
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-destructive-foreground: var(--destructive-foreground);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-ring: var(--ring);
+ --color-chart-1: var(--chart-1);
+ --color-chart-2: var(--chart-2);
+ --color-chart-3: var(--chart-3);
+ --color-chart-4: var(--chart-4);
+ --color-chart-5: var(--chart-5);
+ --radius-sm: calc(var(--radius) - 4px);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) + 4px);
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-ring: var(--sidebar-ring);
}
@layer base {
- * {
- @apply border-border outline-ring/50;
- }
- body {
- @apply bg-background text-foreground;
- }
+ * {
+ @apply border-border outline-ring/50;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
}
diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx
index 21a01c10..515283f9 100644
--- a/apps/web/src/app/layout.tsx
+++ b/apps/web/src/app/layout.tsx
@@ -5,29 +5,25 @@ import "./globals.css";
import { Providers } from "./providers";
const geistSans = Geist({
- variable: "--font-geist-sans",
- subsets: ["latin"],
+ variable: "--font-geist-sans",
+ subsets: ["latin"],
});
const geistMono = Geist_Mono({
- variable: "--font-geist-mono",
- subsets: ["latin"],
+ variable: "--font-geist-mono",
+ subsets: ["latin"],
});
export const metadata: Metadata = {
- title: "Analog",
+ title: "Analog",
};
-export default function RootLayout({
- children,
-}: Readonly<{ children: ReactNode }>) {
- return (
-
-
- {children}
-
-
- );
+export default function RootLayout({ children }: Readonly<{ children: ReactNode }>) {
+ return (
+
+
+ {children}
+
+
+ );
}
diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx
index 83eb37f6..7e8b3e1c 100644
--- a/apps/web/src/app/page.tsx
+++ b/apps/web/src/app/page.tsx
@@ -3,11 +3,11 @@ import { redirect } from "next/navigation";
import { auth } from "@repo/auth/server";
export default async function Home() {
- const session = await auth.api.getSession({ headers: await headers() });
+ const session = await auth.api.getSession({ headers: await headers() });
- if (!session) {
- redirect("/login")
- }
+ if (!session) {
+ redirect("/login");
+ }
- return ;
+ return ;
}
diff --git a/apps/web/src/app/providers.tsx b/apps/web/src/app/providers.tsx
index 6762c316..f058f62e 100644
--- a/apps/web/src/app/providers.tsx
+++ b/apps/web/src/app/providers.tsx
@@ -2,5 +2,5 @@ import type { ReactNode } from "react";
import { TRPCReactProvider } from "@/lib/trpc/client";
export function Providers(props: Readonly<{ children: ReactNode }>) {
- return {props.children};
+ return {props.children};
}
diff --git a/apps/web/src/components/icons/google.tsx b/apps/web/src/components/icons/google.tsx
index e4d68e6d..c03d0948 100644
--- a/apps/web/src/components/icons/google.tsx
+++ b/apps/web/src/components/icons/google.tsx
@@ -1,33 +1,33 @@
interface GoogleProps {
- className?: string;
+ className?: string;
}
export function Google({ className }: GoogleProps) {
- return (
-
- );
+ return (
+
+ );
}
diff --git a/apps/web/src/components/ui/button.tsx b/apps/web/src/components/ui/button.tsx
index 2adaf00d..155a9ed5 100644
--- a/apps/web/src/components/ui/button.tsx
+++ b/apps/web/src/components/ui/button.tsx
@@ -1,59 +1,56 @@
-import * as React from "react";
+import type * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
const buttonVariants = cva(
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
- {
- variants: {
- variant: {
- default:
- "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
- destructive:
- "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
- outline:
- "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
- secondary:
- "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
- ghost:
- "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
- link: "text-primary underline-offset-4 hover:underline",
- },
- size: {
- default: "h-9 px-4 py-2 has-[>svg]:px-3",
- sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
- lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
- icon: "size-9",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- },
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
+ {
+ variants: {
+ variant: {
+ default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
+ outline:
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
+ secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
+ icon: "size-9",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ },
);
function Button({
- className,
- variant,
- size,
- asChild = false,
- ...props
+ className,
+ variant,
+ size,
+ asChild = false,
+ ...props
}: React.ComponentProps<"button"> &
- VariantProps & {
- asChild?: boolean;
- }) {
- const Comp = asChild ? Slot : "button";
+ VariantProps & {
+ asChild?: boolean;
+ }) {
+ const Comp = asChild ? Slot : "button";
- return (
-
- );
+ return (
+
+ );
}
export { Button, buttonVariants };
diff --git a/apps/web/src/components/ui/card.tsx b/apps/web/src/components/ui/card.tsx
index 113d66c7..6f10edd1 100644
--- a/apps/web/src/components/ui/card.tsx
+++ b/apps/web/src/components/ui/card.tsx
@@ -1,92 +1,71 @@
-import * as React from "react";
+import type * as React from "react";
import { cn } from "@/lib/utils";
function Card({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- );
+ return (
+
+ );
}
function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- );
+ return (
+
+ );
}
function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- );
+ return (
+
+ );
}
function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- );
+ return (
+
+ );
}
function CardAction({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- );
+ return (
+
+ );
}
function CardContent({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- );
+ return ;
}
function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- );
+ return (
+
+ );
}
-export {
- Card,
- CardHeader,
- CardFooter,
- CardTitle,
- CardAction,
- CardDescription,
- CardContent,
-};
+export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent };
diff --git a/apps/web/src/components/ui/input.tsx b/apps/web/src/components/ui/input.tsx
index b1a060f5..b20aef6d 100644
--- a/apps/web/src/components/ui/input.tsx
+++ b/apps/web/src/components/ui/input.tsx
@@ -1,21 +1,21 @@
-import * as React from "react";
+import type * as React from "react";
import { cn } from "@/lib/utils";
function Input({ className, type, ...props }: React.ComponentProps<"input">) {
- return (
-
- );
+ return (
+
+ );
}
export { Input };
diff --git a/apps/web/src/components/ui/label.tsx b/apps/web/src/components/ui/label.tsx
index 79d77b4b..dfd25f6b 100644
--- a/apps/web/src/components/ui/label.tsx
+++ b/apps/web/src/components/ui/label.tsx
@@ -1,24 +1,21 @@
"use client";
-import * as React from "react";
+import type * as React from "react";
import * as LabelPrimitive from "@radix-ui/react-label";
import { cn } from "@/lib/utils";
-function Label({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- );
+function Label({ className, ...props }: React.ComponentProps) {
+ return (
+
+ );
}
export { Label };
diff --git a/apps/web/src/lib/trpc/client.tsx b/apps/web/src/lib/trpc/client.tsx
index d940ef1c..bf768f0d 100644
--- a/apps/web/src/lib/trpc/client.tsx
+++ b/apps/web/src/lib/trpc/client.tsx
@@ -2,11 +2,7 @@
import { useState, type ReactNode } from "react";
import { QueryClientProvider } from "@tanstack/react-query";
-import {
- createTRPCClient,
- httpBatchStreamLink,
- loggerLink,
-} from "@trpc/client";
+import { createTRPCClient, httpBatchStreamLink, loggerLink } from "@trpc/client";
import { createTRPCContext } from "@trpc/tanstack-react-query";
import superjson from "superjson";
import type { AppRouter } from "@repo/api";
@@ -16,52 +12,51 @@ import { getQueryClient } from "./query-client";
export const { TRPCProvider, useTRPC } = createTRPCContext();
function getUrl() {
- const base = (() => {
- if (typeof window !== "undefined") return "";
- if (env.VERCEL_URL) return `https://${env.VERCEL_URL}`;
- return "http://localhost:3000";
- })();
+ const base = (() => {
+ if (typeof window !== "undefined") return "";
+ if (env.VERCEL_URL) return `https://${env.VERCEL_URL}`;
+ return "http://localhost:3000";
+ })();
- return `${base}/api/trpc`;
+ return `${base}/api/trpc`;
}
interface TRPCReactProviderProps {
- children: ReactNode;
+ children: ReactNode;
}
export function TRPCReactProvider(props: Readonly) {
- // NOTE: Avoid useState when initializing the query client if you don't
- // have a suspense boundary between this and the code that may
- // suspend because React will throw away the client on the initial
- // render if it suspends and there is no boundary
- const queryClient = getQueryClient();
- const [trpcClient] = useState(() =>
- createTRPCClient({
- links: [
- loggerLink({
- enabled: (op) =>
- env.NODE_ENV === "development" ||
- (op.direction === "down" && op.result instanceof Error),
- }),
- httpBatchStreamLink({
- transformer: superjson,
- url: getUrl(),
- headers: () => {
- const headers = new Headers();
- headers.set("x-trpc-source", "nextjs-react");
-
- return headers;
- },
- }),
- ],
- }),
- );
-
- return (
-
-
- {props.children}
-
-
- );
+ // NOTE: Avoid useState when initializing the query client if you don't
+ // have a suspense boundary between this and the code that may
+ // suspend because React will throw away the client on the initial
+ // render if it suspends and there is no boundary
+ const queryClient = getQueryClient();
+ const [trpcClient] = useState(() =>
+ createTRPCClient({
+ links: [
+ loggerLink({
+ enabled: (op) =>
+ env.NODE_ENV === "development" || (op.direction === "down" && op.result instanceof Error),
+ }),
+ httpBatchStreamLink({
+ transformer: superjson,
+ url: getUrl(),
+ headers: () => {
+ const headers = new Headers();
+ headers.set("x-trpc-source", "nextjs-react");
+
+ return headers;
+ },
+ }),
+ ],
+ }),
+ );
+
+ return (
+
+
+ {props.children}
+
+
+ );
}
diff --git a/apps/web/src/lib/trpc/query-client.tsx b/apps/web/src/lib/trpc/query-client.tsx
index 30a0c186..4056fa50 100644
--- a/apps/web/src/lib/trpc/query-client.tsx
+++ b/apps/web/src/lib/trpc/query-client.tsx
@@ -1,42 +1,37 @@
-import {
- defaultShouldDehydrateQuery,
- QueryClient,
-} from "@tanstack/react-query";
+import { defaultShouldDehydrateQuery, QueryClient } from "@tanstack/react-query";
import SuperJSON from "superjson";
export function makeQueryClient() {
- return new QueryClient({
- defaultOptions: {
- queries: {
- // With SSR, we usually want to set some default staleTime
- // above 0 to avoid refetching immediately on the client
- staleTime: 60 * 1000,
- },
- dehydrate: {
- serializeData: SuperJSON.serialize,
- shouldDehydrateQuery: (query) =>
- defaultShouldDehydrateQuery(query) ||
- query.state.status === "pending",
- },
- hydrate: {
- deserializeData: SuperJSON.deserialize,
- },
- },
- });
+ return new QueryClient({
+ defaultOptions: {
+ queries: {
+ // With SSR, we usually want to set some default staleTime
+ // above 0 to avoid refetching immediately on the client
+ staleTime: 60 * 1000,
+ },
+ dehydrate: {
+ serializeData: SuperJSON.serialize,
+ shouldDehydrateQuery: (query) =>
+ defaultShouldDehydrateQuery(query) || query.state.status === "pending",
+ },
+ hydrate: {
+ deserializeData: SuperJSON.deserialize,
+ },
+ },
+ });
}
let browserQueryClient: QueryClient | undefined = undefined;
export function getQueryClient() {
- if (typeof window === "undefined") {
- // Server: always make a new query client
- return makeQueryClient();
- } else {
- // Browser: make a new query client if we don't already have one
- // This is very important, so we don't re-make a new client if React
- // suspends during the initial render. This may not be needed if we
- // have a suspense boundary BELOW the creation of the query client
- if (!browserQueryClient) browserQueryClient = makeQueryClient();
- return browserQueryClient;
- }
+ if (typeof window === "undefined") {
+ // Server: always make a new query client
+ return makeQueryClient();
+ }
+ // Browser: make a new query client if we don't already have one
+ // This is very important, so we don't re-make a new client if React
+ // suspends during the initial render. This may not be needed if we
+ // have a suspense boundary BELOW the creation of the query client
+ if (!browserQueryClient) browserQueryClient = makeQueryClient();
+ return browserQueryClient;
}
diff --git a/apps/web/src/lib/trpc/server.tsx b/apps/web/src/lib/trpc/server.tsx
index a8418a52..dba1a30a 100644
--- a/apps/web/src/lib/trpc/server.tsx
+++ b/apps/web/src/lib/trpc/server.tsx
@@ -1,10 +1,7 @@
import "server-only";
import { cache, type ReactNode } from "react";
import { headers } from "next/headers";
-import {
- createTRPCOptionsProxy,
- TRPCQueryOptions,
-} from "@trpc/tanstack-react-query";
+import { createTRPCOptionsProxy, type TRPCQueryOptions } from "@trpc/tanstack-react-query";
import { appRouter, createContext } from "@repo/api";
import { makeQueryClient } from "./query-client";
import { dehydrate, HydrationBoundary } from "@tanstack/react-query";
@@ -16,32 +13,24 @@ export const getQueryClient = cache(makeQueryClient);
const ctx = async () => createContext({ headers: await headers() });
export const trpc = createTRPCOptionsProxy({
- ctx,
- router: appRouter,
- queryClient: getQueryClient,
+ ctx,
+ router: appRouter,
+ queryClient: getQueryClient,
});
export const caller = appRouter.createCaller(ctx);
export function HydrateClient(props: { children: ReactNode }) {
- const queryClient = getQueryClient();
+ const queryClient = getQueryClient();
- return (
-
- {props.children}
-
- );
+ return {props.children};
}
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export function prefetch>>(
- queryOptions: T,
-) {
- const queryClient = getQueryClient();
- if (queryOptions.queryKey[1]?.type === "infinite") {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- void queryClient.prefetchInfiniteQuery(queryOptions as any);
- } else {
- void queryClient.prefetchQuery(queryOptions);
- }
+export function prefetch>>(queryOptions: T) {
+ const queryClient = getQueryClient();
+ if (queryOptions.queryKey[1]?.type === "infinite") {
+ void queryClient.prefetchInfiniteQuery(queryOptions as any);
+ } else {
+ void queryClient.prefetchQuery(queryOptions);
+ }
}
diff --git a/apps/web/src/lib/utils.ts b/apps/web/src/lib/utils.ts
index a5ef1935..3200be28 100644
--- a/apps/web/src/lib/utils.ts
+++ b/apps/web/src/lib/utils.ts
@@ -2,5 +2,5 @@ import { clsx, type ClassValue } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs));
+ return twMerge(clsx(inputs));
}
diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json
index 7c6aab63..da69875b 100644
--- a/apps/web/tsconfig.json
+++ b/apps/web/tsconfig.json
@@ -1,16 +1,16 @@
{
- "extends": "@repo/typescript-config/next.json",
- "compilerOptions": {
- "plugins": [
- {
- "name": "next"
- }
- ],
- "baseUrl": ".",
- "paths": {
- "@/*": ["./src/*"]
- }
- },
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
- "exclude": ["node_modules"]
-}
\ No newline at end of file
+ "extends": "@repo/typescript-config/next.json",
+ "compilerOptions": {
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/biome.jsonc b/biome.jsonc
new file mode 100644
index 00000000..d6a3ad3a
--- /dev/null
+++ b/biome.jsonc
@@ -0,0 +1,67 @@
+{
+ "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
+ "vcs": {
+ "enabled": false,
+ "clientKind": "git",
+ "useIgnoreFile": false
+ },
+ "organizeImports": {
+ "enabled": false
+ },
+ "files": {
+ "include": ["**/*.js", "**/*.ts", "**/*.json", "**/*.tsx", "**/*.css"]
+ },
+ "formatter": {
+ "enabled": true,
+ "useEditorconfig": true
+ },
+ "linter": {
+ "enabled": true,
+ "rules": {
+ "recommended": true,
+ "suspicious": {
+ "noExplicitAny": "off",
+ "noThenProperty": "off",
+ "noAssignInExpressions": "off",
+ "noImplicitAnyLet": "off",
+ "noUnsafeDeclarationMerging": "off",
+ "noShadowRestrictedNames": "off"
+ },
+ "complexity": {
+ "noBannedTypes": "off"
+ },
+ "a11y": {
+ "noSvgWithoutTitle": "off"
+ },
+ "style": {
+ "noNonNullAssertion": "off",
+ "noCommaOperator": "off",
+ "noParameterAssign": "off"
+ }
+ }
+ },
+ "javascript": {
+ "formatter": {
+ "enabled": true
+ },
+ "linter": {
+ "enabled": true
+ }
+ },
+ "json": {
+ "formatter": {
+ "enabled": true
+ },
+ "linter": {
+ "enabled": true
+ }
+ },
+ "css": {
+ "formatter": {
+ "enabled": true
+ },
+ "linter": {
+ "enabled": true
+ }
+ }
+}
diff --git a/bun.lock b/bun.lock
deleted file mode 100644
index 20c27631..00000000
--- a/bun.lock
+++ /dev/null
@@ -1,1231 +0,0 @@
-{
- "lockfileVersion": 1,
- "workspaces": {
- "": {
- "name": "analog",
- "devDependencies": {
- "dotenv-cli": "^8.0.0",
- "prettier": "^3.5.3",
- "turbo": "^2.5.3",
- },
- },
- "apps/web": {
- "name": "@repo/web",
- "version": "0.1.0",
- "dependencies": {
- "@radix-ui/react-label": "^2.1.6",
- "@radix-ui/react-slot": "^1.2.2",
- "@repo/api": "workspace:*",
- "@repo/auth": "workspace:*",
- "@repo/env": "workspace:*",
- "@tanstack/react-query": "^5.76.1",
- "@trpc/client": "^11.1.2",
- "@trpc/server": "^11.1.2",
- "@trpc/tanstack-react-query": "^11.1.2",
- "better-auth": "^1.2.8",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "lucide-react": "^0.511.0",
- "next": "15.3.2",
- "react": "^19.0.0",
- "react-dom": "^19.0.0",
- "superjson": "^2.2.2",
- "tailwind-merge": "^3.3.0",
- "tw-animate-css": "^1.3.0",
- },
- "devDependencies": {
- "@eslint/eslintrc": "^3",
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@tailwindcss/postcss": "^4",
- "@types/node": "^20",
- "@types/react": "^19",
- "@types/react-dom": "^19",
- "eslint": "^9",
- "eslint-config-next": "15.3.2",
- "tailwindcss": "^4",
- "typescript": "^5",
- },
- },
- "packages/api": {
- "name": "@repo/api",
- "version": "0.1.0",
- "dependencies": {
- "@repo/auth": "workspace:*",
- "@repo/db": "workspace:*",
- "@repo/env": "workspace:*",
- },
- "devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "eslint": "^9",
- "typescript": "^5",
- },
- "peerDependencies": {
- "@trpc/server": "^11.1.2",
- "next": "^15",
- "server-only": "^0.0.1",
- "superjson": "^2.2.2",
- "zod": "^3.24.4",
- },
- },
- "packages/auth": {
- "name": "@repo/auth",
- "version": "0.1.0",
- "dependencies": {
- "@repo/db": "workspace:*",
- "@repo/env": "workspace:*",
- },
- "devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "eslint": "^9",
- "typescript": "^5",
- },
- "peerDependencies": {
- "better-auth": "^1.2.8",
- "server-only": "^0.0.1",
- },
- },
- "packages/db": {
- "name": "@repo/db",
- "version": "0.1.0",
- "dependencies": {
- "@repo/env": "workspace:*",
- "drizzle-orm": "^0.43.1",
- "postgres": "^3.4.5",
- "server-only": "^0.0.1",
- },
- "devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "drizzle-kit": "^0.31.1",
- "eslint": "^9",
- "typescript": "^5",
- },
- },
- "packages/env": {
- "name": "@repo/env",
- "version": "0.1.0",
- "dependencies": {
- "@t3-oss/env-nextjs": "^0.13.4",
- "zod": "^3.24.4",
- },
- "devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "eslint": "^9",
- "typescript": "^5",
- },
- },
- "packages/google-calendar": {
- "name": "@repo/google-calendar",
- "version": "0.0.1-alpha.0",
- "devDependencies": {
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "typescript": "^5",
- },
- },
- "tooling/eslint-config": {
- "name": "@repo/eslint-config",
- "version": "0.0.0",
- "devDependencies": {
- "@eslint/js": "^9.26.0",
- "@next/eslint-plugin-next": "^15.3.2",
- "eslint": "^9.26.0",
- "eslint-config-prettier": "^10.1.5",
- "eslint-plugin-only-warn": "^1.1.0",
- "eslint-plugin-react": "^7.37.5",
- "eslint-plugin-react-hooks": "^5.2.0",
- "eslint-plugin-turbo": "^2.5.3",
- "globals": "^16.1.0",
- "typescript": "^5.8.3",
- "typescript-eslint": "^8.32.1",
- },
- },
- "tooling/typescript-config": {
- "name": "@repo/typescript-config",
- "version": "0.0.1",
- },
- },
- "packages": {
- "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
-
- "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
-
- "@ark/schema": ["@ark/schema@0.46.0", "", { "dependencies": { "@ark/util": "0.46.0" } }, "sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ=="],
-
- "@ark/util": ["@ark/util@0.46.0", "", {}, "sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg=="],
-
- "@better-auth/utils": ["@better-auth/utils@0.2.5", "", { "dependencies": { "typescript": "^5.8.2", "uncrypto": "^0.1.3" } }, "sha512-uI2+/8h/zVsH8RrYdG8eUErbuGBk16rZKQfz8CjxQOyCE6v7BqFYEbFwvOkvl1KbUdxhqOnXp78+uE5h8qVEgQ=="],
-
- "@better-fetch/fetch": ["@better-fetch/fetch@1.1.18", "", {}, "sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA=="],
-
- "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="],
-
- "@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="],
-
- "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
-
- "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="],
-
- "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="],
-
- "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="],
-
- "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="],
-
- "@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="],
-
- "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="],
-
- "@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="],
-
- "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="],
-
- "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="],
-
- "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="],
-
- "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="],
-
- "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="],
-
- "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="],
-
- "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="],
-
- "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="],
-
- "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="],
-
- "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="],
-
- "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="],
-
- "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="],
-
- "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="],
-
- "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="],
-
- "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="],
-
- "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="],
-
- "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="],
-
- "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="],
-
- "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="],
-
- "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="],
-
- "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="],
-
- "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="],
-
- "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="],
-
- "@eslint/config-array": ["@eslint/config-array@0.20.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ=="],
-
- "@eslint/config-helpers": ["@eslint/config-helpers@0.2.2", "", {}, "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg=="],
-
- "@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="],
-
- "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="],
-
- "@eslint/js": ["@eslint/js@9.27.0", "", {}, "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA=="],
-
- "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="],
-
- "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.1", "", { "dependencies": { "@eslint/core": "^0.14.0", "levn": "^0.4.1" } }, "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w=="],
-
- "@hexagon/base64": ["@hexagon/base64@1.1.28", "", {}, "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw=="],
-
- "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
-
- "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="],
-
- "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
-
- "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
-
- "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.1.0" }, "os": "darwin", "cpu": "arm64" }, "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A=="],
-
- "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.1.0" }, "os": "darwin", "cpu": "x64" }, "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q=="],
-
- "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA=="],
-
- "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ=="],
-
- "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.1.0", "", { "os": "linux", "cpu": "arm" }, "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA=="],
-
- "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew=="],
-
- "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.1.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ=="],
-
- "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.1.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA=="],
-
- "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q=="],
-
- "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w=="],
-
- "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A=="],
-
- "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.1.0" }, "os": "linux", "cpu": "arm" }, "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA=="],
-
- "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ=="],
-
- "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.1.0" }, "os": "linux", "cpu": "s390x" }, "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA=="],
-
- "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA=="],
-
- "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ=="],
-
- "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg=="],
-
- "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.1", "", { "dependencies": { "@emnapi/runtime": "^1.4.0" }, "cpu": "none" }, "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg=="],
-
- "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw=="],
-
- "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.1", "", { "os": "win32", "cpu": "x64" }, "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw=="],
-
- "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
-
- "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
-
- "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
-
- "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="],
-
- "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
-
- "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="],
-
- "@levischuck/tiny-cbor": ["@levischuck/tiny-cbor@0.2.11", "", {}, "sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow=="],
-
- "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" } }, "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ=="],
-
- "@next/env": ["@next/env@15.3.2", "", {}, "sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g=="],
-
- "@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.3.2", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ=="],
-
- "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g=="],
-
- "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w=="],
-
- "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA=="],
-
- "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg=="],
-
- "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg=="],
-
- "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w=="],
-
- "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.3.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ=="],
-
- "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA=="],
-
- "@noble/ciphers": ["@noble/ciphers@0.6.0", "", {}, "sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ=="],
-
- "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="],
-
- "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
-
- "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
-
- "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
-
- "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="],
-
- "@peculiar/asn1-android": ["@peculiar/asn1-android@2.3.16", "", { "dependencies": { "@peculiar/asn1-schema": "^2.3.15", "asn1js": "^3.0.5", "tslib": "^2.8.1" } }, "sha512-a1viIv3bIahXNssrOIkXZIlI2ePpZaNmR30d4aBL99mu2rO+mT9D6zBsp7H6eROWGtmwv0Ionp5olJurIo09dw=="],
-
- "@peculiar/asn1-ecc": ["@peculiar/asn1-ecc@2.3.15", "", { "dependencies": { "@peculiar/asn1-schema": "^2.3.15", "@peculiar/asn1-x509": "^2.3.15", "asn1js": "^3.0.5", "tslib": "^2.8.1" } }, "sha512-/HtR91dvgog7z/WhCVdxZJ/jitJuIu8iTqiyWVgRE9Ac5imt2sT/E4obqIVGKQw7PIy+X6i8lVBoT6wC73XUgA=="],
-
- "@peculiar/asn1-rsa": ["@peculiar/asn1-rsa@2.3.15", "", { "dependencies": { "@peculiar/asn1-schema": "^2.3.15", "@peculiar/asn1-x509": "^2.3.15", "asn1js": "^3.0.5", "tslib": "^2.8.1" } }, "sha512-p6hsanvPhexRtYSOHihLvUUgrJ8y0FtOM97N5UEpC+VifFYyZa0iZ5cXjTkZoDwxJ/TTJ1IJo3HVTB2JJTpXvg=="],
-
- "@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.3.15", "", { "dependencies": { "asn1js": "^3.0.5", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w=="],
-
- "@peculiar/asn1-x509": ["@peculiar/asn1-x509@2.3.15", "", { "dependencies": { "@peculiar/asn1-schema": "^2.3.15", "asn1js": "^3.0.5", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-0dK5xqTqSLaxv1FHXIcd4Q/BZNuopg+u1l23hT9rOmQ1g4dNtw0g/RnEi+TboB0gOwGtrWn269v27cMgchFIIg=="],
-
- "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="],
-
- "@radix-ui/react-label": ["@radix-ui/react-label@2.1.6", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-S/hv1mTlgcPX2gCTJrWuTjSXf7ER3Zf7zWGtOprxhIIY93Qin3n5VgNA0Ez9AgrK/lEtlYgzLd4f5x6AVar4Yw=="],
-
- "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.2", "", { "dependencies": { "@radix-ui/react-slot": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw=="],
-
- "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ=="],
-
- "@repo/api": ["@repo/api@workspace:packages/api"],
-
- "@repo/auth": ["@repo/auth@workspace:packages/auth"],
-
- "@repo/db": ["@repo/db@workspace:packages/db"],
-
- "@repo/env": ["@repo/env@workspace:packages/env"],
-
- "@repo/eslint-config": ["@repo/eslint-config@workspace:tooling/eslint-config"],
-
- "@repo/google-calendar": ["@repo/google-calendar@workspace:packages/google-calendar"],
-
- "@repo/typescript-config": ["@repo/typescript-config@workspace:tooling/typescript-config"],
-
- "@repo/web": ["@repo/web@workspace:apps/web"],
-
- "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="],
-
- "@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.11.0", "", {}, "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ=="],
-
- "@simplewebauthn/browser": ["@simplewebauthn/browser@13.1.0", "", {}, "sha512-WuHZ/PYvyPJ9nxSzgHtOEjogBhwJfC8xzYkPC+rR/+8chl/ft4ngjiK8kSU5HtRJfczupyOh33b25TjYbvwAcg=="],
-
- "@simplewebauthn/server": ["@simplewebauthn/server@13.1.1", "", { "dependencies": { "@hexagon/base64": "^1.1.27", "@levischuck/tiny-cbor": "^0.2.2", "@peculiar/asn1-android": "^2.3.10", "@peculiar/asn1-ecc": "^2.3.8", "@peculiar/asn1-rsa": "^2.3.8", "@peculiar/asn1-schema": "^2.3.8", "@peculiar/asn1-x509": "^2.3.8" } }, "sha512-1hsLpRHfSuMB9ee2aAdh0Htza/X3f4djhYISrggqGe3xopNjOcePiSDkDDoPzDYaaMCrbqGP1H2TYU7bgL9PmA=="],
-
- "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="],
-
- "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="],
-
- "@t3-oss/env-core": ["@t3-oss/env-core@0.13.4", "", { "peerDependencies": { "arktype": "^2.1.0", "typescript": ">=5.0.0", "valibot": "^1.0.0-beta.7 || ^1.0.0", "zod": "^3.24.0 || ^4.0.0-beta.0" }, "optionalPeers": ["typescript", "valibot", "zod"] }, "sha512-zVOiYO0+CF7EnBScz8s0O5JnJLPTU0lrUi8qhKXfIxIJXvI/jcppSiXXsEJwfB4A6XZawY/Wg/EQGKANi/aPmQ=="],
-
- "@t3-oss/env-nextjs": ["@t3-oss/env-nextjs@0.13.4", "", { "dependencies": { "@t3-oss/env-core": "0.13.4" }, "peerDependencies": { "typescript": ">=5.0.0", "valibot": "^1.0.0-beta.7 || ^1.0.0", "zod": "^3.24.0 || ^4.0.0-beta.0" }, "optionalPeers": ["typescript", "valibot", "zod"] }, "sha512-6ecXR7SH7zJKVcBODIkB7wV9QLMU23uV8D9ec6P+ULHJ5Ea/YXEHo+Z/2hSYip5i9ptD/qZh8VuOXyldspvTTg=="],
-
- "@tailwindcss/node": ["@tailwindcss/node@4.1.7", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.7" } }, "sha512-9rsOpdY9idRI2NH6CL4wORFY0+Q6fnx9XP9Ju+iq/0wJwGD5IByIgFmwVbyy4ymuyprj8Qh4ErxMKTUL4uNh3g=="],
-
- "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.7", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.7", "@tailwindcss/oxide-darwin-arm64": "4.1.7", "@tailwindcss/oxide-darwin-x64": "4.1.7", "@tailwindcss/oxide-freebsd-x64": "4.1.7", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.7", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.7", "@tailwindcss/oxide-linux-arm64-musl": "4.1.7", "@tailwindcss/oxide-linux-x64-gnu": "4.1.7", "@tailwindcss/oxide-linux-x64-musl": "4.1.7", "@tailwindcss/oxide-wasm32-wasi": "4.1.7", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.7", "@tailwindcss/oxide-win32-x64-msvc": "4.1.7" } }, "sha512-5SF95Ctm9DFiUyjUPnDGkoKItPX/k+xifcQhcqX5RA85m50jw1pT/KzjdvlqxRja45Y52nR4MR9fD1JYd7f8NQ=="],
-
- "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.7", "", { "os": "android", "cpu": "arm64" }, "sha512-IWA410JZ8fF7kACus6BrUwY2Z1t1hm0+ZWNEzykKmMNM09wQooOcN/VXr0p/WJdtHZ90PvJf2AIBS/Ceqx1emg=="],
-
- "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-81jUw9To7fimGGkuJ2W5h3/oGonTOZKZ8C2ghm/TTxbwvfSiFSDPd6/A/KE2N7Jp4mv3Ps9OFqg2fEKgZFfsvg=="],
-
- "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-q77rWjEyGHV4PdDBtrzO0tgBBPlQWKY7wZK0cUok/HaGgbNKecegNxCGikuPJn5wFAlIywC3v+WMBt0PEBtwGw=="],
-
- "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-RfmdbbK6G6ptgF4qqbzoxmH+PKfP4KSVs7SRlTwcbRgBwezJkAO3Qta/7gDy10Q2DcUVkKxFLXUQO6J3CRvBGw=="],
-
- "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7", "", { "os": "linux", "cpu": "arm" }, "sha512-OZqsGvpwOa13lVd1z6JVwQXadEobmesxQ4AxhrwRiPuE04quvZHWn/LnihMg7/XkN+dTioXp/VMu/p6A5eZP3g=="],
-
- "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-voMvBTnJSfKecJxGkoeAyW/2XRToLZ227LxswLAwKY7YslG/Xkw9/tJNH+3IVh5bdYzYE7DfiaPbRkSHFxY1xA=="],
-
- "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A=="],
-
- "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.7", "", { "os": "linux", "cpu": "x64" }, "sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg=="],
-
- "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.7", "", { "os": "linux", "cpu": "x64" }, "sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA=="],
-
- "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.7", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.9", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A=="],
-
- "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-HUiSiXQ9gLJBAPCMVRk2RT1ZrBjto7WvqsPBwUrNK2BcdSxMnk19h4pjZjI7zgPhDxlAbJSumTC4ljeA9y0tEw=="],
-
- "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.7", "", { "os": "win32", "cpu": "x64" }, "sha512-rYHGmvoHiLJ8hWucSfSOEmdCBIGZIq7SpkPRSqLsH2Ab2YUNgKeAPT1Fi2cx3+hnYOrAb0jp9cRyode3bBW4mQ=="],
-
- "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.7", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.7", "@tailwindcss/oxide": "4.1.7", "postcss": "^8.4.41", "tailwindcss": "4.1.7" } }, "sha512-88g3qmNZn7jDgrrcp3ZXEQfp9CVox7xjP1HN2TFKI03CltPVd/c61ydn5qJJL8FYunn0OqBaW5HNUga0kmPVvw=="],
-
- "@tanstack/query-core": ["@tanstack/query-core@5.76.0", "", {}, "sha512-FN375hb8ctzfNAlex5gHI6+WDXTNpe0nbxp/d2YJtnP+IBM6OUm7zcaoCW6T63BawGOYZBbKC0iPvr41TteNVg=="],
-
- "@tanstack/react-query": ["@tanstack/react-query@5.76.1", "", { "dependencies": { "@tanstack/query-core": "5.76.0" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-YxdLZVGN4QkT5YT1HKZQWiIlcgauIXEIsMOTSjvyD5wLYK8YVvKZUPAysMqossFJJfDpJW3pFn7WNZuPOqq+fw=="],
-
- "@trpc/client": ["@trpc/client@11.1.2", "", { "peerDependencies": { "@trpc/server": "11.1.2", "typescript": ">=5.7.2" } }, "sha512-RpifJOAv+ql9gF3oafa3dLCF01AzWu2DzejvehAPG2IlwHxopKoYXaImJ8zPwRkZokuWiKz5v65HjElmi8TlrQ=="],
-
- "@trpc/server": ["@trpc/server@11.1.2", "", { "peerDependencies": { "typescript": ">=5.7.2" } }, "sha512-Oi9zWHG0ZDkbDo4sYkduoV7q4sIe6UwjrRLC91vNMYQK+PVgpbTCmK1laRwewAGu0zaayqcGDosANjceOIC3GA=="],
-
- "@trpc/tanstack-react-query": ["@trpc/tanstack-react-query@11.1.2", "", { "peerDependencies": { "@tanstack/react-query": "^5.67.1", "@trpc/client": "11.1.2", "@trpc/server": "11.1.2", "react": ">=18.2.0", "react-dom": ">=18.2.0", "typescript": ">=5.7.2" } }, "sha512-c+NupnmIQmwgwYVTaHgDg59BZBtJ6KxqB0cxF9FBhKHPY6PlwGLdU8+mo25C5VIpofZYEII4H7NKE4yKGFSe3w=="],
-
- "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
-
- "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="],
-
- "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
-
- "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="],
-
- "@types/node": ["@types/node@20.17.48", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-KpSfKOHPsiSC4IkZeu2LsusFwExAIVGkhG1KkbaBMLwau0uMhj0fCrvyg9ddM2sAvd+gtiBJLir4LAw1MNMIaw=="],
-
- "@types/react": ["@types/react@19.1.4", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g=="],
-
- "@types/react-dom": ["@types/react-dom@19.1.5", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg=="],
-
- "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.32.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/type-utils": "8.32.1", "@typescript-eslint/utils": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg=="],
-
- "@typescript-eslint/parser": ["@typescript-eslint/parser@8.32.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg=="],
-
- "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1" } }, "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA=="],
-
- "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.32.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA=="],
-
- "@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="],
-
- "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg=="],
-
- "@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA=="],
-
- "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="],
-
- "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.7.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg=="],
-
- "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.7.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ=="],
-
- "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.7.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg=="],
-
- "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2", "", { "os": "linux", "cpu": "arm" }, "sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw=="],
-
- "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.7.2", "", { "os": "linux", "cpu": "arm" }, "sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA=="],
-
- "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.7.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA=="],
-
- "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.7.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA=="],
-
- "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.7.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg=="],
-
- "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.7.2", "", { "os": "linux", "cpu": "none" }, "sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q=="],
-
- "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.7.2", "", { "os": "linux", "cpu": "none" }, "sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ=="],
-
- "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.7.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA=="],
-
- "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.7.2", "", { "os": "linux", "cpu": "x64" }, "sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg=="],
-
- "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.7.2", "", { "os": "linux", "cpu": "x64" }, "sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw=="],
-
- "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.7.2", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.9" }, "cpu": "none" }, "sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g=="],
-
- "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.7.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg=="],
-
- "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.7.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg=="],
-
- "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.7.2", "", { "os": "win32", "cpu": "x64" }, "sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA=="],
-
- "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="],
-
- "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
-
- "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
-
- "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
-
- "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
-
- "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
-
- "arktype": ["arktype@2.1.20", "", { "dependencies": { "@ark/schema": "0.46.0", "@ark/util": "0.46.0" } }, "sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q=="],
-
- "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="],
-
- "array-includes": ["array-includes@3.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="],
-
- "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="],
-
- "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="],
-
- "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="],
-
- "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="],
-
- "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="],
-
- "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="],
-
- "asn1js": ["asn1js@3.0.6", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA=="],
-
- "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="],
-
- "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="],
-
- "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
-
- "axe-core": ["axe-core@4.10.3", "", {}, "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg=="],
-
- "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
-
- "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
-
- "better-auth": ["better-auth@1.2.8", "", { "dependencies": { "@better-auth/utils": "0.2.5", "@better-fetch/fetch": "^1.1.18", "@noble/ciphers": "^0.6.0", "@noble/hashes": "^1.6.1", "@simplewebauthn/browser": "^13.0.0", "@simplewebauthn/server": "^13.0.0", "better-call": "^1.0.8", "defu": "^6.1.4", "jose": "^5.9.6", "kysely": "^0.28.1", "nanostores": "^0.11.3", "zod": "^3.24.1" } }, "sha512-y8ry7ZW3/3ZIr82Eo1zUDtMzdoQlFnwNuZ0+b0RxoNZgqmvgTIc/0tCDC7NDJerqSu4UCzer0dvYxBsv3WMIGg=="],
-
- "better-call": ["better-call@1.0.9", "", { "dependencies": { "@better-fetch/fetch": "^1.1.4", "rou3": "^0.5.1", "set-cookie-parser": "^2.7.1", "uncrypto": "^0.1.3" } }, "sha512-Qfm0gjk0XQz0oI7qvTK1hbqTsBY4xV2hsHAxF8LZfUYl3RaECCIifXuVqtPpZJWvlCCMlQSvkvhhyuApGUba6g=="],
-
- "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
-
- "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
-
- "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
-
- "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="],
-
- "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="],
-
- "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
-
- "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
-
- "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
-
- "caniuse-lite": ["caniuse-lite@1.0.30001718", "", {}, "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw=="],
-
- "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
-
- "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
-
- "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
-
- "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="],
-
- "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
-
- "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="],
-
- "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
-
- "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
-
- "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="],
-
- "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
-
- "copy-anything": ["copy-anything@3.0.5", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="],
-
- "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
-
- "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
-
- "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="],
-
- "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="],
-
- "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="],
-
- "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="],
-
- "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
-
- "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
-
- "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="],
-
- "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="],
-
- "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
-
- "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="],
-
- "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="],
-
- "dotenv": ["dotenv@16.5.0", "", {}, "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg=="],
-
- "dotenv-cli": ["dotenv-cli@8.0.0", "", { "dependencies": { "cross-spawn": "^7.0.6", "dotenv": "^16.3.0", "dotenv-expand": "^10.0.0", "minimist": "^1.2.6" }, "bin": { "dotenv": "cli.js" } }, "sha512-aLqYbK7xKOiTMIRf1lDPbI+Y+Ip/wo5k3eyp6ePysVaSqbyxjyK3dK35BTxG+rmd7djf5q2UPs4noPNH+cj0Qw=="],
-
- "dotenv-expand": ["dotenv-expand@10.0.0", "", {}, "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A=="],
-
- "drizzle-kit": ["drizzle-kit@0.31.1", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.2", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-PUjYKWtzOzPtdtQlTHQG3qfv4Y0XT8+Eas6UbxCmxTj7qgMf+39dDujf1BP1I+qqZtw9uzwTh8jYtkMuCq+B0Q=="],
-
- "drizzle-orm": ["drizzle-orm@0.43.1", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-dUcDaZtE/zN4RV/xqGrVSMpnEczxd5cIaoDeor7Zst9wOe/HzC/7eAaulywWGYXdDEc9oBPMjayVEDg0ziTLJA=="],
-
- "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
-
- "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
-
- "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="],
-
- "es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="],
-
- "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
-
- "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
-
- "es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="],
-
- "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
-
- "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
-
- "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="],
-
- "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
-
- "esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="],
-
- "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="],
-
- "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
-
- "eslint": ["eslint@9.27.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.27.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q=="],
-
- "eslint-config-next": ["eslint-config-next@15.3.2", "", { "dependencies": { "@next/eslint-plugin-next": "15.3.2", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-FerU4DYccO4FgeYFFglz0SnaKRe1ejXQrDb8kWUkTAg036YWi+jUsgg4sIGNCDhAsDITsZaL4MzBWKB6f4G1Dg=="],
-
- "eslint-config-prettier": ["eslint-config-prettier@10.1.5", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw=="],
-
- "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="],
-
- "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="],
-
- "eslint-module-utils": ["eslint-module-utils@2.12.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg=="],
-
- "eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="],
-
- "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="],
-
- "eslint-plugin-only-warn": ["eslint-plugin-only-warn@1.1.0", "", {}, "sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA=="],
-
- "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="],
-
- "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="],
-
- "eslint-plugin-turbo": ["eslint-plugin-turbo@2.5.3", "", { "dependencies": { "dotenv": "16.0.3" }, "peerDependencies": { "eslint": ">6.6.0", "turbo": ">2.0.0" } }, "sha512-DlXZd+LgpDlxH/6IsiAXLhy82x0jeJDm0XBEqP6Le08uy0HBQkjCUt7SmXNp8esAtX9RYe6oDClbNbmI1jtK5g=="],
-
- "eslint-scope": ["eslint-scope@8.3.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ=="],
-
- "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="],
-
- "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="],
-
- "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
-
- "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
-
- "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
-
- "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
-
- "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
-
- "fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="],
-
- "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
-
- "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
-
- "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
-
- "fdir": ["fdir@6.4.4", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg=="],
-
- "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
-
- "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
-
- "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
-
- "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
-
- "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
-
- "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
-
- "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
-
- "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="],
-
- "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="],
-
- "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
-
- "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
-
- "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="],
-
- "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="],
-
- "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
-
- "globals": ["globals@16.1.0", "", {}, "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g=="],
-
- "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
-
- "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
-
- "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
-
- "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
-
- "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="],
-
- "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
-
- "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="],
-
- "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="],
-
- "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
-
- "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
-
- "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
-
- "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
-
- "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
-
- "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
-
- "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],
-
- "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],
-
- "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
-
- "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="],
-
- "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="],
-
- "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="],
-
- "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="],
-
- "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="],
-
- "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
-
- "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="],
-
- "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="],
-
- "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
-
- "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="],
-
- "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="],
-
- "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
-
- "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="],
-
- "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
-
- "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="],
-
- "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
-
- "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="],
-
- "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="],
-
- "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="],
-
- "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="],
-
- "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
-
- "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="],
-
- "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="],
-
- "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="],
-
- "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="],
-
- "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
-
- "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
-
- "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="],
-
- "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
-
- "jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="],
-
- "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
-
- "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
-
- "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
-
- "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
-
- "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
-
- "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="],
-
- "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="],
-
- "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
-
- "kysely": ["kysely@0.28.2", "", {}, "sha512-4YAVLoF0Sf0UTqlhgQMFU9iQECdah7n+13ANkiuVfRvlK+uI0Etbgd7bVP36dKlG+NXWbhGua8vnGt+sdhvT7A=="],
-
- "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="],
-
- "language-tags": ["language-tags@1.0.9", "", { "dependencies": { "language-subtag-registry": "^0.3.20" } }, "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="],
-
- "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
-
- "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="],
-
- "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="],
-
- "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="],
-
- "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="],
-
- "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="],
-
- "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="],
-
- "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="],
-
- "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="],
-
- "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="],
-
- "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="],
-
- "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="],
-
- "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
-
- "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
-
- "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
-
- "lucide-react": ["lucide-react@0.511.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w=="],
-
- "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
-
- "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
-
- "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
-
- "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
-
- "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
-
- "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
-
- "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
-
- "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="],
-
- "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
-
- "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
-
- "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
-
- "nanostores": ["nanostores@0.11.4", "", {}, "sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ=="],
-
- "napi-postinstall": ["napi-postinstall@0.2.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg=="],
-
- "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
-
- "next": ["next@15.3.2", "", { "dependencies": { "@next/env": "15.3.2", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.2", "@next/swc-darwin-x64": "15.3.2", "@next/swc-linux-arm64-gnu": "15.3.2", "@next/swc-linux-arm64-musl": "15.3.2", "@next/swc-linux-x64-gnu": "15.3.2", "@next/swc-linux-x64-musl": "15.3.2", "@next/swc-win32-arm64-msvc": "15.3.2", "@next/swc-win32-x64-msvc": "15.3.2", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ=="],
-
- "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
-
- "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
-
- "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],
-
- "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
-
- "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="],
-
- "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="],
-
- "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="],
-
- "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="],
-
- "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
-
- "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="],
-
- "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
-
- "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
-
- "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
-
- "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
-
- "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
-
- "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
-
- "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
-
- "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
-
- "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
-
- "postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
-
- "postgres": ["postgres@3.4.5", "", {}, "sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg=="],
-
- "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
-
- "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="],
-
- "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
-
- "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
-
- "pvtsutils": ["pvtsutils@1.3.6", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="],
-
- "pvutils": ["pvutils@1.1.3", "", {}, "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ=="],
-
- "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
-
- "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="],
-
- "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="],
-
- "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
-
- "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="],
-
- "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="],
-
- "resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="],
-
- "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
-
- "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
-
- "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
-
- "rou3": ["rou3@0.5.1", "", {}, "sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ=="],
-
- "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
-
- "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="],
-
- "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="],
-
- "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="],
-
- "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="],
-
- "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
-
- "server-only": ["server-only@0.0.1", "", {}, "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA=="],
-
- "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="],
-
- "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
-
- "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="],
-
- "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="],
-
- "sharp": ["sharp@0.34.1", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.7.1" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.1", "@img/sharp-darwin-x64": "0.34.1", "@img/sharp-libvips-darwin-arm64": "1.1.0", "@img/sharp-libvips-darwin-x64": "1.1.0", "@img/sharp-libvips-linux-arm": "1.1.0", "@img/sharp-libvips-linux-arm64": "1.1.0", "@img/sharp-libvips-linux-ppc64": "1.1.0", "@img/sharp-libvips-linux-s390x": "1.1.0", "@img/sharp-libvips-linux-x64": "1.1.0", "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", "@img/sharp-libvips-linuxmusl-x64": "1.1.0", "@img/sharp-linux-arm": "0.34.1", "@img/sharp-linux-arm64": "0.34.1", "@img/sharp-linux-s390x": "0.34.1", "@img/sharp-linux-x64": "0.34.1", "@img/sharp-linuxmusl-arm64": "0.34.1", "@img/sharp-linuxmusl-x64": "0.34.1", "@img/sharp-wasm32": "0.34.1", "@img/sharp-win32-ia32": "0.34.1", "@img/sharp-win32-x64": "0.34.1" } }, "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg=="],
-
- "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
-
- "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
-
- "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
-
- "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
-
- "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
-
- "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
-
- "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="],
-
- "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
-
- "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
-
- "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
-
- "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="],
-
- "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="],
-
- "string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="],
-
- "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="],
-
- "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="],
-
- "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="],
-
- "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="],
-
- "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="],
-
- "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
-
- "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
-
- "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="],
-
- "superjson": ["superjson@2.2.2", "", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q=="],
-
- "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
-
- "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
-
- "tailwind-merge": ["tailwind-merge@3.3.0", "", {}, "sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ=="],
-
- "tailwindcss": ["tailwindcss@4.1.7", "", {}, "sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg=="],
-
- "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="],
-
- "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
-
- "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="],
-
- "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
-
- "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="],
-
- "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="],
-
- "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
-
- "turbo": ["turbo@2.5.3", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.3", "turbo-darwin-arm64": "2.5.3", "turbo-linux-64": "2.5.3", "turbo-linux-arm64": "2.5.3", "turbo-windows-64": "2.5.3", "turbo-windows-arm64": "2.5.3" }, "bin": { "turbo": "bin/turbo" } }, "sha512-iHuaNcq5GZZnr3XDZNuu2LSyCzAOPwDuo5Qt+q64DfsTP1i3T2bKfxJhni2ZQxsvAoxRbuUK5QetJki4qc5aYA=="],
-
- "turbo-darwin-64": ["turbo-darwin-64@2.5.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-YSItEVBUIvAGPUDpAB9etEmSqZI3T6BHrkBkeSErvICXn3dfqXUfeLx35LfptLDEbrzFUdwYFNmt8QXOwe9yaw=="],
-
- "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5PefrwHd42UiZX7YA9m1LPW6x9YJBDErXmsegCkVp+GjmWrADfEOxpFrGQNonH3ZMj77WZB2PVE5Aw3gA+IOhg=="],
-
- "turbo-linux-64": ["turbo-linux-64@2.5.3", "", { "os": "linux", "cpu": "x64" }, "sha512-M9xigFgawn5ofTmRzvjjLj3Lqc05O8VHKuOlWNUlnHPUltFquyEeSkpQNkE/vpPdOR14AzxqHbhhxtfS4qvb1w=="],
-
- "turbo-linux-arm64": ["turbo-linux-arm64@2.5.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-auJRbYZ8SGJVqvzTikpg1bsRAsiI9Tk0/SDkA5Xgg0GdiHDH/BOzv1ZjDE2mjmlrO/obr19Dw+39OlMhwLffrw=="],
-
- "turbo-windows-64": ["turbo-windows-64@2.5.3", "", { "os": "win32", "cpu": "x64" }, "sha512-arLQYohuHtIEKkmQSCU9vtrKUg+/1TTstWB9VYRSsz+khvg81eX6LYHtXJfH/dK7Ho6ck+JaEh5G+QrE1jEmCQ=="],
-
- "turbo-windows-arm64": ["turbo-windows-arm64@2.5.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3JPn66HAynJ0gtr6H+hjY4VHpu1RPKcEwGATvGUTmLmYSYBQieVlnGDRMMoYN066YfyPqnNGCfhYbXfH92Cm0g=="],
-
- "tw-animate-css": ["tw-animate-css@1.3.0", "", {}, "sha512-jrJ0XenzS9KVuDThJDvnhalbl4IYiMQ/XvpA0a2FL8KmlK+6CSMviO7ROY/I7z1NnUs5NnDhlM6fXmF40xPxzw=="],
-
- "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
-
- "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="],
-
- "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="],
-
- "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="],
-
- "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="],
-
- "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
-
- "typescript-eslint": ["typescript-eslint@8.32.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.1", "@typescript-eslint/parser": "8.32.1", "@typescript-eslint/utils": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg=="],
-
- "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
-
- "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="],
-
- "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="],
-
- "unrs-resolver": ["unrs-resolver@1.7.2", "", { "dependencies": { "napi-postinstall": "^0.2.2" }, "optionalDependencies": { "@unrs/resolver-binding-darwin-arm64": "1.7.2", "@unrs/resolver-binding-darwin-x64": "1.7.2", "@unrs/resolver-binding-freebsd-x64": "1.7.2", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.2", "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.2", "@unrs/resolver-binding-linux-arm64-gnu": "1.7.2", "@unrs/resolver-binding-linux-arm64-musl": "1.7.2", "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.2", "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.2", "@unrs/resolver-binding-linux-riscv64-musl": "1.7.2", "@unrs/resolver-binding-linux-s390x-gnu": "1.7.2", "@unrs/resolver-binding-linux-x64-gnu": "1.7.2", "@unrs/resolver-binding-linux-x64-musl": "1.7.2", "@unrs/resolver-binding-wasm32-wasi": "1.7.2", "@unrs/resolver-binding-win32-arm64-msvc": "1.7.2", "@unrs/resolver-binding-win32-ia32-msvc": "1.7.2", "@unrs/resolver-binding-win32-x64-msvc": "1.7.2" } }, "sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A=="],
-
- "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
-
- "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
-
- "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="],
-
- "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="],
-
- "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="],
-
- "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="],
-
- "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
-
- "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
-
- "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
-
- "zod": ["zod@3.25.7", "", {}, "sha512-YGdT1cVRmKkOg6Sq7vY7IkxdphySKnXhaUmFI4r4FcuFVNgpCb9tZfNwXbT6BPjD5oz0nubFsoo9pIqKrDcCvg=="],
-
- "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="],
-
- "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
-
- "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
-
- "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
-
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="],
-
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
-
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="],
-
- "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" }, "bundled": true }, "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ=="],
-
- "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
-
- "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
-
- "@tailwindcss/postcss/postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="],
-
- "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.4", "", {}, "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A=="],
-
- "@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
-
- "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
-
- "@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
-
- "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
-
- "eslint-import-resolver-node/resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="],
-
- "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
-
- "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
-
- "eslint-plugin-turbo/dotenv": ["dotenv@16.0.3", "", {}, "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="],
-
- "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
-
- "is-bun-module/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
-
- "sharp/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
-
- "tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="],
-
- "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="],
-
- "@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
-
- "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
- }
-}
diff --git a/bun.lockb b/bun.lockb
new file mode 100755
index 00000000..b02d8945
Binary files /dev/null and b/bun.lockb differ
diff --git a/package.json b/package.json
index 6184f989..07f22136 100644
--- a/package.json
+++ b/package.json
@@ -1,21 +1,25 @@
{
- "name": "analog",
- "private": true,
- "scripts": {
- "build": "dotenv -- turbo run build",
- "dev": "dotenv -- turbo run dev",
- "lint": "turbo run lint",
- "format": "prettier --write \"**/*.{ts,tsx,css,,md}\"",
- "db:generate": "turbo run db:generate",
- "db:migrate": "dotenv -- turbo run db:migrate",
- "db:push": "dotenv -- turbo run db:push",
- "db:studio": "dotenv -- turbo run db:studio"
- },
- "devDependencies": {
- "turbo": "^2.5.3",
- "dotenv-cli": "^8.0.0",
- "prettier": "^3.5.3"
- },
- "packageManager": "bun@1.2.13",
- "workspaces": ["apps/*", "packages/*", "tooling/*"]
+ "name": "analog",
+ "private": true,
+ "scripts": {
+ "build": "dotenv -- turbo run build",
+ "dev": "dotenv -- turbo run dev",
+ "lint": "biome lint ./",
+ "lint:fix": "biome lint --fix ./",
+ "format": "biome format ./",
+ "format:write": "biome format --write ./",
+ "pre-commit": "bun run lint:fix && bun run format:write",
+ "db:generate": "turbo run db:generate",
+ "db:migrate": "dotenv -- turbo run db:migrate",
+ "db:push": "dotenv -- turbo run db:push",
+ "db:studio": "dotenv -- turbo run db:studio"
+ },
+ "devDependencies": {
+ "@biomejs/biome": "^1.9.4",
+ "dotenv-cli": "^8.0.0",
+ "prettier": "^3.5.3",
+ "turbo": "^2.5.3"
+ },
+ "packageManager": "bun@1.2.13",
+ "workspaces": ["apps/*", "packages/*", "tooling/*"]
}
diff --git a/packages/api/eslint.config.mjs b/packages/api/eslint.config.mjs
deleted file mode 100644
index 31bf7507..00000000
--- a/packages/api/eslint.config.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { config } from "@repo/eslint-config/base";
-
-/** @type {import("eslint").Linter.Config} */
-export default config;
\ No newline at end of file
diff --git a/packages/api/package.json b/packages/api/package.json
index 08c1cb4f..fc833a86 100644
--- a/packages/api/package.json
+++ b/packages/api/package.json
@@ -1,30 +1,25 @@
{
- "name": "@repo/api",
- "version": "0.1.0",
- "private": true,
- "exports": {
- ".": "./src/root.ts"
- },
- "scripts": {
- "lint": "eslint ."
- },
- "peerDependencies": {
- "@trpc/server": "^11.1.2",
- "next": "^15",
- "server-only": "^0.0.1",
- "superjson": "^2.2.2",
- "zod": "^3.24.4"
- },
- "dependencies": {
- "@repo/auth": "workspace:*",
- "@repo/db": "workspace:*",
- "@repo/env": "workspace:*"
- },
- "devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "eslint": "^9",
- "typescript": "^5"
- }
-}
\ No newline at end of file
+ "name": "@repo/api",
+ "version": "0.1.0",
+ "private": true,
+ "exports": {
+ ".": "./src/root.ts"
+ },
+ "peerDependencies": {
+ "@trpc/server": "^11.1.2",
+ "next": "^15",
+ "server-only": "^0.0.1",
+ "superjson": "^2.2.2",
+ "zod": "^3.24.4"
+ },
+ "dependencies": {
+ "@repo/auth": "workspace:*",
+ "@repo/db": "workspace:*",
+ "@repo/env": "workspace:*"
+ },
+ "devDependencies": {
+ "@repo/typescript-config": "workspace:*",
+ "@types/node": "^20",
+ "typescript": "^5"
+ }
+}
diff --git a/packages/api/src/root.ts b/packages/api/src/root.ts
index 5b698a4c..7ee4b7c2 100644
--- a/packages/api/src/root.ts
+++ b/packages/api/src/root.ts
@@ -1,13 +1,9 @@
import "server-only";
-import {
- createCallerFactory,
- createTRPCContext,
- createTRPCRouter,
-} from "./trpc";
+import { createCallerFactory, createTRPCContext, createTRPCRouter } from "./trpc";
import { userRouter } from "./routers/user";
export const appRouter = createTRPCRouter({
- user: userRouter,
+ user: userRouter,
});
export type AppRouter = typeof appRouter;
diff --git a/packages/api/src/routers/user.ts b/packages/api/src/routers/user.ts
index 763c7adc..51fa143a 100644
--- a/packages/api/src/routers/user.ts
+++ b/packages/api/src/routers/user.ts
@@ -1,14 +1,14 @@
import { createTRPCRouter, protectedProcedure } from "../trpc";
export const userRouter = createTRPCRouter({
- me: protectedProcedure.query(({ ctx }) => {
- return {
- ...ctx.user,
- session: {
- id: ctx.session.id,
- ipAddress: ctx.session.ipAddress,
- userAgent: ctx.session.userAgent,
- },
- };
- }),
+ me: protectedProcedure.query(({ ctx }) => {
+ return {
+ ...ctx.user,
+ session: {
+ id: ctx.session.id,
+ ipAddress: ctx.session.ipAddress,
+ userAgent: ctx.session.userAgent,
+ },
+ };
+ }),
});
diff --git a/packages/api/src/trpc.ts b/packages/api/src/trpc.ts
index b2628f0d..d42a9622 100644
--- a/packages/api/src/trpc.ts
+++ b/packages/api/src/trpc.ts
@@ -6,30 +6,29 @@ import { db } from "@repo/db";
import { auth } from "@repo/auth/server";
export const createTRPCContext = async (opts: { headers: Headers }) => {
- const session = await auth.api.getSession({
- headers: opts.headers,
- });
-
- return {
- db,
- session: session?.session,
- user: session?.user,
- ...opts,
- };
+ const session = await auth.api.getSession({
+ headers: opts.headers,
+ });
+
+ return {
+ db,
+ session: session?.session,
+ user: session?.user,
+ ...opts,
+ };
};
const t = initTRPC.context().create({
- transformer: superjson,
- errorFormatter({ shape, error }) {
- return {
- ...shape,
- data: {
- ...shape.data,
- zodError:
- error.cause instanceof ZodError ? error.cause.flatten() : null,
- },
- };
- },
+ transformer: superjson,
+ errorFormatter({ shape, error }) {
+ return {
+ ...shape,
+ data: {
+ ...shape.data,
+ zodError: error.cause instanceof ZodError ? error.cause.flatten() : null,
+ },
+ };
+ },
});
export const createCallerFactory = t.createCallerFactory;
@@ -39,15 +38,15 @@ export const createTRPCRouter = t.router;
export const publicProcedure = t.procedure;
export const protectedProcedure = t.procedure.use(({ ctx, next }) => {
- if (!ctx.user) {
- throw new TRPCError({ code: "UNAUTHORIZED" });
- }
-
- return next({
- ctx: {
- ...ctx,
- session: { ...ctx.session },
- user: { ...ctx.user },
- },
- });
+ if (!ctx.user) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+
+ return next({
+ ctx: {
+ ...ctx,
+ session: { ...ctx.session },
+ user: { ...ctx.user },
+ },
+ });
});
diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json
index 70c407ed..e86f68f1 100644
--- a/packages/api/tsconfig.json
+++ b/packages/api/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@repo/typescript-config/base.json",
- "include": ["**/*.ts", "**/*.tsx"],
- "exclude": ["node_modules"]
-}
\ No newline at end of file
+ "extends": "@repo/typescript-config/base.json",
+ "include": ["**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/packages/auth/eslint.config.mjs b/packages/auth/eslint.config.mjs
deleted file mode 100644
index 31bf7507..00000000
--- a/packages/auth/eslint.config.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { config } from "@repo/eslint-config/base";
-
-/** @type {import("eslint").Linter.Config} */
-export default config;
\ No newline at end of file
diff --git a/packages/auth/package.json b/packages/auth/package.json
index 8e60fce1..7fded216 100644
--- a/packages/auth/package.json
+++ b/packages/auth/package.json
@@ -1,27 +1,22 @@
{
- "name": "@repo/auth",
- "version": "0.1.0",
- "private": true,
- "exports": {
- "./client": "./src/client.ts",
- "./server": "./src/server.ts"
- },
- "scripts": {
- "lint": "eslint ."
- },
- "peerDependencies": {
- "better-auth": "^1.2.8",
- "server-only": "^0.0.1"
- },
- "dependencies": {
- "@repo/db": "workspace:*",
- "@repo/env": "workspace:*"
- },
- "devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "eslint": "^9",
- "typescript": "^5"
- }
-}
\ No newline at end of file
+ "name": "@repo/auth",
+ "version": "0.1.0",
+ "private": true,
+ "exports": {
+ "./client": "./src/client.ts",
+ "./server": "./src/server.ts"
+ },
+ "peerDependencies": {
+ "better-auth": "^1.2.8",
+ "server-only": "^0.0.1"
+ },
+ "dependencies": {
+ "@repo/db": "workspace:*",
+ "@repo/env": "workspace:*"
+ },
+ "devDependencies": {
+ "@repo/typescript-config": "workspace:*",
+ "@types/node": "^20",
+ "typescript": "^5"
+ }
+}
diff --git a/packages/auth/src/server.ts b/packages/auth/src/server.ts
index 6b91db6b..ccf3b547 100644
--- a/packages/auth/src/server.ts
+++ b/packages/auth/src/server.ts
@@ -5,23 +5,23 @@ import { db } from "@repo/db";
import { env } from "@repo/env/server";
export const GOOGLE_OAUTH_SCOPES = [
- "email",
- "profile",
- "openid",
- "https://mail.google.com/",
- "https://www.googleapis.com/auth/calendar",
+ "email",
+ "profile",
+ "openid",
+ "https://mail.google.com/",
+ "https://www.googleapis.com/auth/calendar",
];
export const auth = betterAuth({
- database: drizzleAdapter(db, {
- provider: "pg",
- }),
- socialProviders: {
- google: {
- clientId: env.GOOGLE_CLIENT_ID,
- clientSecret: env.GOOGLE_CLIENT_SECRET,
- scope: GOOGLE_OAUTH_SCOPES,
- accessType: "offline",
- },
- },
+ database: drizzleAdapter(db, {
+ provider: "pg",
+ }),
+ socialProviders: {
+ google: {
+ clientId: env.GOOGLE_CLIENT_ID,
+ clientSecret: env.GOOGLE_CLIENT_SECRET,
+ scope: GOOGLE_OAUTH_SCOPES,
+ accessType: "offline",
+ },
+ },
});
diff --git a/packages/auth/tsconfig.json b/packages/auth/tsconfig.json
index e458c4ab..b71eb8d0 100644
--- a/packages/auth/tsconfig.json
+++ b/packages/auth/tsconfig.json
@@ -1,10 +1,10 @@
{
- "extends": "@repo/typescript-config/base.json",
- "compilerOptions": {
- "composite": false,
- "declaration": false,
- "declarationMap": false
- },
- "include": ["**/*.ts", "**/*.tsx", "../db/src/schema/auth-schema.ts"],
- "exclude": ["node_modules"]
-}
\ No newline at end of file
+ "extends": "@repo/typescript-config/base.json",
+ "compilerOptions": {
+ "composite": false,
+ "declaration": false,
+ "declarationMap": false
+ },
+ "include": ["**/*.ts", "**/*.tsx", "../db/src/schema/auth-schema.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/packages/db/drizzle.config.ts b/packages/db/drizzle.config.ts
index 54fbb529..79acff8f 100644
--- a/packages/db/drizzle.config.ts
+++ b/packages/db/drizzle.config.ts
@@ -1,10 +1,10 @@
import { defineConfig } from "drizzle-kit";
export default defineConfig({
- out: "./drizzle",
- schema: "./src/schema/index.ts",
- dialect: "postgresql",
- dbCredentials: {
- url: process.env.DATABASE_URL!,
- },
+ out: "./drizzle",
+ schema: "./src/schema/index.ts",
+ dialect: "postgresql",
+ dbCredentials: {
+ url: process.env.DATABASE_URL!,
+ },
});
diff --git a/packages/db/eslint.config.mjs b/packages/db/eslint.config.mjs
deleted file mode 100644
index 31bf7507..00000000
--- a/packages/db/eslint.config.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { config } from "@repo/eslint-config/base";
-
-/** @type {import("eslint").Linter.Config} */
-export default config;
\ No newline at end of file
diff --git a/packages/db/package.json b/packages/db/package.json
index 522d16bc..dbd8109f 100644
--- a/packages/db/package.json
+++ b/packages/db/package.json
@@ -1,30 +1,27 @@
{
- "name": "@repo/db",
- "version": "0.1.0",
- "private": true,
- "exports": {
- ".": "./src/index.ts",
- "./schema": "./src/schema/index.ts"
- },
- "scripts": {
- "lint": "eslint .",
- "db:generate": "drizzle-kit generate",
- "db:migrate": "drizzle-kit migrate",
- "db:push": "drizzle-kit push",
- "db:studio": "drizzle-kit studio"
- },
- "dependencies": {
- "@repo/env": "workspace:*",
- "drizzle-orm": "^0.43.1",
- "postgres": "^3.4.5",
- "server-only": "^0.0.1"
- },
- "devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "drizzle-kit": "^0.31.1",
- "eslint": "^9",
- "typescript": "^5"
- }
-}
\ No newline at end of file
+ "name": "@repo/db",
+ "version": "0.1.0",
+ "private": true,
+ "exports": {
+ ".": "./src/index.ts",
+ "./schema": "./src/schema/index.ts"
+ },
+ "scripts": {
+ "db:generate": "drizzle-kit generate",
+ "db:migrate": "drizzle-kit migrate",
+ "db:push": "drizzle-kit push",
+ "db:studio": "drizzle-kit studio"
+ },
+ "dependencies": {
+ "@repo/env": "workspace:*",
+ "drizzle-orm": "^0.43.1",
+ "postgres": "^3.4.5",
+ "server-only": "^0.0.1"
+ },
+ "devDependencies": {
+ "@repo/typescript-config": "workspace:*",
+ "@types/node": "^20",
+ "drizzle-kit": "^0.31.1",
+ "typescript": "^5"
+ }
+}
diff --git a/packages/db/src/schema/auth.ts b/packages/db/src/schema/auth.ts
index 0b23017b..63617969 100644
--- a/packages/db/src/schema/auth.ts
+++ b/packages/db/src/schema/auth.ts
@@ -1,53 +1,53 @@
import { pgTable, text, timestamp, boolean } from "drizzle-orm/pg-core";
export const user = pgTable("user", {
- id: text("id").primaryKey(),
- name: text("name").notNull(),
- email: text("email").notNull().unique(),
- emailVerified: boolean("email_verified")
- .$defaultFn(() => false)
- .notNull(),
- image: text("image"),
- createdAt: timestamp("created_at").defaultNow().notNull(),
- updatedAt: timestamp("updated_at").defaultNow().notNull(),
+ id: text("id").primaryKey(),
+ name: text("name").notNull(),
+ email: text("email").notNull().unique(),
+ emailVerified: boolean("email_verified")
+ .$defaultFn(() => false)
+ .notNull(),
+ image: text("image"),
+ createdAt: timestamp("created_at").defaultNow().notNull(),
+ updatedAt: timestamp("updated_at").defaultNow().notNull(),
});
export const session = pgTable("session", {
- id: text("id").primaryKey(),
- expiresAt: timestamp("expires_at").notNull(),
- token: text("token").notNull().unique(),
- createdAt: timestamp("created_at").notNull(),
- updatedAt: timestamp("updated_at").notNull(),
- ipAddress: text("ip_address"),
- userAgent: text("user_agent"),
- userId: text("user_id")
- .notNull()
- .references(() => user.id, { onDelete: "cascade" }),
+ id: text("id").primaryKey(),
+ expiresAt: timestamp("expires_at").notNull(),
+ token: text("token").notNull().unique(),
+ createdAt: timestamp("created_at").notNull(),
+ updatedAt: timestamp("updated_at").notNull(),
+ ipAddress: text("ip_address"),
+ userAgent: text("user_agent"),
+ userId: text("user_id")
+ .notNull()
+ .references(() => user.id, { onDelete: "cascade" }),
});
export const account = pgTable("account", {
- id: text("id").primaryKey(),
- accountId: text("account_id").notNull(),
- providerId: text("provider_id").notNull(),
- userId: text("user_id")
- .notNull()
- .references(() => user.id, { onDelete: "cascade" }),
- accessToken: text("access_token"),
- refreshToken: text("refresh_token"),
- idToken: text("id_token"),
- accessTokenExpiresAt: timestamp("access_token_expires_at"),
- refreshTokenExpiresAt: timestamp("refresh_token_expires_at"),
- scope: text("scope"),
- password: text("password"),
- createdAt: timestamp("created_at").notNull(),
- updatedAt: timestamp("updated_at").notNull(),
+ id: text("id").primaryKey(),
+ accountId: text("account_id").notNull(),
+ providerId: text("provider_id").notNull(),
+ userId: text("user_id")
+ .notNull()
+ .references(() => user.id, { onDelete: "cascade" }),
+ accessToken: text("access_token"),
+ refreshToken: text("refresh_token"),
+ idToken: text("id_token"),
+ accessTokenExpiresAt: timestamp("access_token_expires_at"),
+ refreshTokenExpiresAt: timestamp("refresh_token_expires_at"),
+ scope: text("scope"),
+ password: text("password"),
+ createdAt: timestamp("created_at").notNull(),
+ updatedAt: timestamp("updated_at").notNull(),
});
export const verification = pgTable("verification", {
- id: text("id").primaryKey(),
- identifier: text("identifier").notNull(),
- value: text("value").notNull(),
- expiresAt: timestamp("expires_at").notNull(),
- createdAt: timestamp("created_at").defaultNow(),
- updatedAt: timestamp("updated_at").defaultNow(),
+ id: text("id").primaryKey(),
+ identifier: text("identifier").notNull(),
+ value: text("value").notNull(),
+ expiresAt: timestamp("expires_at").notNull(),
+ createdAt: timestamp("created_at").defaultNow(),
+ updatedAt: timestamp("updated_at").defaultNow(),
});
diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json
index 70c407ed..e86f68f1 100644
--- a/packages/db/tsconfig.json
+++ b/packages/db/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@repo/typescript-config/base.json",
- "include": ["**/*.ts", "**/*.tsx"],
- "exclude": ["node_modules"]
-}
\ No newline at end of file
+ "extends": "@repo/typescript-config/base.json",
+ "include": ["**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/packages/env/eslint.config.mjs b/packages/env/eslint.config.mjs
deleted file mode 100644
index 31bf7507..00000000
--- a/packages/env/eslint.config.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-import { config } from "@repo/eslint-config/base";
-
-/** @type {import("eslint").Linter.Config} */
-export default config;
\ No newline at end of file
diff --git a/packages/env/package.json b/packages/env/package.json
index 2f634fd8..61292a63 100644
--- a/packages/env/package.json
+++ b/packages/env/package.json
@@ -1,23 +1,18 @@
{
- "name": "@repo/env",
- "version": "0.1.0",
- "private": true,
- "exports": {
- "./client": "./src/client.ts",
- "./server": "./src/server.ts"
- },
- "scripts": {
- "lint": "eslint ."
- },
- "dependencies": {
- "@t3-oss/env-nextjs": "^0.13.4",
- "zod": "^3.24.4"
- },
- "devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "eslint": "^9",
- "typescript": "^5"
- }
-}
\ No newline at end of file
+ "name": "@repo/env",
+ "version": "0.1.0",
+ "private": true,
+ "exports": {
+ "./client": "./src/client.ts",
+ "./server": "./src/server.ts"
+ },
+ "dependencies": {
+ "@t3-oss/env-nextjs": "^0.13.4",
+ "zod": "^3.24.4"
+ },
+ "devDependencies": {
+ "@repo/typescript-config": "workspace:*",
+ "@types/node": "^20",
+ "typescript": "^5"
+ }
+}
diff --git a/packages/env/src/client.ts b/packages/env/src/client.ts
index 0ab35142..add45863 100644
--- a/packages/env/src/client.ts
+++ b/packages/env/src/client.ts
@@ -1,7 +1,7 @@
import { createEnv } from "@t3-oss/env-nextjs";
export const env = createEnv({
- client: {},
- runtimeEnv: {},
- skipValidation: process.env.NODE_ENV !== "production",
+ client: {},
+ runtimeEnv: {},
+ skipValidation: process.env.NODE_ENV !== "production",
});
diff --git a/packages/env/src/server.ts b/packages/env/src/server.ts
index ee818370..5014deae 100644
--- a/packages/env/src/server.ts
+++ b/packages/env/src/server.ts
@@ -2,15 +2,15 @@ import { z } from "zod";
import { createEnv } from "@t3-oss/env-nextjs";
export const env = createEnv({
- server: {
- NODE_ENV: z.enum(["development", "production", "test"]),
- DATABASE_URL: z.string().url().startsWith("postgresql://"),
- BETTER_AUTH_SECRET: z.string().min(32),
- BETTER_AUTH_URL: z.string().url(),
- GOOGLE_CLIENT_ID: z.string().min(1),
- GOOGLE_CLIENT_SECRET: z.string().min(1),
- VERCEL_URL: z.string(),
- },
- experimental__runtimeEnv: process.env,
- skipValidation: process.env.NODE_ENV !== "production",
+ server: {
+ NODE_ENV: z.enum(["development", "production", "test"]),
+ DATABASE_URL: z.string().url().startsWith("postgresql://"),
+ BETTER_AUTH_SECRET: z.string().min(32),
+ BETTER_AUTH_URL: z.string().url(),
+ GOOGLE_CLIENT_ID: z.string().min(1),
+ GOOGLE_CLIENT_SECRET: z.string().min(1),
+ VERCEL_URL: z.string(),
+ },
+ experimental__runtimeEnv: process.env,
+ skipValidation: process.env.NODE_ENV !== "production",
});
diff --git a/packages/env/tsconfig.json b/packages/env/tsconfig.json
index 70c407ed..e86f68f1 100644
--- a/packages/env/tsconfig.json
+++ b/packages/env/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@repo/typescript-config/base.json",
- "include": ["**/*.ts", "**/*.tsx"],
- "exclude": ["node_modules"]
-}
\ No newline at end of file
+ "extends": "@repo/typescript-config/base.json",
+ "include": ["**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/packages/google-calendar/package.json b/packages/google-calendar/package.json
index 069a3586..b1408837 100644
--- a/packages/google-calendar/package.json
+++ b/packages/google-calendar/package.json
@@ -1,14 +1,14 @@
{
- "name": "@repo/google-calendar",
- "version": "0.0.1-alpha.0",
- "private": true,
- "exports": {
- ".": "./src/index.ts"
- },
- "dependencies": {},
- "devDependencies": {
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20",
- "typescript": "^5"
- }
+ "name": "@repo/google-calendar",
+ "version": "0.0.1-alpha.0",
+ "private": true,
+ "exports": {
+ ".": "./src/index.ts"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "@repo/typescript-config": "workspace:*",
+ "@types/node": "^20",
+ "typescript": "^5"
+ }
}
diff --git a/packages/google-calendar/src/client.ts b/packages/google-calendar/src/client.ts
index 3fd56c1f..28a5633e 100644
--- a/packages/google-calendar/src/client.ts
+++ b/packages/google-calendar/src/client.ts
@@ -1,28 +1,16 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+import type { RequestInit, RequestInfo, BodyInit } from "./internal/builtin-types";
import type {
- RequestInit,
- RequestInfo,
- BodyInit,
-} from "./internal/builtin-types";
-import type {
- HTTPMethod,
- PromiseOrValue,
- MergedRequestInit,
- FinalizedRequestInit,
+ HTTPMethod,
+ PromiseOrValue,
+ MergedRequestInit,
+ FinalizedRequestInit,
} from "./internal/types";
import { uuid4 } from "./internal/utils/uuid";
-import {
- validatePositiveInteger,
- isAbsoluteURL,
- safeJSON,
-} from "./internal/utils/values";
+import { validatePositiveInteger, isAbsoluteURL, safeJSON } from "./internal/utils/values";
import { sleep } from "./internal/utils/sleep";
-import {
- type Logger,
- type LogLevel,
- parseLogLevel,
-} from "./internal/utils/log";
+import { type Logger, type LogLevel, parseLogLevel } from "./internal/utils/log";
export type { Logger, LogLevel } from "./internal/utils/log";
import { castToError, isAbortError } from "./internal/errors";
import type { APIResponseProps } from "./internal/parse";
@@ -35,795 +23,717 @@ import * as Errors from "./core/error";
import * as Uploads from "./core/uploads";
import * as API from "./resources/index";
import { APIPromise } from "./core/api-promise";
-import { type Fetch } from "./internal/builtin-types";
-import { HeadersLike, NullableHeaders, buildHeaders } from "./internal/headers";
+import type { Fetch } from "./internal/builtin-types";
+import { type HeadersLike, type NullableHeaders, buildHeaders } from "./internal/headers";
+import type { FinalRequestOptions, RequestOptions } from "./internal/request-options";
import {
- FinalRequestOptions,
- RequestOptions,
-} from "./internal/request-options";
-import {
- CheckFreeBusy,
- CheckFreeBusyCheckFreeBusyParams,
- CheckFreeBusyCheckFreeBusyResponse,
+ CheckFreeBusy,
+ CheckFreeBusyCheckFreeBusyParams,
+ CheckFreeBusyCheckFreeBusyResponse,
} from "./resources/check-free-busy";
import {
- ListColorListColorsParams,
- ListColorListColorsResponse,
- ListColors,
+ ListColorListColorsParams,
+ ListColorListColorsResponse,
+ ListColors,
} from "./resources/list-colors";
-import {
- StopWatching,
- StopWatchingStopWatchingParams,
-} from "./resources/stop-watching";
+import { StopWatching, StopWatchingStopWatchingParams } from "./resources/stop-watching";
import { readEnv } from "./internal/utils/env";
import { formatRequestDetails, loggerFor } from "./internal/utils/log";
import { isEmptyObj } from "./internal/utils/values";
import {
- Calendar,
- CalendarClearParams,
- CalendarCreateParams,
- CalendarDeleteParams,
- CalendarRetrieveParams,
- CalendarUpdateParams,
- Calendars,
+ Calendar,
+ CalendarClearParams,
+ CalendarCreateParams,
+ CalendarDeleteParams,
+ CalendarRetrieveParams,
+ CalendarUpdateParams,
+ Calendars,
} from "./resources/calendars/calendars";
import { Users } from "./resources/users/users";
export interface ClientOptions {
- accessToken: string;
-
- /**
- * Override the default base URL for the API, e.g., "https://api.example.com/v2/"
- *
- * Defaults to process.env['GOOGLE_CALENDAR_BASE_URL'].
- */
- baseURL?: string | null | undefined;
-
- /**
- * The maximum amount of time (in milliseconds) that the client should wait for a response
- * from the server before timing out a single request.
- *
- * Note that request timeouts are retried by default, so in a worst-case scenario you may wait
- * much longer than this timeout before the promise succeeds or fails.
- */
- timeout?: number | undefined;
- /**
- * Additional `RequestInit` options to be passed to `fetch` calls.
- * Properties will be overridden by per-request `fetchOptions`.
- */
- fetchOptions?: MergedRequestInit | undefined;
-
- /**
- * Specify a custom `fetch` function implementation.
- *
- * If not provided, we expect that `fetch` is defined globally.
- */
- fetch?: Fetch | undefined;
-
- /**
- * The maximum number of times that the client will retry a request in case of a
- * temporary failure, like a network error or a 5XX error from the server.
- *
- * @default 2
- */
- maxRetries?: number | undefined;
-
- /**
- * Default headers to include with every request to the API.
- *
- * These can be removed in individual requests by explicitly setting the
- * header to `null` in request options.
- */
- defaultHeaders?: HeadersLike | undefined;
-
- /**
- * Default query parameters to include with every request to the API.
- *
- * These can be removed in individual requests by explicitly setting the
- * param to `undefined` in request options.
- */
- defaultQuery?: Record | undefined;
-
- /**
- * Set the log level.
- *
- * Defaults to process.env['GOOGLE_CALENDAR_LOG'] or 'warn' if it isn't set.
- */
- logLevel?: LogLevel | undefined;
-
- /**
- * Set the logger.
- *
- * Defaults to globalThis.console.
- */
- logger?: Logger | undefined;
+ accessToken: string;
+
+ /**
+ * Override the default base URL for the API, e.g., "https://api.example.com/v2/"
+ *
+ * Defaults to process.env['GOOGLE_CALENDAR_BASE_URL'].
+ */
+ baseURL?: string | null | undefined;
+
+ /**
+ * The maximum amount of time (in milliseconds) that the client should wait for a response
+ * from the server before timing out a single request.
+ *
+ * Note that request timeouts are retried by default, so in a worst-case scenario you may wait
+ * much longer than this timeout before the promise succeeds or fails.
+ */
+ timeout?: number | undefined;
+ /**
+ * Additional `RequestInit` options to be passed to `fetch` calls.
+ * Properties will be overridden by per-request `fetchOptions`.
+ */
+ fetchOptions?: MergedRequestInit | undefined;
+
+ /**
+ * Specify a custom `fetch` function implementation.
+ *
+ * If not provided, we expect that `fetch` is defined globally.
+ */
+ fetch?: Fetch | undefined;
+
+ /**
+ * The maximum number of times that the client will retry a request in case of a
+ * temporary failure, like a network error or a 5XX error from the server.
+ *
+ * @default 2
+ */
+ maxRetries?: number | undefined;
+
+ /**
+ * Default headers to include with every request to the API.
+ *
+ * These can be removed in individual requests by explicitly setting the
+ * header to `null` in request options.
+ */
+ defaultHeaders?: HeadersLike | undefined;
+
+ /**
+ * Default query parameters to include with every request to the API.
+ *
+ * These can be removed in individual requests by explicitly setting the
+ * param to `undefined` in request options.
+ */
+ defaultQuery?: Record | undefined;
+
+ /**
+ * Set the log level.
+ *
+ * Defaults to process.env['GOOGLE_CALENDAR_LOG'] or 'warn' if it isn't set.
+ */
+ logLevel?: LogLevel | undefined;
+
+ /**
+ * Set the logger.
+ *
+ * Defaults to globalThis.console.
+ */
+ logger?: Logger | undefined;
}
/**
* API Client for interfacing with the Google Calendar API.
*/
export class GoogleCalendar {
- accessToken: string;
-
- baseURL: string;
- maxRetries: number;
- timeout: number;
- logger: Logger | undefined;
- logLevel: LogLevel | undefined;
- fetchOptions: MergedRequestInit | undefined;
-
- private fetch: Fetch;
- #encoder: Opts.RequestEncoder;
- protected idempotencyHeader?: string;
- private _options: ClientOptions;
-
- /**
- * API Client for interfacing with the Google Calendar API.
- *
- * @param {string} opts.accessToken
- * @param {string} [opts.baseURL=process.env['GOOGLE_CALENDAR_BASE_URL'] ?? https://www.googleapis.com/calendar/v3] - Override the default base URL for the API.
- * @param {number} [opts.timeout=1 minute] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out.
- * @param {MergedRequestInit} [opts.fetchOptions] - Additional `RequestInit` options to be passed to `fetch` calls.
- * @param {Fetch} [opts.fetch] - Specify a custom `fetch` function implementation.
- * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request.
- * @param {HeadersLike} opts.defaultHeaders - Default headers to include with every request to the API.
- * @param {Record} opts.defaultQuery - Default query parameters to include with every request to the API.
- */
- constructor({
- baseURL = readEnv("GOOGLE_CALENDAR_BASE_URL"),
- accessToken,
- ...opts
- }: ClientOptions) {
- if (accessToken === undefined) {
- throw new Errors.GoogleCalendarError(
- "Missing required client option accessToken; you need to instantiate the GoogleCalendar client with an accessToken option, like new GoogleCalendar({ accessToken: 'My Access Token' }).",
- );
- }
-
- const options: ClientOptions = {
- accessToken,
- ...opts,
- baseURL: baseURL || `https://www.googleapis.com/calendar/v3`,
- };
-
- this.baseURL = options.baseURL!;
- this.timeout =
- options.timeout ?? GoogleCalendar.DEFAULT_TIMEOUT /* 1 minute */;
- this.logger = options.logger ?? console;
- const defaultLogLevel = "warn";
- // Set default logLevel early so that we can log a warning in parseLogLevel.
- this.logLevel = defaultLogLevel;
- this.logLevel =
- parseLogLevel(options.logLevel, "ClientOptions.logLevel", this) ??
- parseLogLevel(
- readEnv("GOOGLE_CALENDAR_LOG"),
- "process.env['GOOGLE_CALENDAR_LOG']",
- this,
- ) ??
- defaultLogLevel;
- this.fetchOptions = options.fetchOptions;
- this.maxRetries = options.maxRetries ?? 2;
- this.fetch = options.fetch ?? Shims.getDefaultFetch();
- this.#encoder = Opts.FallbackEncoder;
-
- this._options = options;
-
- this.accessToken = accessToken;
- }
-
- /**
- * Create a new client instance re-using the same options given to the current client with optional overriding.
- */
- withOptions(options: Partial): this {
- return new (this.constructor as any as new (
- props: ClientOptions,
- ) => typeof this)({
- ...this._options,
- baseURL: this.baseURL,
- maxRetries: this.maxRetries,
- timeout: this.timeout,
- logger: this.logger,
- logLevel: this.logLevel,
- fetchOptions: this.fetchOptions,
- accessToken: this.accessToken,
- ...options,
- });
- }
-
- protected defaultQuery(): Record | undefined {
- return this._options.defaultQuery;
- }
-
- protected validateHeaders({ values, nulls }: NullableHeaders) {
- return;
- }
-
- protected authHeaders(
- opts: FinalRequestOptions,
- ): NullableHeaders | undefined {
- return buildHeaders([{ Authorization: `Bearer ${this.accessToken}` }]);
- }
-
- protected stringifyQuery(query: Record): string {
- return qs.stringify(query, { arrayFormat: "comma" });
- }
-
- private getUserAgent(): string {
- return `${this.constructor.name}/JS ${VERSION}`;
- }
-
- protected defaultIdempotencyKey(): string {
- return `stainless-node-retry-${uuid4()}`;
- }
-
- protected makeStatusError(
- status: number,
- error: Object,
- message: string | undefined,
- headers: Headers,
- ): Errors.APIError {
- return Errors.APIError.generate(status, error, message, headers);
- }
-
- buildURL(
- path: string,
- query: Record | null | undefined,
- ): string {
- const url = isAbsoluteURL(path)
- ? new URL(path)
- : new URL(
- this.baseURL +
- (this.baseURL.endsWith("/") && path.startsWith("/")
- ? path.slice(1)
- : path),
- );
-
- const defaultQuery = this.defaultQuery();
- if (!isEmptyObj(defaultQuery)) {
- query = { ...defaultQuery, ...query };
- }
-
- if (typeof query === "object" && query && !Array.isArray(query)) {
- url.search = this.stringifyQuery(query as Record);
- }
-
- return url.toString();
- }
-
- /**
- * Used as a callback for mutating the given `FinalRequestOptions` object.
- */
- protected async prepareOptions(options: FinalRequestOptions): Promise {}
-
- /**
- * Used as a callback for mutating the given `RequestInit` object.
- *
- * This is useful for cases where you want to add certain headers based off of
- * the request properties, e.g. `method` or `url`.
- */
- protected async prepareRequest(
- request: RequestInit,
- { url, options }: { url: string; options: FinalRequestOptions },
- ): Promise {}
-
- get(
- path: string,
- opts?: PromiseOrValue,
- ): APIPromise {
- return this.methodRequest("get", path, opts);
- }
-
- post(
- path: string,
- opts?: PromiseOrValue,
- ): APIPromise {
- return this.methodRequest("post", path, opts);
- }
-
- patch(
- path: string,
- opts?: PromiseOrValue,
- ): APIPromise {
- return this.methodRequest("patch", path, opts);
- }
-
- put(
- path: string,
- opts?: PromiseOrValue,
- ): APIPromise {
- return this.methodRequest("put", path, opts);
- }
-
- delete(
- path: string,
- opts?: PromiseOrValue,
- ): APIPromise {
- return this.methodRequest("delete", path, opts);
- }
-
- private methodRequest(
- method: HTTPMethod,
- path: string,
- opts?: PromiseOrValue,
- ): APIPromise {
- return this.request(
- Promise.resolve(opts).then((opts) => {
- return { method, path, ...opts };
- }),
- );
- }
-
- request(
- options: PromiseOrValue,
- remainingRetries: number | null = null,
- ): APIPromise {
- return new APIPromise(
- this,
- this.makeRequest(options, remainingRetries, undefined),
- );
- }
-
- private async makeRequest(
- optionsInput: PromiseOrValue,
- retriesRemaining: number | null,
- retryOfRequestLogID: string | undefined,
- ): Promise {
- const options = await optionsInput;
- const maxRetries = options.maxRetries ?? this.maxRetries;
- if (retriesRemaining == null) {
- retriesRemaining = maxRetries;
- }
-
- await this.prepareOptions(options);
-
- const { req, url, timeout } = this.buildRequest(options, {
- retryCount: maxRetries - retriesRemaining,
- });
-
- await this.prepareRequest(req, { url, options });
-
- /** Not an API request ID, just for correlating local log entries. */
- const requestLogID =
- "log_" + ((Math.random() * (1 << 24)) | 0).toString(16).padStart(6, "0");
- const retryLogStr =
- retryOfRequestLogID === undefined
- ? ""
- : `, retryOf: ${retryOfRequestLogID}`;
- const startTime = Date.now();
-
- loggerFor(this).debug(
- `[${requestLogID}] sending request`,
- formatRequestDetails({
- retryOfRequestLogID,
- method: options.method,
- url,
- options,
- headers: req.headers,
- }),
- );
-
- if (options.signal?.aborted) {
- throw new Errors.APIUserAbortError();
- }
-
- const controller = new AbortController();
- const response = await this.fetchWithTimeout(
- url,
- req,
- timeout,
- controller,
- ).catch(castToError);
- const headersTime = Date.now();
-
- if (response instanceof Error) {
- const retryMessage = `retrying, ${retriesRemaining} attempts remaining`;
- if (options.signal?.aborted) {
- throw new Errors.APIUserAbortError();
- }
- // detect native connection timeout errors
- // deno throws "TypeError: error sending request for url (https://example/): client error (Connect): tcp connect error: Operation timed out (os error 60): Operation timed out (os error 60)"
- // undici throws "TypeError: fetch failed" with cause "ConnectTimeoutError: Connect Timeout Error (attempted address: example:443, timeout: 1ms)"
- // others do not provide enough information to distinguish timeouts from other connection errors
- const isTimeout =
- isAbortError(response) ||
- /timed? ?out/i.test(
- String(response) +
- ("cause" in response ? String(response.cause) : ""),
- );
- if (retriesRemaining) {
- loggerFor(this).info(
- `[${requestLogID}] connection ${isTimeout ? "timed out" : "failed"} - ${retryMessage}`,
- );
- loggerFor(this).debug(
- `[${requestLogID}] connection ${isTimeout ? "timed out" : "failed"} (${retryMessage})`,
- formatRequestDetails({
- retryOfRequestLogID,
- url,
- durationMs: headersTime - startTime,
- message: response.message,
- }),
- );
- return this.retryRequest(
- options,
- retriesRemaining,
- retryOfRequestLogID ?? requestLogID,
- );
- }
- loggerFor(this).info(
- `[${requestLogID}] connection ${isTimeout ? "timed out" : "failed"} - error; no more retries left`,
- );
- loggerFor(this).debug(
- `[${requestLogID}] connection ${isTimeout ? "timed out" : "failed"} (error; no more retries left)`,
- formatRequestDetails({
- retryOfRequestLogID,
- url,
- durationMs: headersTime - startTime,
- message: response.message,
- }),
- );
- if (isTimeout) {
- throw new Errors.APIConnectionTimeoutError();
- }
- throw new Errors.APIConnectionError({ cause: response });
- }
-
- const responseInfo = `[${requestLogID}${retryLogStr}] ${req.method} ${url} ${
- response.ok ? "succeeded" : "failed"
- } with status ${response.status} in ${headersTime - startTime}ms`;
-
- if (!response.ok) {
- const shouldRetry = this.shouldRetry(response);
- if (retriesRemaining && shouldRetry) {
- const retryMessage = `retrying, ${retriesRemaining} attempts remaining`;
-
- // We don't need the body of this response.
- await Shims.CancelReadableStream(response.body);
- loggerFor(this).info(`${responseInfo} - ${retryMessage}`);
- loggerFor(this).debug(
- `[${requestLogID}] response error (${retryMessage})`,
- formatRequestDetails({
- retryOfRequestLogID,
- url: response.url,
- status: response.status,
- headers: response.headers,
- durationMs: headersTime - startTime,
- }),
- );
- return this.retryRequest(
- options,
- retriesRemaining,
- retryOfRequestLogID ?? requestLogID,
- response.headers,
- );
- }
-
- const retryMessage = shouldRetry
- ? `error; no more retries left`
- : `error; not retryable`;
-
- loggerFor(this).info(`${responseInfo} - ${retryMessage}`);
-
- const errText = await response
- .text()
- .catch((err: any) => castToError(err).message);
- const errJSON = safeJSON(errText);
- const errMessage = errJSON ? undefined : errText;
-
- loggerFor(this).debug(
- `[${requestLogID}] response error (${retryMessage})`,
- formatRequestDetails({
- retryOfRequestLogID,
- url: response.url,
- status: response.status,
- headers: response.headers,
- message: errMessage,
- durationMs: Date.now() - startTime,
- }),
- );
-
- const err = this.makeStatusError(
- response.status,
- errJSON,
- errMessage,
- response.headers,
- );
- throw err;
- }
-
- loggerFor(this).info(responseInfo);
- loggerFor(this).debug(
- `[${requestLogID}] response start`,
- formatRequestDetails({
- retryOfRequestLogID,
- url: response.url,
- status: response.status,
- headers: response.headers,
- durationMs: headersTime - startTime,
- }),
- );
-
- return {
- response,
- options,
- controller,
- requestLogID,
- retryOfRequestLogID,
- startTime,
- };
- }
-
- async fetchWithTimeout(
- url: RequestInfo,
- init: RequestInit | undefined,
- ms: number,
- controller: AbortController,
- ): Promise {
- const { signal, method, ...options } = init || {};
- if (signal) signal.addEventListener("abort", () => controller.abort());
-
- const timeout = setTimeout(() => controller.abort(), ms);
-
- const isReadableBody =
- ((globalThis as any).ReadableStream &&
- options.body instanceof (globalThis as any).ReadableStream) ||
- (typeof options.body === "object" &&
- options.body !== null &&
- Symbol.asyncIterator in options.body);
-
- const fetchOptions: RequestInit = {
- signal: controller.signal as any,
- ...(isReadableBody ? { duplex: "half" } : {}),
- method: "GET",
- ...options,
- };
- if (method) {
- // Custom methods like 'patch' need to be uppercased
- // See https://github.com/nodejs/undici/issues/2294
- fetchOptions.method = method.toUpperCase();
- }
-
- try {
- // use undefined this binding; fetch errors if bound to something else in browser/cloudflare
- return await this.fetch.call(undefined, url, fetchOptions);
- } finally {
- clearTimeout(timeout);
- }
- }
-
- private shouldRetry(response: Response): boolean {
- // Note this is not a standard header.
- const shouldRetryHeader = response.headers.get("x-should-retry");
-
- // If the server explicitly says whether or not to retry, obey.
- if (shouldRetryHeader === "true") return true;
- if (shouldRetryHeader === "false") return false;
-
- // Retry on request timeouts.
- if (response.status === 408) return true;
-
- // Retry on lock timeouts.
- if (response.status === 409) return true;
-
- // Retry on rate limits.
- if (response.status === 429) return true;
-
- // Retry internal errors.
- if (response.status >= 500) return true;
-
- return false;
- }
-
- private async retryRequest(
- options: FinalRequestOptions,
- retriesRemaining: number,
- requestLogID: string,
- responseHeaders?: Headers | undefined,
- ): Promise {
- let timeoutMillis: number | undefined;
-
- // Note the `retry-after-ms` header may not be standard, but is a good idea and we'd like proactive support for it.
- const retryAfterMillisHeader = responseHeaders?.get("retry-after-ms");
- if (retryAfterMillisHeader) {
- const timeoutMs = parseFloat(retryAfterMillisHeader);
- if (!Number.isNaN(timeoutMs)) {
- timeoutMillis = timeoutMs;
- }
- }
-
- // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After
- const retryAfterHeader = responseHeaders?.get("retry-after");
- if (retryAfterHeader && !timeoutMillis) {
- const timeoutSeconds = parseFloat(retryAfterHeader);
- if (!Number.isNaN(timeoutSeconds)) {
- timeoutMillis = timeoutSeconds * 1000;
- } else {
- timeoutMillis = Date.parse(retryAfterHeader) - Date.now();
- }
- }
-
- // If the API asks us to wait a certain amount of time (and it's a reasonable amount),
- // just do what it says, but otherwise calculate a default
- if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) {
- const maxRetries = options.maxRetries ?? this.maxRetries;
- timeoutMillis = this.calculateDefaultRetryTimeoutMillis(
- retriesRemaining,
- maxRetries,
- );
- }
- await sleep(timeoutMillis);
-
- return this.makeRequest(options, retriesRemaining - 1, requestLogID);
- }
-
- private calculateDefaultRetryTimeoutMillis(
- retriesRemaining: number,
- maxRetries: number,
- ): number {
- const initialRetryDelay = 0.5;
- const maxRetryDelay = 8.0;
-
- const numRetries = maxRetries - retriesRemaining;
-
- // Apply exponential backoff, but not more than the max.
- const sleepSeconds = Math.min(
- initialRetryDelay * Math.pow(2, numRetries),
- maxRetryDelay,
- );
-
- // Apply some jitter, take up to at most 25 percent of the retry time.
- const jitter = 1 - Math.random() * 0.25;
-
- return sleepSeconds * jitter * 1000;
- }
-
- buildRequest(
- inputOptions: FinalRequestOptions,
- { retryCount = 0 }: { retryCount?: number } = {},
- ): { req: FinalizedRequestInit; url: string; timeout: number } {
- const options = { ...inputOptions };
- const { method, path, query } = options;
-
- const url = this.buildURL(path!, query as Record);
- if ("timeout" in options)
- validatePositiveInteger("timeout", options.timeout);
- options.timeout = options.timeout ?? this.timeout;
- const { bodyHeaders, body } = this.buildBody({ options });
- const reqHeaders = this.buildHeaders({
- options: inputOptions,
- method,
- bodyHeaders,
- retryCount,
- });
-
- const req: FinalizedRequestInit = {
- method,
- headers: reqHeaders,
- ...(options.signal && { signal: options.signal }),
- ...((globalThis as any).ReadableStream &&
- body instanceof (globalThis as any).ReadableStream && {
- duplex: "half",
- }),
- ...(body && { body }),
- ...((this.fetchOptions as any) ?? {}),
- ...((options.fetchOptions as any) ?? {}),
- };
-
- return { req, url, timeout: options.timeout };
- }
-
- private buildHeaders({
- options,
- method,
- bodyHeaders,
- retryCount,
- }: {
- options: FinalRequestOptions;
- method: HTTPMethod;
- bodyHeaders: HeadersLike;
- retryCount: number;
- }): Headers {
- let idempotencyHeaders: HeadersLike = {};
- if (this.idempotencyHeader && method !== "get") {
- if (!options.idempotencyKey)
- options.idempotencyKey = this.defaultIdempotencyKey();
- idempotencyHeaders[this.idempotencyHeader] = options.idempotencyKey;
- }
-
- const headers = buildHeaders([
- idempotencyHeaders,
- {
- Accept: "application/json",
- "User-Agent": this.getUserAgent(),
- "X-Stainless-Retry-Count": String(retryCount),
- ...(options.timeout
- ? {
- "X-Stainless-Timeout": String(Math.trunc(options.timeout / 1000)),
- }
- : {}),
- ...getPlatformHeaders(),
- },
- this.authHeaders(options),
- this._options.defaultHeaders,
- bodyHeaders,
- options.headers,
- ]);
-
- this.validateHeaders(headers);
-
- return headers.values;
- }
-
- private buildBody({
- options: { body, headers: rawHeaders },
- }: {
- options: FinalRequestOptions;
- }): {
- bodyHeaders: HeadersLike;
- body: BodyInit | undefined;
- } {
- if (!body) {
- return { bodyHeaders: undefined, body: undefined };
- }
- const headers = buildHeaders([rawHeaders]);
- if (
- // Pass raw type verbatim
- ArrayBuffer.isView(body) ||
- body instanceof ArrayBuffer ||
- body instanceof DataView ||
- (typeof body === "string" &&
- // Preserve legacy string encoding behavior for now
- headers.values.has("content-type")) ||
- // `Blob` is superset of `File`
- body instanceof Blob ||
- // `FormData` -> `multipart/form-data`
- body instanceof FormData ||
- // `URLSearchParams` -> `application/x-www-form-urlencoded`
- body instanceof URLSearchParams ||
- // Send chunked stream (each chunk has own `length`)
- ((globalThis as any).ReadableStream &&
- body instanceof (globalThis as any).ReadableStream)
- ) {
- return { bodyHeaders: undefined, body: body as BodyInit };
- } else if (
- typeof body === "object" &&
- (Symbol.asyncIterator in body ||
- (Symbol.iterator in body &&
- "next" in body &&
- typeof body.next === "function"))
- ) {
- return {
- bodyHeaders: undefined,
- body: Shims.ReadableStreamFrom(body as AsyncIterable),
- };
- } else {
- return this.#encoder({ body, headers });
- }
- }
-
- static GoogleCalendar = this;
- static DEFAULT_TIMEOUT = 60000; // 1 minute
-
- static GoogleCalendarError = Errors.GoogleCalendarError;
- static APIError = Errors.APIError;
- static APIConnectionError = Errors.APIConnectionError;
- static APIConnectionTimeoutError = Errors.APIConnectionTimeoutError;
- static APIUserAbortError = Errors.APIUserAbortError;
- static NotFoundError = Errors.NotFoundError;
- static ConflictError = Errors.ConflictError;
- static RateLimitError = Errors.RateLimitError;
- static BadRequestError = Errors.BadRequestError;
- static AuthenticationError = Errors.AuthenticationError;
- static InternalServerError = Errors.InternalServerError;
- static PermissionDeniedError = Errors.PermissionDeniedError;
- static UnprocessableEntityError = Errors.UnprocessableEntityError;
-
- static toFile = Uploads.toFile;
-
- calendars: API.Calendars = new API.Calendars(this);
- stopWatching: API.StopWatching = new API.StopWatching(this);
- listColors: API.ListColors = new API.ListColors(this);
- checkFreeBusy: API.CheckFreeBusy = new API.CheckFreeBusy(this);
- users: API.Users = new API.Users(this);
+ accessToken: string;
+
+ baseURL: string;
+ maxRetries: number;
+ timeout: number;
+ logger: Logger | undefined;
+ logLevel: LogLevel | undefined;
+ fetchOptions: MergedRequestInit | undefined;
+
+ private fetch: Fetch;
+ #encoder: Opts.RequestEncoder;
+ protected idempotencyHeader?: string;
+ private _options: ClientOptions;
+
+ /**
+ * API Client for interfacing with the Google Calendar API.
+ *
+ * @param {string} opts.accessToken
+ * @param {string} [opts.baseURL=process.env['GOOGLE_CALENDAR_BASE_URL'] ?? https://www.googleapis.com/calendar/v3] - Override the default base URL for the API.
+ * @param {number} [opts.timeout=1 minute] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out.
+ * @param {MergedRequestInit} [opts.fetchOptions] - Additional `RequestInit` options to be passed to `fetch` calls.
+ * @param {Fetch} [opts.fetch] - Specify a custom `fetch` function implementation.
+ * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request.
+ * @param {HeadersLike} opts.defaultHeaders - Default headers to include with every request to the API.
+ * @param {Record} opts.defaultQuery - Default query parameters to include with every request to the API.
+ */
+ constructor({
+ baseURL = readEnv("GOOGLE_CALENDAR_BASE_URL"),
+ accessToken,
+ ...opts
+ }: ClientOptions) {
+ if (accessToken === undefined) {
+ throw new Errors.GoogleCalendarError(
+ "Missing required client option accessToken; you need to instantiate the GoogleCalendar client with an accessToken option, like new GoogleCalendar({ accessToken: 'My Access Token' }).",
+ );
+ }
+
+ const options: ClientOptions = {
+ accessToken,
+ ...opts,
+ baseURL: baseURL || "https://www.googleapis.com/calendar/v3",
+ };
+
+ this.baseURL = options.baseURL!;
+ this.timeout = options.timeout ?? GoogleCalendar.DEFAULT_TIMEOUT /* 1 minute */;
+ this.logger = options.logger ?? console;
+ const defaultLogLevel = "warn";
+ // Set default logLevel early so that we can log a warning in parseLogLevel.
+ this.logLevel = defaultLogLevel;
+ this.logLevel =
+ parseLogLevel(options.logLevel, "ClientOptions.logLevel", this) ??
+ parseLogLevel(readEnv("GOOGLE_CALENDAR_LOG"), "process.env['GOOGLE_CALENDAR_LOG']", this) ??
+ defaultLogLevel;
+ this.fetchOptions = options.fetchOptions;
+ this.maxRetries = options.maxRetries ?? 2;
+ this.fetch = options.fetch ?? Shims.getDefaultFetch();
+ this.#encoder = Opts.FallbackEncoder;
+
+ this._options = options;
+
+ this.accessToken = accessToken;
+ }
+
+ /**
+ * Create a new client instance re-using the same options given to the current client with optional overriding.
+ */
+ withOptions(options: Partial): this {
+ return new (this.constructor as any as new (props: ClientOptions) => typeof this)({
+ ...this._options,
+ baseURL: this.baseURL,
+ maxRetries: this.maxRetries,
+ timeout: this.timeout,
+ logger: this.logger,
+ logLevel: this.logLevel,
+ fetchOptions: this.fetchOptions,
+ accessToken: this.accessToken,
+ ...options,
+ });
+ }
+
+ protected defaultQuery(): Record | undefined {
+ return this._options.defaultQuery;
+ }
+
+ protected validateHeaders({ values, nulls }: NullableHeaders) {
+ return;
+ }
+
+ protected authHeaders(opts: FinalRequestOptions): NullableHeaders | undefined {
+ return buildHeaders([{ Authorization: `Bearer ${this.accessToken}` }]);
+ }
+
+ protected stringifyQuery(query: Record): string {
+ return qs.stringify(query, { arrayFormat: "comma" });
+ }
+
+ private getUserAgent(): string {
+ return `${this.constructor.name}/JS ${VERSION}`;
+ }
+
+ protected defaultIdempotencyKey(): string {
+ return `stainless-node-retry-${uuid4()}`;
+ }
+
+ protected makeStatusError(
+ status: number,
+ error: Object,
+ message: string | undefined,
+ headers: Headers,
+ ): Errors.APIError {
+ return Errors.APIError.generate(status, error, message, headers);
+ }
+
+ buildURL(path: string, query: Record | null | undefined): string {
+ const url = isAbsoluteURL(path)
+ ? new URL(path)
+ : new URL(
+ this.baseURL + (this.baseURL.endsWith("/") && path.startsWith("/") ? path.slice(1) : path),
+ );
+
+ const defaultQuery = this.defaultQuery();
+ if (!isEmptyObj(defaultQuery)) {
+ query = { ...defaultQuery, ...query };
+ }
+
+ if (typeof query === "object" && query && !Array.isArray(query)) {
+ url.search = this.stringifyQuery(query as Record);
+ }
+
+ return url.toString();
+ }
+
+ /**
+ * Used as a callback for mutating the given `FinalRequestOptions` object.
+ */
+ protected async prepareOptions(options: FinalRequestOptions): Promise {}
+
+ /**
+ * Used as a callback for mutating the given `RequestInit` object.
+ *
+ * This is useful for cases where you want to add certain headers based off of
+ * the request properties, e.g. `method` or `url`.
+ */
+ protected async prepareRequest(
+ request: RequestInit,
+ { url, options }: { url: string; options: FinalRequestOptions },
+ ): Promise {}
+
+ get(path: string, opts?: PromiseOrValue): APIPromise {
+ return this.methodRequest("get", path, opts);
+ }
+
+ post(path: string, opts?: PromiseOrValue): APIPromise {
+ return this.methodRequest("post", path, opts);
+ }
+
+ patch(path: string, opts?: PromiseOrValue): APIPromise {
+ return this.methodRequest("patch", path, opts);
+ }
+
+ put(path: string, opts?: PromiseOrValue): APIPromise {
+ return this.methodRequest("put", path, opts);
+ }
+
+ delete(path: string, opts?: PromiseOrValue): APIPromise {
+ return this.methodRequest("delete", path, opts);
+ }
+
+ private methodRequest(
+ method: HTTPMethod,
+ path: string,
+ opts?: PromiseOrValue,
+ ): APIPromise {
+ return this.request(
+ Promise.resolve(opts).then((opts) => {
+ return { method, path, ...opts };
+ }),
+ );
+ }
+
+ request(
+ options: PromiseOrValue,
+ remainingRetries: number | null = null,
+ ): APIPromise {
+ return new APIPromise(this, this.makeRequest(options, remainingRetries, undefined));
+ }
+
+ private async makeRequest(
+ optionsInput: PromiseOrValue,
+ retriesRemaining: number | null,
+ retryOfRequestLogID: string | undefined,
+ ): Promise {
+ const options = await optionsInput;
+ const maxRetries = options.maxRetries ?? this.maxRetries;
+ if (retriesRemaining == null) {
+ retriesRemaining = maxRetries;
+ }
+
+ await this.prepareOptions(options);
+
+ const { req, url, timeout } = this.buildRequest(options, {
+ retryCount: maxRetries - retriesRemaining,
+ });
+
+ await this.prepareRequest(req, { url, options });
+
+ /** Not an API request ID, just for correlating local log entries. */
+ const requestLogID = `log_${((Math.random() * (1 << 24)) | 0).toString(16).padStart(6, "0")}`;
+ const retryLogStr = retryOfRequestLogID === undefined ? "" : `, retryOf: ${retryOfRequestLogID}`;
+ const startTime = Date.now();
+
+ loggerFor(this).debug(
+ `[${requestLogID}] sending request`,
+ formatRequestDetails({
+ retryOfRequestLogID,
+ method: options.method,
+ url,
+ options,
+ headers: req.headers,
+ }),
+ );
+
+ if (options.signal?.aborted) {
+ throw new Errors.APIUserAbortError();
+ }
+
+ const controller = new AbortController();
+ const response = await this.fetchWithTimeout(url, req, timeout, controller).catch(castToError);
+ const headersTime = Date.now();
+
+ if (response instanceof Error) {
+ const retryMessage = `retrying, ${retriesRemaining} attempts remaining`;
+ if (options.signal?.aborted) {
+ throw new Errors.APIUserAbortError();
+ }
+ // detect native connection timeout errors
+ // deno throws "TypeError: error sending request for url (https://example/): client error (Connect): tcp connect error: Operation timed out (os error 60): Operation timed out (os error 60)"
+ // undici throws "TypeError: fetch failed" with cause "ConnectTimeoutError: Connect Timeout Error (attempted address: example:443, timeout: 1ms)"
+ // others do not provide enough information to distinguish timeouts from other connection errors
+ const isTimeout =
+ isAbortError(response) ||
+ /timed? ?out/i.test(String(response) + ("cause" in response ? String(response.cause) : ""));
+ if (retriesRemaining) {
+ loggerFor(this).info(
+ `[${requestLogID}] connection ${isTimeout ? "timed out" : "failed"} - ${retryMessage}`,
+ );
+ loggerFor(this).debug(
+ `[${requestLogID}] connection ${isTimeout ? "timed out" : "failed"} (${retryMessage})`,
+ formatRequestDetails({
+ retryOfRequestLogID,
+ url,
+ durationMs: headersTime - startTime,
+ message: response.message,
+ }),
+ );
+ return this.retryRequest(options, retriesRemaining, retryOfRequestLogID ?? requestLogID);
+ }
+ loggerFor(this).info(
+ `[${requestLogID}] connection ${isTimeout ? "timed out" : "failed"} - error; no more retries left`,
+ );
+ loggerFor(this).debug(
+ `[${requestLogID}] connection ${isTimeout ? "timed out" : "failed"} (error; no more retries left)`,
+ formatRequestDetails({
+ retryOfRequestLogID,
+ url,
+ durationMs: headersTime - startTime,
+ message: response.message,
+ }),
+ );
+ if (isTimeout) {
+ throw new Errors.APIConnectionTimeoutError();
+ }
+ throw new Errors.APIConnectionError({ cause: response });
+ }
+
+ const responseInfo = `[${requestLogID}${retryLogStr}] ${req.method} ${url} ${
+ response.ok ? "succeeded" : "failed"
+ } with status ${response.status} in ${headersTime - startTime}ms`;
+
+ if (!response.ok) {
+ const shouldRetry = this.shouldRetry(response);
+ if (retriesRemaining && shouldRetry) {
+ const retryMessage = `retrying, ${retriesRemaining} attempts remaining`;
+
+ // We don't need the body of this response.
+ await Shims.CancelReadableStream(response.body);
+ loggerFor(this).info(`${responseInfo} - ${retryMessage}`);
+ loggerFor(this).debug(
+ `[${requestLogID}] response error (${retryMessage})`,
+ formatRequestDetails({
+ retryOfRequestLogID,
+ url: response.url,
+ status: response.status,
+ headers: response.headers,
+ durationMs: headersTime - startTime,
+ }),
+ );
+ return this.retryRequest(
+ options,
+ retriesRemaining,
+ retryOfRequestLogID ?? requestLogID,
+ response.headers,
+ );
+ }
+
+ const retryMessage = shouldRetry ? "error; no more retries left" : "error; not retryable";
+
+ loggerFor(this).info(`${responseInfo} - ${retryMessage}`);
+
+ const errText = await response.text().catch((err: any) => castToError(err).message);
+ const errJSON = safeJSON(errText);
+ const errMessage = errJSON ? undefined : errText;
+
+ loggerFor(this).debug(
+ `[${requestLogID}] response error (${retryMessage})`,
+ formatRequestDetails({
+ retryOfRequestLogID,
+ url: response.url,
+ status: response.status,
+ headers: response.headers,
+ message: errMessage,
+ durationMs: Date.now() - startTime,
+ }),
+ );
+
+ const err = this.makeStatusError(response.status, errJSON, errMessage, response.headers);
+ throw err;
+ }
+
+ loggerFor(this).info(responseInfo);
+ loggerFor(this).debug(
+ `[${requestLogID}] response start`,
+ formatRequestDetails({
+ retryOfRequestLogID,
+ url: response.url,
+ status: response.status,
+ headers: response.headers,
+ durationMs: headersTime - startTime,
+ }),
+ );
+
+ return {
+ response,
+ options,
+ controller,
+ requestLogID,
+ retryOfRequestLogID,
+ startTime,
+ };
+ }
+
+ async fetchWithTimeout(
+ url: RequestInfo,
+ init: RequestInit | undefined,
+ ms: number,
+ controller: AbortController,
+ ): Promise {
+ const { signal, method, ...options } = init || {};
+ if (signal) signal.addEventListener("abort", () => controller.abort());
+
+ const timeout = setTimeout(() => controller.abort(), ms);
+
+ const isReadableBody =
+ ((globalThis as any).ReadableStream &&
+ options.body instanceof (globalThis as any).ReadableStream) ||
+ (typeof options.body === "object" &&
+ options.body !== null &&
+ Symbol.asyncIterator in options.body);
+
+ const fetchOptions: RequestInit = {
+ signal: controller.signal as any,
+ ...(isReadableBody ? { duplex: "half" } : {}),
+ method: "GET",
+ ...options,
+ };
+ if (method) {
+ // Custom methods like 'patch' need to be uppercased
+ // See https://github.com/nodejs/undici/issues/2294
+ fetchOptions.method = method.toUpperCase();
+ }
+
+ try {
+ // use undefined this binding; fetch errors if bound to something else in browser/cloudflare
+ return await this.fetch.call(undefined, url, fetchOptions);
+ } finally {
+ clearTimeout(timeout);
+ }
+ }
+
+ private shouldRetry(response: Response): boolean {
+ // Note this is not a standard header.
+ const shouldRetryHeader = response.headers.get("x-should-retry");
+
+ // If the server explicitly says whether or not to retry, obey.
+ if (shouldRetryHeader === "true") return true;
+ if (shouldRetryHeader === "false") return false;
+
+ // Retry on request timeouts.
+ if (response.status === 408) return true;
+
+ // Retry on lock timeouts.
+ if (response.status === 409) return true;
+
+ // Retry on rate limits.
+ if (response.status === 429) return true;
+
+ // Retry internal errors.
+ if (response.status >= 500) return true;
+
+ return false;
+ }
+
+ private async retryRequest(
+ options: FinalRequestOptions,
+ retriesRemaining: number,
+ requestLogID: string,
+ responseHeaders?: Headers | undefined,
+ ): Promise {
+ let timeoutMillis: number | undefined;
+
+ // Note the `retry-after-ms` header may not be standard, but is a good idea and we'd like proactive support for it.
+ const retryAfterMillisHeader = responseHeaders?.get("retry-after-ms");
+ if (retryAfterMillisHeader) {
+ const timeoutMs = Number.parseFloat(retryAfterMillisHeader);
+ if (!Number.isNaN(timeoutMs)) {
+ timeoutMillis = timeoutMs;
+ }
+ }
+
+ // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After
+ const retryAfterHeader = responseHeaders?.get("retry-after");
+ if (retryAfterHeader && !timeoutMillis) {
+ const timeoutSeconds = Number.parseFloat(retryAfterHeader);
+ if (!Number.isNaN(timeoutSeconds)) {
+ timeoutMillis = timeoutSeconds * 1000;
+ } else {
+ timeoutMillis = Date.parse(retryAfterHeader) - Date.now();
+ }
+ }
+
+ // If the API asks us to wait a certain amount of time (and it's a reasonable amount),
+ // just do what it says, but otherwise calculate a default
+ if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) {
+ const maxRetries = options.maxRetries ?? this.maxRetries;
+ timeoutMillis = this.calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries);
+ }
+ await sleep(timeoutMillis);
+
+ return this.makeRequest(options, retriesRemaining - 1, requestLogID);
+ }
+
+ private calculateDefaultRetryTimeoutMillis(retriesRemaining: number, maxRetries: number): number {
+ const initialRetryDelay = 0.5;
+ const maxRetryDelay = 8.0;
+
+ const numRetries = maxRetries - retriesRemaining;
+
+ // Apply exponential backoff, but not more than the max.
+ const sleepSeconds = Math.min(initialRetryDelay * 2 ** numRetries, maxRetryDelay);
+
+ // Apply some jitter, take up to at most 25 percent of the retry time.
+ const jitter = 1 - Math.random() * 0.25;
+
+ return sleepSeconds * jitter * 1000;
+ }
+
+ buildRequest(
+ inputOptions: FinalRequestOptions,
+ { retryCount = 0 }: { retryCount?: number } = {},
+ ): { req: FinalizedRequestInit; url: string; timeout: number } {
+ const options = { ...inputOptions };
+ const { method, path, query } = options;
+
+ const url = this.buildURL(path!, query as Record);
+ if ("timeout" in options) validatePositiveInteger("timeout", options.timeout);
+ options.timeout = options.timeout ?? this.timeout;
+ const { bodyHeaders, body } = this.buildBody({ options });
+ const reqHeaders = this.buildHeaders({
+ options: inputOptions,
+ method,
+ bodyHeaders,
+ retryCount,
+ });
+
+ const req: FinalizedRequestInit = {
+ method,
+ headers: reqHeaders,
+ ...(options.signal && { signal: options.signal }),
+ ...((globalThis as any).ReadableStream &&
+ body instanceof (globalThis as any).ReadableStream && {
+ duplex: "half",
+ }),
+ ...(body && { body }),
+ ...((this.fetchOptions as any) ?? {}),
+ ...((options.fetchOptions as any) ?? {}),
+ };
+
+ return { req, url, timeout: options.timeout };
+ }
+
+ private buildHeaders({
+ options,
+ method,
+ bodyHeaders,
+ retryCount,
+ }: {
+ options: FinalRequestOptions;
+ method: HTTPMethod;
+ bodyHeaders: HeadersLike;
+ retryCount: number;
+ }): Headers {
+ const idempotencyHeaders: HeadersLike = {};
+ if (this.idempotencyHeader && method !== "get") {
+ if (!options.idempotencyKey) options.idempotencyKey = this.defaultIdempotencyKey();
+ idempotencyHeaders[this.idempotencyHeader] = options.idempotencyKey;
+ }
+
+ const headers = buildHeaders([
+ idempotencyHeaders,
+ {
+ Accept: "application/json",
+ "User-Agent": this.getUserAgent(),
+ "X-Stainless-Retry-Count": String(retryCount),
+ ...(options.timeout
+ ? {
+ "X-Stainless-Timeout": String(Math.trunc(options.timeout / 1000)),
+ }
+ : {}),
+ ...getPlatformHeaders(),
+ },
+ this.authHeaders(options),
+ this._options.defaultHeaders,
+ bodyHeaders,
+ options.headers,
+ ]);
+
+ this.validateHeaders(headers);
+
+ return headers.values;
+ }
+
+ private buildBody({
+ options: { body, headers: rawHeaders },
+ }: {
+ options: FinalRequestOptions;
+ }): {
+ bodyHeaders: HeadersLike;
+ body: BodyInit | undefined;
+ } {
+ if (!body) {
+ return { bodyHeaders: undefined, body: undefined };
+ }
+ const headers = buildHeaders([rawHeaders]);
+ if (
+ // Pass raw type verbatim
+ ArrayBuffer.isView(body) ||
+ body instanceof ArrayBuffer ||
+ body instanceof DataView ||
+ (typeof body === "string" &&
+ // Preserve legacy string encoding behavior for now
+ headers.values.has("content-type")) ||
+ // `Blob` is superset of `File`
+ body instanceof Blob ||
+ // `FormData` -> `multipart/form-data`
+ body instanceof FormData ||
+ // `URLSearchParams` -> `application/x-www-form-urlencoded`
+ body instanceof URLSearchParams ||
+ // Send chunked stream (each chunk has own `length`)
+ ((globalThis as any).ReadableStream && body instanceof (globalThis as any).ReadableStream)
+ ) {
+ return { bodyHeaders: undefined, body: body as BodyInit };
+ }
+ if (
+ typeof body === "object" &&
+ (Symbol.asyncIterator in body ||
+ (Symbol.iterator in body && "next" in body && typeof body.next === "function"))
+ ) {
+ return {
+ bodyHeaders: undefined,
+ body: Shims.ReadableStreamFrom(body as AsyncIterable),
+ };
+ }
+ return this.#encoder({ body, headers });
+ }
+
+ static GoogleCalendar = this;
+ static DEFAULT_TIMEOUT = 60000; // 1 minute
+
+ static GoogleCalendarError = Errors.GoogleCalendarError;
+ static APIError = Errors.APIError;
+ static APIConnectionError = Errors.APIConnectionError;
+ static APIConnectionTimeoutError = Errors.APIConnectionTimeoutError;
+ static APIUserAbortError = Errors.APIUserAbortError;
+ static NotFoundError = Errors.NotFoundError;
+ static ConflictError = Errors.ConflictError;
+ static RateLimitError = Errors.RateLimitError;
+ static BadRequestError = Errors.BadRequestError;
+ static AuthenticationError = Errors.AuthenticationError;
+ static InternalServerError = Errors.InternalServerError;
+ static PermissionDeniedError = Errors.PermissionDeniedError;
+ static UnprocessableEntityError = Errors.UnprocessableEntityError;
+
+ static toFile = Uploads.toFile;
+
+ calendars: API.Calendars = new API.Calendars(this);
+ stopWatching: API.StopWatching = new API.StopWatching(this);
+ listColors: API.ListColors = new API.ListColors(this);
+ checkFreeBusy: API.CheckFreeBusy = new API.CheckFreeBusy(this);
+ users: API.Users = new API.Users(this);
}
GoogleCalendar.Calendars = Calendars;
GoogleCalendar.StopWatching = StopWatching;
@@ -831,36 +741,25 @@ GoogleCalendar.ListColors = ListColors;
GoogleCalendar.CheckFreeBusy = CheckFreeBusy;
GoogleCalendar.Users = Users;
export declare namespace GoogleCalendar {
- export type RequestOptions = Opts.RequestOptions;
-
- export {
- Calendars as Calendars,
- type Calendar as Calendar,
- type CalendarCreateParams as CalendarCreateParams,
- type CalendarRetrieveParams as CalendarRetrieveParams,
- type CalendarUpdateParams as CalendarUpdateParams,
- type CalendarDeleteParams as CalendarDeleteParams,
- type CalendarClearParams as CalendarClearParams,
- };
-
- export {
- StopWatching as StopWatching,
- type StopWatchingStopWatchingParams as StopWatchingStopWatchingParams,
- };
-
- export {
- ListColors as ListColors,
- type ListColorListColorsResponse as ListColorListColorsResponse,
- type ListColorListColorsParams as ListColorListColorsParams,
- };
-
- export {
- CheckFreeBusy as CheckFreeBusy,
- type CheckFreeBusyCheckFreeBusyResponse as CheckFreeBusyCheckFreeBusyResponse,
- type CheckFreeBusyCheckFreeBusyParams as CheckFreeBusyCheckFreeBusyParams,
- };
-
- export { Users as Users };
-
- export type Channel = API.Channel;
+ export type RequestOptions = Opts.RequestOptions;
+
+ export {
+ Calendars,
+ Calendar,
+ CalendarCreateParams,
+ CalendarRetrieveParams,
+ CalendarUpdateParams,
+ CalendarDeleteParams,
+ CalendarClearParams,
+ };
+
+ export { StopWatching, StopWatchingStopWatchingParams };
+
+ export { ListColors, ListColorListColorsResponse, ListColorListColorsParams };
+
+ export { CheckFreeBusy, CheckFreeBusyCheckFreeBusyResponse, CheckFreeBusyCheckFreeBusyParams };
+
+ export { Users };
+
+ export type Channel = API.Channel;
}
diff --git a/packages/google-calendar/src/core/api-promise.ts b/packages/google-calendar/src/core/api-promise.ts
index 7a55157a..20d7477f 100644
--- a/packages/google-calendar/src/core/api-promise.ts
+++ b/packages/google-calendar/src/core/api-promise.ts
@@ -1,111 +1,92 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-import { type GoogleCalendar } from "../client";
+import type { GoogleCalendar } from "../client";
-import { type PromiseOrValue } from "../internal/types";
-import { APIResponseProps, defaultParseResponse } from "../internal/parse";
+import type { PromiseOrValue } from "../internal/types";
+import { type APIResponseProps, defaultParseResponse } from "../internal/parse";
/**
* A subclass of `Promise` providing additional helper methods
* for interacting with the SDK.
*/
export class APIPromise extends Promise {
- private parsedPromise: Promise | undefined;
- #client: GoogleCalendar;
+ private parsedPromise: Promise | undefined;
+ #client: GoogleCalendar;
- constructor(
- client: GoogleCalendar,
- private responsePromise: Promise,
- private parseResponse: (
- client: GoogleCalendar,
- props: APIResponseProps,
- ) => PromiseOrValue = defaultParseResponse,
- ) {
- super((resolve) => {
- // this is maybe a bit weird but this has to be a no-op to not implicitly
- // parse the response body; instead .then, .catch, .finally are overridden
- // to parse the response
- resolve(null as any);
- });
- this.#client = client;
- }
+ constructor(
+ client: GoogleCalendar,
+ private responsePromise: Promise,
+ private parseResponse: (
+ client: GoogleCalendar,
+ props: APIResponseProps,
+ ) => PromiseOrValue = defaultParseResponse,
+ ) {
+ super((resolve) => {
+ // this is maybe a bit weird but this has to be a no-op to not implicitly
+ // parse the response body; instead .then, .catch, .finally are overridden
+ // to parse the response
+ resolve(null as any);
+ });
+ this.#client = client;
+ }
- _thenUnwrap(
- transform: (data: T, props: APIResponseProps) => U,
- ): APIPromise {
- return new APIPromise(
- this.#client,
- this.responsePromise,
- async (client, props) =>
- transform(await this.parseResponse(client, props), props),
- );
- }
+ _thenUnwrap(transform: (data: T, props: APIResponseProps) => U): APIPromise {
+ return new APIPromise(this.#client, this.responsePromise, async (client, props) =>
+ transform(await this.parseResponse(client, props), props),
+ );
+ }
- /**
- * Gets the raw `Response` instance instead of parsing the response
- * data.
- *
- * If you want to parse the response body but still get the `Response`
- * instance, you can use {@link withResponse()}.
- *
- * 👋 Getting the wrong TypeScript type for `Response`?
- * Try setting `"moduleResolution": "NodeNext"` or add `"lib": ["DOM"]`
- * to your `tsconfig.json`.
- */
- asResponse(): Promise {
- return this.responsePromise.then((p) => p.response);
- }
+ /**
+ * Gets the raw `Response` instance instead of parsing the response
+ * data.
+ *
+ * If you want to parse the response body but still get the `Response`
+ * instance, you can use {@link withResponse()}.
+ *
+ * 👋 Getting the wrong TypeScript type for `Response`?
+ * Try setting `"moduleResolution": "NodeNext"` or add `"lib": ["DOM"]`
+ * to your `tsconfig.json`.
+ */
+ asResponse(): Promise {
+ return this.responsePromise.then((p) => p.response);
+ }
- /**
- * Gets the parsed response data and the raw `Response` instance.
- *
- * If you just want to get the raw `Response` instance without parsing it,
- * you can use {@link asResponse()}.
- *
- * 👋 Getting the wrong TypeScript type for `Response`?
- * Try setting `"moduleResolution": "NodeNext"` or add `"lib": ["DOM"]`
- * to your `tsconfig.json`.
- */
- async withResponse(): Promise<{ data: T; response: Response }> {
- const [data, response] = await Promise.all([
- this.parse(),
- this.asResponse(),
- ]);
- return { data, response };
- }
+ /**
+ * Gets the parsed response data and the raw `Response` instance.
+ *
+ * If you just want to get the raw `Response` instance without parsing it,
+ * you can use {@link asResponse()}.
+ *
+ * 👋 Getting the wrong TypeScript type for `Response`?
+ * Try setting `"moduleResolution": "NodeNext"` or add `"lib": ["DOM"]`
+ * to your `tsconfig.json`.
+ */
+ async withResponse(): Promise<{ data: T; response: Response }> {
+ const [data, response] = await Promise.all([this.parse(), this.asResponse()]);
+ return { data, response };
+ }
- private parse(): Promise {
- if (!this.parsedPromise) {
- this.parsedPromise = this.responsePromise.then((data) =>
- this.parseResponse(this.#client, data),
- );
- }
- return this.parsedPromise;
- }
+ private parse(): Promise {
+ if (!this.parsedPromise) {
+ this.parsedPromise = this.responsePromise.then((data) => this.parseResponse(this.#client, data));
+ }
+ return this.parsedPromise;
+ }
- override then(
- onfulfilled?:
- | ((value: T) => TResult1 | PromiseLike)
- | undefined
- | null,
- onrejected?:
- | ((reason: any) => TResult2 | PromiseLike)
- | undefined
- | null,
- ): Promise {
- return this.parse().then(onfulfilled, onrejected);
- }
+ override then(
+ onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null,
+ onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null,
+ ): Promise {
+ return this.parse().then(onfulfilled, onrejected);
+ }
- override catch(
- onrejected?:
- | ((reason: any) => TResult | PromiseLike)
- | undefined
- | null,
- ): Promise {
- return this.parse().catch(onrejected);
- }
+ override catch(
+ onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null,
+ ): Promise {
+ return this.parse().catch(onrejected);
+ }
- override finally(onfinally?: (() => void) | undefined | null): Promise {
- return this.parse().finally(onfinally);
- }
+ override finally(onfinally?: (() => void) | undefined | null): Promise {
+ return this.parse().finally(onfinally);
+ }
}
diff --git a/packages/google-calendar/src/core/error.ts b/packages/google-calendar/src/core/error.ts
index 2039ee58..a27b1251 100644
--- a/packages/google-calendar/src/core/error.ts
+++ b/packages/google-calendar/src/core/error.ts
@@ -5,138 +5,121 @@ import { castToError } from "../internal/errors";
export class GoogleCalendarError extends Error {}
export class APIError<
- TStatus extends number | undefined = number | undefined,
- THeaders extends Headers | undefined = Headers | undefined,
- TError extends Object | undefined = Object | undefined,
+ TStatus extends number | undefined = number | undefined,
+ THeaders extends Headers | undefined = Headers | undefined,
+ TError extends Object | undefined = Object | undefined,
> extends GoogleCalendarError {
- /** HTTP status for the response that caused the error */
- readonly status: TStatus;
- /** HTTP headers for the response that caused the error */
- readonly headers: THeaders;
- /** JSON body of the response that caused the error */
- readonly error: TError;
-
- constructor(
- status: TStatus,
- error: TError,
- message: string | undefined,
- headers: THeaders,
- ) {
- super(`${APIError.makeMessage(status, error, message)}`);
- this.status = status;
- this.headers = headers;
- this.error = error;
- }
-
- private static makeMessage(
- status: number | undefined,
- error: any,
- message: string | undefined,
- ) {
- const msg = error?.message
- ? typeof error.message === "string"
- ? error.message
- : JSON.stringify(error.message)
- : error
- ? JSON.stringify(error)
- : message;
-
- if (status && msg) {
- return `${status} ${msg}`;
- }
- if (status) {
- return `${status} status code (no body)`;
- }
- if (msg) {
- return msg;
- }
- return "(no status code or body)";
- }
-
- static generate(
- status: number | undefined,
- errorResponse: Object | undefined,
- message: string | undefined,
- headers: Headers | undefined,
- ): APIError {
- if (!status || !headers) {
- return new APIConnectionError({
- message,
- cause: castToError(errorResponse),
- });
- }
-
- const error = errorResponse as Record;
-
- if (status === 400) {
- return new BadRequestError(status, error, message, headers);
- }
-
- if (status === 401) {
- return new AuthenticationError(status, error, message, headers);
- }
-
- if (status === 403) {
- return new PermissionDeniedError(status, error, message, headers);
- }
-
- if (status === 404) {
- return new NotFoundError(status, error, message, headers);
- }
-
- if (status === 409) {
- return new ConflictError(status, error, message, headers);
- }
-
- if (status === 422) {
- return new UnprocessableEntityError(status, error, message, headers);
- }
-
- if (status === 429) {
- return new RateLimitError(status, error, message, headers);
- }
-
- if (status >= 500) {
- return new InternalServerError(status, error, message, headers);
- }
-
- return new APIError(status, error, message, headers);
- }
+ /** HTTP status for the response that caused the error */
+ readonly status: TStatus;
+ /** HTTP headers for the response that caused the error */
+ readonly headers: THeaders;
+ /** JSON body of the response that caused the error */
+ readonly error: TError;
+
+ constructor(status: TStatus, error: TError, message: string | undefined, headers: THeaders) {
+ super(`${APIError.makeMessage(status, error, message)}`);
+ this.status = status;
+ this.headers = headers;
+ this.error = error;
+ }
+
+ private static makeMessage(status: number | undefined, error: any, message: string | undefined) {
+ const msg = error?.message
+ ? typeof error.message === "string"
+ ? error.message
+ : JSON.stringify(error.message)
+ : error
+ ? JSON.stringify(error)
+ : message;
+
+ if (status && msg) {
+ return `${status} ${msg}`;
+ }
+ if (status) {
+ return `${status} status code (no body)`;
+ }
+ if (msg) {
+ return msg;
+ }
+ return "(no status code or body)";
+ }
+
+ static generate(
+ status: number | undefined,
+ errorResponse: Object | undefined,
+ message: string | undefined,
+ headers: Headers | undefined,
+ ): APIError {
+ if (!status || !headers) {
+ return new APIConnectionError({
+ message,
+ cause: castToError(errorResponse),
+ });
+ }
+
+ const error = errorResponse as Record;
+
+ if (status === 400) {
+ return new BadRequestError(status, error, message, headers);
+ }
+
+ if (status === 401) {
+ return new AuthenticationError(status, error, message, headers);
+ }
+
+ if (status === 403) {
+ return new PermissionDeniedError(status, error, message, headers);
+ }
+
+ if (status === 404) {
+ return new NotFoundError(status, error, message, headers);
+ }
+
+ if (status === 409) {
+ return new ConflictError(status, error, message, headers);
+ }
+
+ if (status === 422) {
+ return new UnprocessableEntityError(status, error, message, headers);
+ }
+
+ if (status === 429) {
+ return new RateLimitError(status, error, message, headers);
+ }
+
+ if (status >= 500) {
+ return new InternalServerError(status, error, message, headers);
+ }
+
+ return new APIError(status, error, message, headers);
+ }
}
-export class APIUserAbortError extends APIError<
- undefined,
- undefined,
- undefined
-> {
- constructor({ message }: { message?: string } = {}) {
- super(undefined, undefined, message || "Request was aborted.", undefined);
- }
+export class APIUserAbortError extends APIError {
+ constructor({ message }: { message?: string } = {}) {
+ super(undefined, undefined, message || "Request was aborted.", undefined);
+ }
}
-export class APIConnectionError extends APIError<
- undefined,
- undefined,
- undefined
-> {
- constructor({
- message,
- cause,
- }: {
- message?: string | undefined;
- cause?: Error | undefined;
- }) {
- super(undefined, undefined, message || "Connection error.", undefined);
- // in some environments the 'cause' property is already declared
- // @ts-ignore
- if (cause) this.cause = cause;
- }
+export class APIConnectionError extends APIError {
+ constructor({
+ message,
+ cause,
+ }: {
+ message?: string | undefined;
+ cause?: Error | undefined;
+ }) {
+ super(undefined, undefined, message || "Connection error.", undefined);
+ // in some environments the 'cause' property is already declared
+ // @ts-ignore
+ if (cause) this.cause = cause;
+ }
}
export class APIConnectionTimeoutError extends APIConnectionError {
- constructor({ message }: { message?: string } = {}) {
- super({ message: message ?? "Request timed out." });
- }
+ constructor({ message }: { message?: string } = {}) {
+ super({ message: message ?? "Request timed out." });
+ }
}
export class BadRequestError extends APIError<400, Headers> {}
diff --git a/packages/google-calendar/src/core/resource.ts b/packages/google-calendar/src/core/resource.ts
index 7f3026ba..8da21dbc 100644
--- a/packages/google-calendar/src/core/resource.ts
+++ b/packages/google-calendar/src/core/resource.ts
@@ -3,9 +3,9 @@
import type { GoogleCalendar } from "../client";
export class APIResource {
- protected _client: GoogleCalendar;
+ protected _client: GoogleCalendar;
- constructor(client: GoogleCalendar) {
- this._client = client;
- }
+ constructor(client: GoogleCalendar) {
+ this._client = client;
+ }
}
diff --git a/packages/google-calendar/src/core/uploads.ts b/packages/google-calendar/src/core/uploads.ts
index 4b4c2ff4..bd66d086 100644
--- a/packages/google-calendar/src/core/uploads.ts
+++ b/packages/google-calendar/src/core/uploads.ts
@@ -1,2 +1,2 @@
-export { type Uploadable } from "../internal/uploads";
+export type { Uploadable } from "../internal/uploads";
export { toFile, type ToFileInput } from "../internal/to-file";
diff --git a/packages/google-calendar/src/index.ts b/packages/google-calendar/src/index.ts
index a3d5e5f2..3b0cf693 100644
--- a/packages/google-calendar/src/index.ts
+++ b/packages/google-calendar/src/index.ts
@@ -6,17 +6,17 @@ export { type Uploadable, toFile } from "./core/uploads";
export { APIPromise } from "./core/api-promise";
export { GoogleCalendar, type ClientOptions } from "./client";
export {
- GoogleCalendarError,
- APIError,
- APIConnectionError,
- APIConnectionTimeoutError,
- APIUserAbortError,
- NotFoundError,
- ConflictError,
- RateLimitError,
- BadRequestError,
- AuthenticationError,
- InternalServerError,
- PermissionDeniedError,
- UnprocessableEntityError,
+ GoogleCalendarError,
+ APIError,
+ APIConnectionError,
+ APIConnectionTimeoutError,
+ APIUserAbortError,
+ NotFoundError,
+ ConflictError,
+ RateLimitError,
+ BadRequestError,
+ AuthenticationError,
+ InternalServerError,
+ PermissionDeniedError,
+ UnprocessableEntityError,
} from "./core/error";
diff --git a/packages/google-calendar/src/internal/builtin-types.ts b/packages/google-calendar/src/internal/builtin-types.ts
index e6f0c635..63fcc1c3 100644
--- a/packages/google-calendar/src/internal/builtin-types.ts
+++ b/packages/google-calendar/src/internal/builtin-types.ts
@@ -1,9 +1,6 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-export type Fetch = (
- input: string | URL | Request,
- init?: RequestInit,
-) => Promise;
+export type Fetch = (input: string | URL | Request, init?: RequestInit) => Promise;
/**
* An alias to the builtin `RequestInit` type so we can
@@ -55,13 +52,13 @@ type _Array = Array;
type _Record = Record;
export type {
- _Array as Array,
- _BodyInit as BodyInit,
- _HeadersInit as HeadersInit,
- _Record as Record,
- _RequestInfo as RequestInfo,
- _RequestInit as RequestInit,
- _Response as Response,
+ _Array as Array,
+ _BodyInit as BodyInit,
+ _HeadersInit as HeadersInit,
+ _Record as Record,
+ _RequestInfo as RequestInfo,
+ _RequestInit as RequestInit,
+ _Response as Response,
};
/**
@@ -80,8 +77,8 @@ type EndingType = "native" | "transparent";
* https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob#options
*/
export interface BlobPropertyBag {
- endings?: EndingType;
- type?: string;
+ endings?: EndingType;
+ type?: string;
}
/**
@@ -92,5 +89,5 @@ export interface BlobPropertyBag {
* https://developer.mozilla.org/en-US/docs/Web/API/File/File#options
*/
export interface FilePropertyBag extends BlobPropertyBag {
- lastModified?: number;
+ lastModified?: number;
}
diff --git a/packages/google-calendar/src/internal/detect-platform.ts b/packages/google-calendar/src/internal/detect-platform.ts
index 04124589..d464c6e6 100644
--- a/packages/google-calendar/src/internal/detect-platform.ts
+++ b/packages/google-calendar/src/internal/detect-platform.ts
@@ -3,14 +3,14 @@
import { VERSION } from "../version";
export const isRunningInBrowser = () => {
- return (
- // @ts-ignore
- typeof window !== "undefined" &&
- // @ts-ignore
- typeof window.document !== "undefined" &&
- // @ts-ignore
- typeof navigator !== "undefined"
- );
+ return (
+ // @ts-ignore
+ typeof window !== "undefined" &&
+ // @ts-ignore
+ typeof window.document !== "undefined" &&
+ // @ts-ignore
+ typeof navigator !== "undefined"
+ );
};
type DetectedPlatform = "deno" | "node" | "edge" | "unknown";
@@ -19,200 +19,190 @@ type DetectedPlatform = "deno" | "node" | "edge" | "unknown";
* Note this does not detect 'browser'; for that, use getBrowserInfo().
*/
function getDetectedPlatform(): DetectedPlatform {
- if (typeof Deno !== "undefined" && Deno.build != null) {
- return "deno";
- }
- if (typeof EdgeRuntime !== "undefined") {
- return "edge";
- }
- if (
- Object.prototype.toString.call(
- typeof (globalThis as any).process !== "undefined"
- ? (globalThis as any).process
- : 0,
- ) === "[object process]"
- ) {
- return "node";
- }
- return "unknown";
+ if (typeof Deno !== "undefined" && Deno.build != null) {
+ return "deno";
+ }
+ if (typeof EdgeRuntime !== "undefined") {
+ return "edge";
+ }
+ if (
+ Object.prototype.toString.call(
+ typeof (globalThis as any).process !== "undefined" ? (globalThis as any).process : 0,
+ ) === "[object process]"
+ ) {
+ return "node";
+ }
+ return "unknown";
}
declare const Deno: any;
declare const EdgeRuntime: any;
type Arch = "x32" | "x64" | "arm" | "arm64" | `other:${string}` | "unknown";
type PlatformName =
- | "MacOS"
- | "Linux"
- | "Windows"
- | "FreeBSD"
- | "OpenBSD"
- | "iOS"
- | "Android"
- | `Other:${string}`
- | "Unknown";
+ | "MacOS"
+ | "Linux"
+ | "Windows"
+ | "FreeBSD"
+ | "OpenBSD"
+ | "iOS"
+ | "Android"
+ | `Other:${string}`
+ | "Unknown";
type Browser = "ie" | "edge" | "chrome" | "firefox" | "safari";
type PlatformProperties = {
- "X-Stainless-Lang": "js";
- "X-Stainless-Package-Version": string;
- "X-Stainless-OS": PlatformName;
- "X-Stainless-Arch": Arch;
- "X-Stainless-Runtime":
- | "node"
- | "deno"
- | "edge"
- | `browser:${Browser}`
- | "unknown";
- "X-Stainless-Runtime-Version": string;
+ "X-Stainless-Lang": "js";
+ "X-Stainless-Package-Version": string;
+ "X-Stainless-OS": PlatformName;
+ "X-Stainless-Arch": Arch;
+ "X-Stainless-Runtime": "node" | "deno" | "edge" | `browser:${Browser}` | "unknown";
+ "X-Stainless-Runtime-Version": string;
};
const getPlatformProperties = (): PlatformProperties => {
- const detectedPlatform = getDetectedPlatform();
- if (detectedPlatform === "deno") {
- return {
- "X-Stainless-Lang": "js",
- "X-Stainless-Package-Version": VERSION,
- "X-Stainless-OS": normalizePlatform(Deno.build.os),
- "X-Stainless-Arch": normalizeArch(Deno.build.arch),
- "X-Stainless-Runtime": "deno",
- "X-Stainless-Runtime-Version":
- typeof Deno.version === "string"
- ? Deno.version
- : (Deno.version?.deno ?? "unknown"),
- };
- }
- if (typeof EdgeRuntime !== "undefined") {
- return {
- "X-Stainless-Lang": "js",
- "X-Stainless-Package-Version": VERSION,
- "X-Stainless-OS": "Unknown",
- "X-Stainless-Arch": `other:${EdgeRuntime}`,
- "X-Stainless-Runtime": "edge",
- "X-Stainless-Runtime-Version": (globalThis as any).process.version,
- };
- }
- // Check if Node.js
- if (detectedPlatform === "node") {
- return {
- "X-Stainless-Lang": "js",
- "X-Stainless-Package-Version": VERSION,
- "X-Stainless-OS": normalizePlatform((globalThis as any).process.platform),
- "X-Stainless-Arch": normalizeArch((globalThis as any).process.arch),
- "X-Stainless-Runtime": "node",
- "X-Stainless-Runtime-Version": (globalThis as any).process.version,
- };
- }
-
- const browserInfo = getBrowserInfo();
- if (browserInfo) {
- return {
- "X-Stainless-Lang": "js",
- "X-Stainless-Package-Version": VERSION,
- "X-Stainless-OS": "Unknown",
- "X-Stainless-Arch": "unknown",
- "X-Stainless-Runtime": `browser:${browserInfo.browser}`,
- "X-Stainless-Runtime-Version": browserInfo.version,
- };
- }
-
- // TODO add support for Cloudflare workers, etc.
- return {
- "X-Stainless-Lang": "js",
- "X-Stainless-Package-Version": VERSION,
- "X-Stainless-OS": "Unknown",
- "X-Stainless-Arch": "unknown",
- "X-Stainless-Runtime": "unknown",
- "X-Stainless-Runtime-Version": "unknown",
- };
+ const detectedPlatform = getDetectedPlatform();
+ if (detectedPlatform === "deno") {
+ return {
+ "X-Stainless-Lang": "js",
+ "X-Stainless-Package-Version": VERSION,
+ "X-Stainless-OS": normalizePlatform(Deno.build.os),
+ "X-Stainless-Arch": normalizeArch(Deno.build.arch),
+ "X-Stainless-Runtime": "deno",
+ "X-Stainless-Runtime-Version":
+ typeof Deno.version === "string" ? Deno.version : (Deno.version?.deno ?? "unknown"),
+ };
+ }
+ if (typeof EdgeRuntime !== "undefined") {
+ return {
+ "X-Stainless-Lang": "js",
+ "X-Stainless-Package-Version": VERSION,
+ "X-Stainless-OS": "Unknown",
+ "X-Stainless-Arch": `other:${EdgeRuntime}`,
+ "X-Stainless-Runtime": "edge",
+ "X-Stainless-Runtime-Version": (globalThis as any).process.version,
+ };
+ }
+ // Check if Node.js
+ if (detectedPlatform === "node") {
+ return {
+ "X-Stainless-Lang": "js",
+ "X-Stainless-Package-Version": VERSION,
+ "X-Stainless-OS": normalizePlatform((globalThis as any).process.platform),
+ "X-Stainless-Arch": normalizeArch((globalThis as any).process.arch),
+ "X-Stainless-Runtime": "node",
+ "X-Stainless-Runtime-Version": (globalThis as any).process.version,
+ };
+ }
+
+ const browserInfo = getBrowserInfo();
+ if (browserInfo) {
+ return {
+ "X-Stainless-Lang": "js",
+ "X-Stainless-Package-Version": VERSION,
+ "X-Stainless-OS": "Unknown",
+ "X-Stainless-Arch": "unknown",
+ "X-Stainless-Runtime": `browser:${browserInfo.browser}`,
+ "X-Stainless-Runtime-Version": browserInfo.version,
+ };
+ }
+
+ // TODO add support for Cloudflare workers, etc.
+ return {
+ "X-Stainless-Lang": "js",
+ "X-Stainless-Package-Version": VERSION,
+ "X-Stainless-OS": "Unknown",
+ "X-Stainless-Arch": "unknown",
+ "X-Stainless-Runtime": "unknown",
+ "X-Stainless-Runtime-Version": "unknown",
+ };
};
type BrowserInfo = {
- browser: Browser;
- version: string;
+ browser: Browser;
+ version: string;
};
declare const navigator: { userAgent: string } | undefined;
// Note: modified from https://github.com/JS-DevTools/host-environment/blob/b1ab79ecde37db5d6e163c050e54fe7d287d7c92/src/isomorphic.browser.ts
function getBrowserInfo(): BrowserInfo | null {
- if (typeof navigator === "undefined" || !navigator) {
- return null;
- }
-
- // NOTE: The order matters here!
- const browserPatterns = [
- { key: "edge" as const, pattern: /Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
- { key: "ie" as const, pattern: /MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
- {
- key: "ie" as const,
- pattern: /Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/,
- },
- {
- key: "chrome" as const,
- pattern: /Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/,
- },
- {
- key: "firefox" as const,
- pattern: /Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/,
- },
- {
- key: "safari" as const,
- pattern:
- /(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/,
- },
- ];
-
- // Find the FIRST matching browser
- for (const { key, pattern } of browserPatterns) {
- const match = pattern.exec(navigator.userAgent);
- if (match) {
- const major = match[1] || 0;
- const minor = match[2] || 0;
- const patch = match[3] || 0;
-
- return { browser: key, version: `${major}.${minor}.${patch}` };
- }
- }
-
- return null;
+ if (typeof navigator === "undefined" || !navigator) {
+ return null;
+ }
+
+ // NOTE: The order matters here!
+ const browserPatterns = [
+ { key: "edge" as const, pattern: /Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
+ { key: "ie" as const, pattern: /MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
+ {
+ key: "ie" as const,
+ pattern: /Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/,
+ },
+ {
+ key: "chrome" as const,
+ pattern: /Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/,
+ },
+ {
+ key: "firefox" as const,
+ pattern: /Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/,
+ },
+ {
+ key: "safari" as const,
+ pattern: /(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/,
+ },
+ ];
+
+ // Find the FIRST matching browser
+ for (const { key, pattern } of browserPatterns) {
+ const match = pattern.exec(navigator.userAgent);
+ if (match) {
+ const major = match[1] || 0;
+ const minor = match[2] || 0;
+ const patch = match[3] || 0;
+
+ return { browser: key, version: `${major}.${minor}.${patch}` };
+ }
+ }
+
+ return null;
}
const normalizeArch = (arch: string): Arch => {
- // Node docs:
- // - https://nodejs.org/api/process.html#processarch
- // Deno docs:
- // - https://doc.deno.land/deno/stable/~/Deno.build
- if (arch === "x32") return "x32";
- if (arch === "x86_64" || arch === "x64") return "x64";
- if (arch === "arm") return "arm";
- if (arch === "aarch64" || arch === "arm64") return "arm64";
- if (arch) return `other:${arch}`;
- return "unknown";
+ // Node docs:
+ // - https://nodejs.org/api/process.html#processarch
+ // Deno docs:
+ // - https://doc.deno.land/deno/stable/~/Deno.build
+ if (arch === "x32") return "x32";
+ if (arch === "x86_64" || arch === "x64") return "x64";
+ if (arch === "arm") return "arm";
+ if (arch === "aarch64" || arch === "arm64") return "arm64";
+ if (arch) return `other:${arch}`;
+ return "unknown";
};
const normalizePlatform = (platform: string): PlatformName => {
- // Node platforms:
- // - https://nodejs.org/api/process.html#processplatform
- // Deno platforms:
- // - https://doc.deno.land/deno/stable/~/Deno.build
- // - https://github.com/denoland/deno/issues/14799
-
- platform = platform.toLowerCase();
-
- // NOTE: this iOS check is untested and may not work
- // Node does not work natively on IOS, there is a fork at
- // https://github.com/nodejs-mobile/nodejs-mobile
- // however it is unknown at the time of writing how to detect if it is running
- if (platform.includes("ios")) return "iOS";
- if (platform === "android") return "Android";
- if (platform === "darwin") return "MacOS";
- if (platform === "win32") return "Windows";
- if (platform === "freebsd") return "FreeBSD";
- if (platform === "openbsd") return "OpenBSD";
- if (platform === "linux") return "Linux";
- if (platform) return `Other:${platform}`;
- return "Unknown";
+ // Node platforms:
+ // - https://nodejs.org/api/process.html#processplatform
+ // Deno platforms:
+ // - https://doc.deno.land/deno/stable/~/Deno.build
+ // - https://github.com/denoland/deno/issues/14799
+
+ platform = platform.toLowerCase();
+
+ // NOTE: this iOS check is untested and may not work
+ // Node does not work natively on IOS, there is a fork at
+ // https://github.com/nodejs-mobile/nodejs-mobile
+ // however it is unknown at the time of writing how to detect if it is running
+ if (platform.includes("ios")) return "iOS";
+ if (platform === "android") return "Android";
+ if (platform === "darwin") return "MacOS";
+ if (platform === "win32") return "Windows";
+ if (platform === "freebsd") return "FreeBSD";
+ if (platform === "openbsd") return "OpenBSD";
+ if (platform === "linux") return "Linux";
+ if (platform) return `Other:${platform}`;
+ return "Unknown";
};
let _platformHeaders: PlatformProperties;
export const getPlatformHeaders = () => {
- return (_platformHeaders ??= getPlatformProperties());
+ return (_platformHeaders ??= getPlatformProperties());
};
diff --git a/packages/google-calendar/src/internal/errors.ts b/packages/google-calendar/src/internal/errors.ts
index 0b4e8b7c..ff378fee 100644
--- a/packages/google-calendar/src/internal/errors.ts
+++ b/packages/google-calendar/src/internal/errors.ts
@@ -1,37 +1,33 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
export function isAbortError(err: unknown) {
- return (
- typeof err === "object" &&
- err !== null &&
- // Spec-compliant fetch implementations
- (("name" in err && (err as any).name === "AbortError") ||
- // Expo fetch
- ("message" in err &&
- String((err as any).message).includes("FetchRequestCanceledException")))
- );
+ return (
+ typeof err === "object" &&
+ err !== null &&
+ // Spec-compliant fetch implementations
+ (("name" in err && (err as any).name === "AbortError") ||
+ // Expo fetch
+ ("message" in err && String((err as any).message).includes("FetchRequestCanceledException")))
+ );
}
-export const castToError = (err: any): Error => {
- if (err instanceof Error) return err;
- if (typeof err === "object" && err !== null) {
- try {
- if (Object.prototype.toString.call(err) === "[object Error]") {
- // @ts-ignore - not all envs have native support for cause yet
- const error = new Error(
- err.message,
- err.cause ? { cause: err.cause } : {},
- );
- if (err.stack) error.stack = err.stack;
- // @ts-ignore - not all envs have native support for cause yet
- if (err.cause && !error.cause) error.cause = err.cause;
- if (err.name) error.name = err.name;
- return error;
- }
- } catch {}
- try {
- return new Error(JSON.stringify(err));
- } catch {}
- }
- return new Error(err);
+export const castToError = (err: unknown): Error => {
+ if (err instanceof Error) return err;
+ if (typeof err === "object" && err !== null) {
+ try {
+ if (Object.prototype.toString.call(err) === "[object Error]") {
+ // @ts-ignore - not all envs have native support for cause yet
+ const error = new Error(err.message, err.cause ? { cause: err.cause } : {});
+ if (err.stack) error.stack = err.stack;
+ // @ts-ignore - not all envs have native support for cause yet
+ if (err.cause && !error.cause) error.cause = err.cause;
+ if (err.name) error.name = err.name;
+ return error;
+ }
+ } catch {}
+ try {
+ return new Error(JSON.stringify(err));
+ } catch {}
+ }
+ return new Error(err);
};
diff --git a/packages/google-calendar/src/internal/headers.ts b/packages/google-calendar/src/internal/headers.ts
index e1af884b..97c43e9e 100644
--- a/packages/google-calendar/src/internal/headers.ts
+++ b/packages/google-calendar/src/internal/headers.ts
@@ -2,12 +2,12 @@
type HeaderValue = string | undefined | null;
export type HeadersLike =
- | Headers
- | readonly HeaderValue[][]
- | Record
- | undefined
- | null
- | NullableHeaders;
+ | Headers
+ | readonly HeaderValue[][]
+ | Record
+ | undefined
+ | null
+ | NullableHeaders;
const brand_privateNullableHeaders = Symbol("brand.privateNullableHeaders");
@@ -17,88 +17,85 @@ const brand_privateNullableHeaders = Symbol("brand.privateNullableHeaders");
* into a standard headers type we need to preserve that information.
*/
export type NullableHeaders = {
- /** Brand check, prevent users from creating a NullableHeaders. */
- [brand_privateNullableHeaders]: true;
- /** Parsed headers. */
- values: Headers;
- /** Set of lowercase header names explicitly set to null. */
- nulls: Set;
+ /** Brand check, prevent users from creating a NullableHeaders. */
+ [brand_privateNullableHeaders]: true;
+ /** Parsed headers. */
+ values: Headers;
+ /** Set of lowercase header names explicitly set to null. */
+ nulls: Set;
};
const isArray = Array.isArray as (val: unknown) => val is readonly unknown[];
-function* iterateHeaders(
- headers: HeadersLike,
-): IterableIterator {
- if (!headers) return;
+function* iterateHeaders(headers: HeadersLike): IterableIterator {
+ if (!headers) return;
- if (brand_privateNullableHeaders in headers) {
- const { values, nulls } = headers;
- yield* values.entries();
- for (const name of nulls) {
- yield [name, null];
- }
- return;
- }
+ if (brand_privateNullableHeaders in headers) {
+ const { values, nulls } = headers;
+ yield* values.entries();
+ for (const name of nulls) {
+ yield [name, null];
+ }
+ return;
+ }
- let shouldClear = false;
- let iter: Iterable;
- if (headers instanceof Headers) {
- iter = headers.entries();
- } else if (isArray(headers)) {
- iter = headers;
- } else {
- shouldClear = true;
- iter = Object.entries(headers ?? {});
- }
- for (let row of iter) {
- const name = row[0];
- if (typeof name !== "string")
- throw new TypeError("expected header name to be a string");
- const values = isArray(row[1]) ? row[1] : [row[1]];
- let didClear = false;
- for (const value of values) {
- if (value === undefined) continue;
+ let shouldClear = false;
+ let iter: Iterable;
+ if (headers instanceof Headers) {
+ iter = headers.entries();
+ } else if (isArray(headers)) {
+ iter = headers;
+ } else {
+ shouldClear = true;
+ iter = Object.entries(headers ?? {});
+ }
+ for (const row of iter) {
+ const name = row[0];
+ if (typeof name !== "string") throw new TypeError("expected header name to be a string");
+ const values = isArray(row[1]) ? row[1] : [row[1]];
+ let didClear = false;
+ for (const value of values) {
+ if (value === undefined) continue;
- // Objects keys always overwrite older headers, they never append.
- // Yield a null to clear the header before adding the new values.
- if (shouldClear && !didClear) {
- didClear = true;
- yield [name, null];
- }
- yield [name, value];
- }
- }
+ // Objects keys always overwrite older headers, they never append.
+ // Yield a null to clear the header before adding the new values.
+ if (shouldClear && !didClear) {
+ didClear = true;
+ yield [name, null];
+ }
+ yield [name, value];
+ }
+ }
}
export const buildHeaders = (newHeaders: HeadersLike[]): NullableHeaders => {
- const targetHeaders = new Headers();
- const nullHeaders = new Set();
- for (const headers of newHeaders) {
- const seenHeaders = new Set();
- for (const [name, value] of iterateHeaders(headers)) {
- const lowerName = name.toLowerCase();
- if (!seenHeaders.has(lowerName)) {
- targetHeaders.delete(name);
- seenHeaders.add(lowerName);
- }
- if (value === null) {
- targetHeaders.delete(name);
- nullHeaders.add(lowerName);
- } else {
- targetHeaders.append(name, value);
- nullHeaders.delete(lowerName);
- }
- }
- }
- return {
- [brand_privateNullableHeaders]: true,
- values: targetHeaders,
- nulls: nullHeaders,
- };
+ const targetHeaders = new Headers();
+ const nullHeaders = new Set();
+ for (const headers of newHeaders) {
+ const seenHeaders = new Set();
+ for (const [name, value] of iterateHeaders(headers)) {
+ const lowerName = name.toLowerCase();
+ if (!seenHeaders.has(lowerName)) {
+ targetHeaders.delete(name);
+ seenHeaders.add(lowerName);
+ }
+ if (value === null) {
+ targetHeaders.delete(name);
+ nullHeaders.add(lowerName);
+ } else {
+ targetHeaders.append(name, value);
+ nullHeaders.delete(lowerName);
+ }
+ }
+ }
+ return {
+ [brand_privateNullableHeaders]: true,
+ values: targetHeaders,
+ nulls: nullHeaders,
+ };
};
export const isEmptyHeaders = (headers: HeadersLike) => {
- for (const _ of iterateHeaders(headers)) return false;
- return true;
+ for (const _ of iterateHeaders(headers)) return false;
+ return true;
};
diff --git a/packages/google-calendar/src/internal/parse.ts b/packages/google-calendar/src/internal/parse.ts
index 8443ddbb..b2917851 100644
--- a/packages/google-calendar/src/internal/parse.ts
+++ b/packages/google-calendar/src/internal/parse.ts
@@ -1,54 +1,53 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
import type { FinalRequestOptions } from "./request-options";
-import { type GoogleCalendar } from "../client";
+import type { GoogleCalendar } from "../client";
import { formatRequestDetails, loggerFor } from "./utils/log";
export type APIResponseProps = {
- response: Response;
- options: FinalRequestOptions;
- controller: AbortController;
- requestLogID: string;
- retryOfRequestLogID: string | undefined;
- startTime: number;
+ response: Response;
+ options: FinalRequestOptions;
+ controller: AbortController;
+ requestLogID: string;
+ retryOfRequestLogID: string | undefined;
+ startTime: number;
};
export async function defaultParseResponse(
- client: GoogleCalendar,
- props: APIResponseProps,
+ client: GoogleCalendar,
+ props: APIResponseProps,
): Promise {
- const { response, requestLogID, retryOfRequestLogID, startTime } = props;
- const body = await (async () => {
- // fetch refuses to read the body when the status code is 204.
- if (response.status === 204) {
- return null as T;
- }
+ const { response, requestLogID, retryOfRequestLogID, startTime } = props;
+ const body = await (async () => {
+ // fetch refuses to read the body when the status code is 204.
+ if (response.status === 204) {
+ return null as T;
+ }
- if (props.options.__binaryResponse) {
- return response as unknown as T;
- }
+ if (props.options.__binaryResponse) {
+ return response as unknown as T;
+ }
- const contentType = response.headers.get("content-type");
- const mediaType = contentType?.split(";")[0]?.trim();
- const isJSON =
- mediaType?.includes("application/json") || mediaType?.endsWith("+json");
- if (isJSON) {
- const json = await response.json();
- return json as T;
- }
+ const contentType = response.headers.get("content-type");
+ const mediaType = contentType?.split(";")[0]?.trim();
+ const isJSON = mediaType?.includes("application/json") || mediaType?.endsWith("+json");
+ if (isJSON) {
+ const json = await response.json();
+ return json as T;
+ }
- const text = await response.text();
- return text as unknown as T;
- })();
- loggerFor(client).debug(
- `[${requestLogID}] response parsed`,
- formatRequestDetails({
- retryOfRequestLogID,
- url: response.url,
- status: response.status,
- body,
- durationMs: Date.now() - startTime,
- }),
- );
- return body;
+ const text = await response.text();
+ return text as unknown as T;
+ })();
+ loggerFor(client).debug(
+ `[${requestLogID}] response parsed`,
+ formatRequestDetails({
+ retryOfRequestLogID,
+ url: response.url,
+ status: response.status,
+ body,
+ durationMs: Date.now() - startTime,
+ }),
+ );
+ return body;
}
diff --git a/packages/google-calendar/src/internal/qs/formats.ts b/packages/google-calendar/src/internal/qs/formats.ts
index 80473f89..8bcde216 100644
--- a/packages/google-calendar/src/internal/qs/formats.ts
+++ b/packages/google-calendar/src/internal/qs/formats.ts
@@ -2,8 +2,8 @@ import type { Format } from "./types";
export const default_format: Format = "RFC3986";
export const formatters: Record string> = {
- RFC1738: (v: PropertyKey) => String(v).replace(/%20/g, "+"),
- RFC3986: (v: PropertyKey) => String(v),
+ RFC1738: (v: PropertyKey) => String(v).replace(/%20/g, "+"),
+ RFC3986: (v: PropertyKey) => String(v),
};
export const RFC1738 = "RFC1738";
export const RFC3986 = "RFC3986";
diff --git a/packages/google-calendar/src/internal/qs/index.ts b/packages/google-calendar/src/internal/qs/index.ts
index 4fcd5ddf..482b3c68 100644
--- a/packages/google-calendar/src/internal/qs/index.ts
+++ b/packages/google-calendar/src/internal/qs/index.ts
@@ -1,19 +1,19 @@
import { default_format, formatters, RFC1738, RFC3986 } from "./formats";
const formats = {
- formatters,
- RFC1738,
- RFC3986,
- default: default_format,
+ formatters,
+ RFC1738,
+ RFC3986,
+ default: default_format,
};
export { stringify } from "./stringify";
export { formats };
export type {
- DefaultDecoder,
- DefaultEncoder,
- Format,
- ParseOptions,
- StringifyOptions,
+ DefaultDecoder,
+ DefaultEncoder,
+ Format,
+ ParseOptions,
+ StringifyOptions,
} from "./types";
diff --git a/packages/google-calendar/src/internal/qs/stringify.ts b/packages/google-calendar/src/internal/qs/stringify.ts
index 788b8547..280bf309 100644
--- a/packages/google-calendar/src/internal/qs/stringify.ts
+++ b/packages/google-calendar/src/internal/qs/stringify.ts
@@ -5,445 +5,393 @@ import type { NonNullableProperties, StringifyOptions } from "./types";
const has = Object.prototype.hasOwnProperty;
const array_prefix_generators = {
- brackets(prefix: PropertyKey) {
- return String(prefix) + "[]";
- },
- comma: "comma",
- indices(prefix: PropertyKey, key: string) {
- return String(prefix) + "[" + key + "]";
- },
- repeat(prefix: PropertyKey) {
- return String(prefix);
- },
+ brackets(prefix: PropertyKey) {
+ return `${String(prefix)}[]`;
+ },
+ comma: "comma",
+ indices(prefix: PropertyKey, key: string) {
+ return `${String(prefix)}[${key}]`;
+ },
+ repeat(prefix: PropertyKey) {
+ return String(prefix);
+ },
};
const is_array = Array.isArray;
const push = Array.prototype.push;
-const push_to_array = function (arr: any[], value_or_array: any) {
- push.apply(arr, is_array(value_or_array) ? value_or_array : [value_or_array]);
+const push_to_array = (arr: any[], value_or_array: any) => {
+ push.apply(arr, is_array(value_or_array) ? value_or_array : [value_or_array]);
};
const to_ISO = Date.prototype.toISOString;
const defaults = {
- addQueryPrefix: false,
- allowDots: false,
- allowEmptyArrays: false,
- arrayFormat: "indices",
- charset: "utf-8",
- charsetSentinel: false,
- delimiter: "&",
- encode: true,
- encodeDotInKeys: false,
- encoder: encode,
- encodeValuesOnly: false,
- format: default_format,
- formatter: formatters[default_format],
- /** @deprecated */
- indices: false,
- serializeDate(date) {
- return to_ISO.call(date);
- },
- skipNulls: false,
- strictNullHandling: false,
-} as NonNullableProperties<
- StringifyOptions & { formatter: (typeof formatters)["RFC1738"] }
->;
-
-function is_non_nullish_primitive(
- v: unknown,
-): v is string | number | boolean | symbol | bigint {
- return (
- typeof v === "string" ||
- typeof v === "number" ||
- typeof v === "boolean" ||
- typeof v === "symbol" ||
- typeof v === "bigint"
- );
+ addQueryPrefix: false,
+ allowDots: false,
+ allowEmptyArrays: false,
+ arrayFormat: "indices",
+ charset: "utf-8",
+ charsetSentinel: false,
+ delimiter: "&",
+ encode: true,
+ encodeDotInKeys: false,
+ encoder: encode,
+ encodeValuesOnly: false,
+ format: default_format,
+ formatter: formatters[default_format],
+ /** @deprecated */
+ indices: false,
+ serializeDate(date) {
+ return to_ISO.call(date);
+ },
+ skipNulls: false,
+ strictNullHandling: false,
+} as NonNullableProperties;
+
+function is_non_nullish_primitive(v: unknown): v is string | number | boolean | symbol | bigint {
+ return (
+ typeof v === "string" ||
+ typeof v === "number" ||
+ typeof v === "boolean" ||
+ typeof v === "symbol" ||
+ typeof v === "bigint"
+ );
}
const sentinel = {};
function inner_stringify(
- object: any,
- prefix: PropertyKey,
- generateArrayPrefix:
- | StringifyOptions["arrayFormat"]
- | ((prefix: string, key: string) => string),
- commaRoundTrip: boolean,
- allowEmptyArrays: boolean,
- strictNullHandling: boolean,
- skipNulls: boolean,
- encodeDotInKeys: boolean,
- encoder: StringifyOptions["encoder"],
- filter: StringifyOptions["filter"],
- sort: StringifyOptions["sort"],
- allowDots: StringifyOptions["allowDots"],
- serializeDate: StringifyOptions["serializeDate"],
- format: StringifyOptions["format"],
- formatter: StringifyOptions["formatter"],
- encodeValuesOnly: boolean,
- charset: StringifyOptions["charset"],
- sideChannel: WeakMap,
+ object: any,
+ prefix: PropertyKey,
+ generateArrayPrefix: StringifyOptions["arrayFormat"] | ((prefix: string, key: string) => string),
+ commaRoundTrip: boolean,
+ allowEmptyArrays: boolean,
+ strictNullHandling: boolean,
+ skipNulls: boolean,
+ encodeDotInKeys: boolean,
+ encoder: StringifyOptions["encoder"],
+ filter: StringifyOptions["filter"],
+ sort: StringifyOptions["sort"],
+ allowDots: StringifyOptions["allowDots"],
+ serializeDate: StringifyOptions["serializeDate"],
+ format: StringifyOptions["format"],
+ formatter: StringifyOptions["formatter"],
+ encodeValuesOnly: boolean,
+ charset: StringifyOptions["charset"],
+ sideChannel: WeakMap,
) {
- let obj = object;
-
- let tmp_sc = sideChannel;
- let step = 0;
- let find_flag = false;
- while ((tmp_sc = tmp_sc.get(sentinel)) !== void undefined && !find_flag) {
- // Where object last appeared in the ref tree
- const pos = tmp_sc.get(object);
- step += 1;
- if (typeof pos !== "undefined") {
- if (pos === step) {
- throw new RangeError("Cyclic object value");
- } else {
- find_flag = true; // Break while
- }
- }
- if (typeof tmp_sc.get(sentinel) === "undefined") {
- step = 0;
- }
- }
-
- if (typeof filter === "function") {
- obj = filter(prefix, obj);
- } else if (obj instanceof Date) {
- obj = serializeDate?.(obj);
- } else if (generateArrayPrefix === "comma" && is_array(obj)) {
- obj = maybe_map(obj, function (value) {
- if (value instanceof Date) {
- return serializeDate?.(value);
- }
- return value;
- });
- }
-
- if (obj === null) {
- if (strictNullHandling) {
- return encoder && !encodeValuesOnly
- ? // @ts-expect-error
- encoder(prefix, defaults.encoder, charset, "key", format)
- : prefix;
- }
-
- obj = "";
- }
-
- if (is_non_nullish_primitive(obj) || is_buffer(obj)) {
- if (encoder) {
- const key_value = encodeValuesOnly
- ? prefix
- : // @ts-expect-error
- encoder(prefix, defaults.encoder, charset, "key", format);
- return [
- formatter?.(key_value) +
- "=" +
- // @ts-expect-error
- formatter?.(encoder(obj, defaults.encoder, charset, "value", format)),
- ];
- }
- return [formatter?.(prefix) + "=" + formatter?.(String(obj))];
- }
-
- const values: string[] = [];
-
- if (typeof obj === "undefined") {
- return values;
- }
-
- let obj_keys;
- if (generateArrayPrefix === "comma" && is_array(obj)) {
- // we need to join elements in
- if (encodeValuesOnly && encoder) {
- // @ts-expect-error values only
- obj = maybe_map(obj, encoder);
- }
- obj_keys = [
- { value: obj.length > 0 ? obj.join(",") || null : void undefined },
- ];
- } else if (is_array(filter)) {
- obj_keys = filter;
- } else {
- const keys = Object.keys(obj);
- obj_keys = sort ? keys.sort(sort) : keys;
- }
-
- const encoded_prefix = encodeDotInKeys
- ? String(prefix).replace(/\./g, "%2E")
- : String(prefix);
-
- const adjusted_prefix =
- commaRoundTrip && is_array(obj) && obj.length === 1
- ? encoded_prefix + "[]"
- : encoded_prefix;
-
- if (allowEmptyArrays && is_array(obj) && obj.length === 0) {
- return adjusted_prefix + "[]";
- }
-
- for (let j = 0; j < obj_keys.length; ++j) {
- const key = obj_keys[j];
- const value =
- // @ts-ignore
- typeof key === "object" && typeof key.value !== "undefined"
- ? key.value
- : obj[key as any];
-
- if (skipNulls && value === null) {
- continue;
- }
-
- // @ts-ignore
- const encoded_key =
- allowDots && encodeDotInKeys ? (key as any).replace(/\./g, "%2E") : key;
- const key_prefix = is_array(obj)
- ? typeof generateArrayPrefix === "function"
- ? generateArrayPrefix(adjusted_prefix, encoded_key)
- : adjusted_prefix
- : adjusted_prefix +
- (allowDots ? "." + encoded_key : "[" + encoded_key + "]");
-
- sideChannel.set(object, step);
- const valueSideChannel = new WeakMap();
- valueSideChannel.set(sentinel, sideChannel);
- push_to_array(
- values,
- inner_stringify(
- value,
- key_prefix,
- generateArrayPrefix,
- commaRoundTrip,
- allowEmptyArrays,
- strictNullHandling,
- skipNulls,
- encodeDotInKeys,
- // @ts-ignore
- generateArrayPrefix === "comma" && encodeValuesOnly && is_array(obj)
- ? null
- : encoder,
- filter,
- sort,
- allowDots,
- serializeDate,
- format,
- formatter,
- encodeValuesOnly,
- charset,
- valueSideChannel,
- ),
- );
- }
-
- return values;
+ let obj = object;
+
+ let tmp_sc = sideChannel;
+ let step = 0;
+ let find_flag = false;
+ while ((tmp_sc = tmp_sc.get(sentinel)) !== void undefined && !find_flag) {
+ // Where object last appeared in the ref tree
+ const pos = tmp_sc.get(object);
+ step += 1;
+ if (typeof pos !== "undefined") {
+ if (pos === step) {
+ throw new RangeError("Cyclic object value");
+ }
+ find_flag = true; // Break while
+ }
+ if (typeof tmp_sc.get(sentinel) === "undefined") {
+ step = 0;
+ }
+ }
+
+ if (typeof filter === "function") {
+ obj = filter(prefix, obj);
+ } else if (obj instanceof Date) {
+ obj = serializeDate?.(obj);
+ } else if (generateArrayPrefix === "comma" && is_array(obj)) {
+ obj = maybe_map(obj, (value) => {
+ if (value instanceof Date) {
+ return serializeDate?.(value);
+ }
+ return value;
+ });
+ }
+
+ if (obj === null) {
+ if (strictNullHandling) {
+ return encoder && !encodeValuesOnly
+ ? // @ts-expect-error
+ encoder(prefix, defaults.encoder, charset, "key", format)
+ : prefix;
+ }
+
+ obj = "";
+ }
+
+ if (is_non_nullish_primitive(obj) || is_buffer(obj)) {
+ if (encoder) {
+ const key_value = encodeValuesOnly
+ ? prefix
+ : // @ts-expect-error
+ encoder(prefix, defaults.encoder, charset, "key", format);
+ return [
+ `${formatter?.(key_value)}=${formatter?.(encoder(obj, defaults.encoder, charset, "value", format))}`,
+ ];
+ }
+ return [`${formatter?.(prefix)}=${formatter?.(String(obj))}`];
+ }
+
+ const values: string[] = [];
+
+ if (typeof obj === "undefined") {
+ return values;
+ }
+
+ let obj_keys;
+ if (generateArrayPrefix === "comma" && is_array(obj)) {
+ // we need to join elements in
+ if (encodeValuesOnly && encoder) {
+ // @ts-expect-error values only
+ obj = maybe_map(obj, encoder);
+ }
+ obj_keys = [{ value: obj.length > 0 ? obj.join(",") || null : void undefined }];
+ } else if (is_array(filter)) {
+ obj_keys = filter;
+ } else {
+ const keys = Object.keys(obj);
+ obj_keys = sort ? keys.sort(sort) : keys;
+ }
+
+ const encoded_prefix = encodeDotInKeys ? String(prefix).replace(/\./g, "%2E") : String(prefix);
+
+ const adjusted_prefix =
+ commaRoundTrip && is_array(obj) && obj.length === 1 ? `${encoded_prefix}[]` : encoded_prefix;
+
+ if (allowEmptyArrays && is_array(obj) && obj.length === 0) {
+ return `${adjusted_prefix}[]`;
+ }
+
+ for (let j = 0; j < obj_keys.length; ++j) {
+ const key = obj_keys[j];
+ const value =
+ // @ts-ignore
+ typeof key === "object" && typeof key.value !== "undefined" ? key.value : obj[key as any];
+
+ if (skipNulls && value === null) {
+ continue;
+ }
+
+ // @ts-ignore
+ const encoded_key = allowDots && encodeDotInKeys ? (key as any).replace(/\./g, "%2E") : key;
+ const key_prefix = is_array(obj)
+ ? typeof generateArrayPrefix === "function"
+ ? generateArrayPrefix(adjusted_prefix, encoded_key)
+ : adjusted_prefix
+ : adjusted_prefix + (allowDots ? `.${encoded_key}` : `[${encoded_key}]`);
+
+ sideChannel.set(object, step);
+ const valueSideChannel = new WeakMap();
+ valueSideChannel.set(sentinel, sideChannel);
+ push_to_array(
+ values,
+ inner_stringify(
+ value,
+ key_prefix,
+ generateArrayPrefix,
+ commaRoundTrip,
+ allowEmptyArrays,
+ strictNullHandling,
+ skipNulls,
+ encodeDotInKeys,
+ // @ts-ignore
+ generateArrayPrefix === "comma" && encodeValuesOnly && is_array(obj) ? null : encoder,
+ filter,
+ sort,
+ allowDots,
+ serializeDate,
+ format,
+ formatter,
+ encodeValuesOnly,
+ charset,
+ valueSideChannel,
+ ),
+ );
+ }
+
+ return values;
}
-function normalize_stringify_options(
- opts: StringifyOptions = defaults,
-): NonNullableProperties> & {
- indices?: boolean;
+function normalize_stringify_options(opts: StringifyOptions = defaults): NonNullableProperties<
+ Omit
+> & {
+ indices?: boolean;
} {
- if (
- typeof opts.allowEmptyArrays !== "undefined" &&
- typeof opts.allowEmptyArrays !== "boolean"
- ) {
- throw new TypeError(
- "`allowEmptyArrays` option can only be `true` or `false`, when provided",
- );
- }
-
- if (
- typeof opts.encodeDotInKeys !== "undefined" &&
- typeof opts.encodeDotInKeys !== "boolean"
- ) {
- throw new TypeError(
- "`encodeDotInKeys` option can only be `true` or `false`, when provided",
- );
- }
-
- if (
- opts.encoder !== null &&
- typeof opts.encoder !== "undefined" &&
- typeof opts.encoder !== "function"
- ) {
- throw new TypeError("Encoder has to be a function.");
- }
-
- const charset = opts.charset || defaults.charset;
- if (
- typeof opts.charset !== "undefined" &&
- opts.charset !== "utf-8" &&
- opts.charset !== "iso-8859-1"
- ) {
- throw new TypeError(
- "The charset option must be either utf-8, iso-8859-1, or undefined",
- );
- }
-
- let format = default_format;
- if (typeof opts.format !== "undefined") {
- if (!has.call(formatters, opts.format)) {
- throw new TypeError("Unknown format option provided.");
- }
- format = opts.format;
- }
- const formatter = formatters[format];
-
- let filter = defaults.filter;
- if (typeof opts.filter === "function" || is_array(opts.filter)) {
- filter = opts.filter;
- }
-
- let arrayFormat: StringifyOptions["arrayFormat"];
- if (opts.arrayFormat && opts.arrayFormat in array_prefix_generators) {
- arrayFormat = opts.arrayFormat;
- } else if ("indices" in opts) {
- arrayFormat = opts.indices ? "indices" : "repeat";
- } else {
- arrayFormat = defaults.arrayFormat;
- }
-
- if ("commaRoundTrip" in opts && typeof opts.commaRoundTrip !== "boolean") {
- throw new TypeError("`commaRoundTrip` must be a boolean, or absent");
- }
-
- const allowDots =
- typeof opts.allowDots === "undefined"
- ? !!opts.encodeDotInKeys === true
- ? true
- : defaults.allowDots
- : !!opts.allowDots;
-
- return {
- addQueryPrefix:
- typeof opts.addQueryPrefix === "boolean"
- ? opts.addQueryPrefix
- : defaults.addQueryPrefix,
- // @ts-ignore
- allowDots: allowDots,
- allowEmptyArrays:
- typeof opts.allowEmptyArrays === "boolean"
- ? !!opts.allowEmptyArrays
- : defaults.allowEmptyArrays,
- arrayFormat: arrayFormat,
- charset: charset,
- charsetSentinel:
- typeof opts.charsetSentinel === "boolean"
- ? opts.charsetSentinel
- : defaults.charsetSentinel,
- commaRoundTrip: !!opts.commaRoundTrip,
- delimiter:
- typeof opts.delimiter === "undefined"
- ? defaults.delimiter
- : opts.delimiter,
- encode: typeof opts.encode === "boolean" ? opts.encode : defaults.encode,
- encodeDotInKeys:
- typeof opts.encodeDotInKeys === "boolean"
- ? opts.encodeDotInKeys
- : defaults.encodeDotInKeys,
- encoder:
- typeof opts.encoder === "function" ? opts.encoder : defaults.encoder,
- encodeValuesOnly:
- typeof opts.encodeValuesOnly === "boolean"
- ? opts.encodeValuesOnly
- : defaults.encodeValuesOnly,
- filter: filter,
- format: format,
- formatter: formatter,
- serializeDate:
- typeof opts.serializeDate === "function"
- ? opts.serializeDate
- : defaults.serializeDate,
- skipNulls:
- typeof opts.skipNulls === "boolean" ? opts.skipNulls : defaults.skipNulls,
- // @ts-ignore
- sort: typeof opts.sort === "function" ? opts.sort : null,
- strictNullHandling:
- typeof opts.strictNullHandling === "boolean"
- ? opts.strictNullHandling
- : defaults.strictNullHandling,
- };
+ if (typeof opts.allowEmptyArrays !== "undefined" && typeof opts.allowEmptyArrays !== "boolean") {
+ throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");
+ }
+
+ if (typeof opts.encodeDotInKeys !== "undefined" && typeof opts.encodeDotInKeys !== "boolean") {
+ throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");
+ }
+
+ if (
+ opts.encoder !== null &&
+ typeof opts.encoder !== "undefined" &&
+ typeof opts.encoder !== "function"
+ ) {
+ throw new TypeError("Encoder has to be a function.");
+ }
+
+ const charset = opts.charset || defaults.charset;
+ if (
+ typeof opts.charset !== "undefined" &&
+ opts.charset !== "utf-8" &&
+ opts.charset !== "iso-8859-1"
+ ) {
+ throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");
+ }
+
+ let format = default_format;
+ if (typeof opts.format !== "undefined") {
+ if (!has.call(formatters, opts.format)) {
+ throw new TypeError("Unknown format option provided.");
+ }
+ format = opts.format;
+ }
+ const formatter = formatters[format];
+
+ let filter = defaults.filter;
+ if (typeof opts.filter === "function" || is_array(opts.filter)) {
+ filter = opts.filter;
+ }
+
+ let arrayFormat: StringifyOptions["arrayFormat"];
+ if (opts.arrayFormat && opts.arrayFormat in array_prefix_generators) {
+ arrayFormat = opts.arrayFormat;
+ } else if ("indices" in opts) {
+ arrayFormat = opts.indices ? "indices" : "repeat";
+ } else {
+ arrayFormat = defaults.arrayFormat;
+ }
+
+ if ("commaRoundTrip" in opts && typeof opts.commaRoundTrip !== "boolean") {
+ throw new TypeError("`commaRoundTrip` must be a boolean, or absent");
+ }
+
+ const allowDots =
+ typeof opts.allowDots === "undefined"
+ ? !!opts.encodeDotInKeys === true
+ ? true
+ : defaults.allowDots
+ : !!opts.allowDots;
+
+ return {
+ addQueryPrefix:
+ typeof opts.addQueryPrefix === "boolean" ? opts.addQueryPrefix : defaults.addQueryPrefix,
+ // @ts-ignore
+ allowDots: allowDots,
+ allowEmptyArrays:
+ typeof opts.allowEmptyArrays === "boolean" ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,
+ arrayFormat: arrayFormat,
+ charset: charset,
+ charsetSentinel:
+ typeof opts.charsetSentinel === "boolean" ? opts.charsetSentinel : defaults.charsetSentinel,
+ commaRoundTrip: !!opts.commaRoundTrip,
+ delimiter: typeof opts.delimiter === "undefined" ? defaults.delimiter : opts.delimiter,
+ encode: typeof opts.encode === "boolean" ? opts.encode : defaults.encode,
+ encodeDotInKeys:
+ typeof opts.encodeDotInKeys === "boolean" ? opts.encodeDotInKeys : defaults.encodeDotInKeys,
+ encoder: typeof opts.encoder === "function" ? opts.encoder : defaults.encoder,
+ encodeValuesOnly:
+ typeof opts.encodeValuesOnly === "boolean" ? opts.encodeValuesOnly : defaults.encodeValuesOnly,
+ filter: filter,
+ format: format,
+ formatter: formatter,
+ serializeDate:
+ typeof opts.serializeDate === "function" ? opts.serializeDate : defaults.serializeDate,
+ skipNulls: typeof opts.skipNulls === "boolean" ? opts.skipNulls : defaults.skipNulls,
+ // @ts-ignore
+ sort: typeof opts.sort === "function" ? opts.sort : null,
+ strictNullHandling:
+ typeof opts.strictNullHandling === "boolean"
+ ? opts.strictNullHandling
+ : defaults.strictNullHandling,
+ };
}
export function stringify(object: any, opts: StringifyOptions = {}) {
- let obj = object;
- const options = normalize_stringify_options(opts);
-
- let obj_keys: PropertyKey[] | undefined;
- let filter;
-
- if (typeof options.filter === "function") {
- filter = options.filter;
- obj = filter("", obj);
- } else if (is_array(options.filter)) {
- filter = options.filter;
- obj_keys = filter;
- }
-
- const keys: string[] = [];
-
- if (typeof obj !== "object" || obj === null) {
- return "";
- }
-
- const generateArrayPrefix = array_prefix_generators[options.arrayFormat];
- const commaRoundTrip =
- generateArrayPrefix === "comma" && options.commaRoundTrip;
-
- if (!obj_keys) {
- obj_keys = Object.keys(obj);
- }
-
- if (options.sort) {
- obj_keys.sort(options.sort);
- }
-
- const sideChannel = new WeakMap();
- for (let i = 0; i < obj_keys.length; ++i) {
- const key = obj_keys[i]!;
-
- if (options.skipNulls && obj[key] === null) {
- continue;
- }
- push_to_array(
- keys,
- inner_stringify(
- obj[key],
- key,
- // @ts-expect-error
- generateArrayPrefix,
- commaRoundTrip,
- options.allowEmptyArrays,
- options.strictNullHandling,
- options.skipNulls,
- options.encodeDotInKeys,
- options.encode ? options.encoder : null,
- options.filter,
- options.sort,
- options.allowDots,
- options.serializeDate,
- options.format,
- options.formatter,
- options.encodeValuesOnly,
- options.charset,
- sideChannel,
- ),
- );
- }
-
- const joined = keys.join(options.delimiter);
- let prefix = options.addQueryPrefix === true ? "?" : "";
-
- if (options.charsetSentinel) {
- if (options.charset === "iso-8859-1") {
- // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark
- prefix += "utf8=%26%2310003%3B&";
- } else {
- // encodeURIComponent('✓')
- prefix += "utf8=%E2%9C%93&";
- }
- }
-
- return joined.length > 0 ? prefix + joined : "";
+ let obj = object;
+ const options = normalize_stringify_options(opts);
+
+ let obj_keys: PropertyKey[] | undefined;
+ let filter;
+
+ if (typeof options.filter === "function") {
+ filter = options.filter;
+ obj = filter("", obj);
+ } else if (is_array(options.filter)) {
+ filter = options.filter;
+ obj_keys = filter;
+ }
+
+ const keys: string[] = [];
+
+ if (typeof obj !== "object" || obj === null) {
+ return "";
+ }
+
+ const generateArrayPrefix = array_prefix_generators[options.arrayFormat];
+ const commaRoundTrip = generateArrayPrefix === "comma" && options.commaRoundTrip;
+
+ if (!obj_keys) {
+ obj_keys = Object.keys(obj);
+ }
+
+ if (options.sort) {
+ obj_keys.sort(options.sort);
+ }
+
+ const sideChannel = new WeakMap();
+ for (let i = 0; i < obj_keys.length; ++i) {
+ const key = obj_keys[i]!;
+
+ if (options.skipNulls && obj[key] === null) {
+ continue;
+ }
+ push_to_array(
+ keys,
+ inner_stringify(
+ obj[key],
+ key,
+ // @ts-expect-error
+ generateArrayPrefix,
+ commaRoundTrip,
+ options.allowEmptyArrays,
+ options.strictNullHandling,
+ options.skipNulls,
+ options.encodeDotInKeys,
+ options.encode ? options.encoder : null,
+ options.filter,
+ options.sort,
+ options.allowDots,
+ options.serializeDate,
+ options.format,
+ options.formatter,
+ options.encodeValuesOnly,
+ options.charset,
+ sideChannel,
+ ),
+ );
+ }
+
+ const joined = keys.join(options.delimiter);
+ let prefix = options.addQueryPrefix === true ? "?" : "";
+
+ if (options.charsetSentinel) {
+ if (options.charset === "iso-8859-1") {
+ // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark
+ prefix += "utf8=%26%2310003%3B&";
+ } else {
+ // encodeURIComponent('✓')
+ prefix += "utf8=%E2%9C%93&";
+ }
+ }
+
+ return joined.length > 0 ? prefix + joined : "";
}
diff --git a/packages/google-calendar/src/internal/qs/types.ts b/packages/google-calendar/src/internal/qs/types.ts
index 4bd16533..d027acd2 100644
--- a/packages/google-calendar/src/internal/qs/types.ts
+++ b/packages/google-calendar/src/internal/qs/types.ts
@@ -1,84 +1,76 @@
export type Format = "RFC1738" | "RFC3986";
-export type DefaultEncoder = (
- str: any,
- defaultEncoder?: any,
- charset?: string,
-) => string;
-export type DefaultDecoder = (
- str: string,
- decoder?: any,
- charset?: string,
-) => string;
+export type DefaultEncoder = (str: any, defaultEncoder?: any, charset?: string) => string;
+export type DefaultDecoder = (str: string, decoder?: any, charset?: string) => string;
export type BooleanOptional = boolean | undefined;
export type StringifyBaseOptions = {
- delimiter?: string;
- allowDots?: boolean;
- encodeDotInKeys?: boolean;
- strictNullHandling?: boolean;
- skipNulls?: boolean;
- encode?: boolean;
- encoder?: (
- str: any,
- defaultEncoder: DefaultEncoder,
- charset: string,
- type: "key" | "value",
- format?: Format,
- ) => string;
- filter?: Array | ((prefix: PropertyKey, value: any) => any);
- arrayFormat?: "indices" | "brackets" | "repeat" | "comma";
- indices?: boolean;
- sort?: ((a: PropertyKey, b: PropertyKey) => number) | null;
- serializeDate?: (d: Date) => string;
- format?: "RFC1738" | "RFC3986";
- formatter?: (str: PropertyKey) => string;
- encodeValuesOnly?: boolean;
- addQueryPrefix?: boolean;
- charset?: "utf-8" | "iso-8859-1";
- charsetSentinel?: boolean;
- allowEmptyArrays?: boolean;
- commaRoundTrip?: boolean;
+ delimiter?: string;
+ allowDots?: boolean;
+ encodeDotInKeys?: boolean;
+ strictNullHandling?: boolean;
+ skipNulls?: boolean;
+ encode?: boolean;
+ encoder?: (
+ str: any,
+ defaultEncoder: DefaultEncoder,
+ charset: string,
+ type: "key" | "value",
+ format?: Format,
+ ) => string;
+ filter?: Array | ((prefix: PropertyKey, value: any) => any);
+ arrayFormat?: "indices" | "brackets" | "repeat" | "comma";
+ indices?: boolean;
+ sort?: ((a: PropertyKey, b: PropertyKey) => number) | null;
+ serializeDate?: (d: Date) => string;
+ format?: "RFC1738" | "RFC3986";
+ formatter?: (str: PropertyKey) => string;
+ encodeValuesOnly?: boolean;
+ addQueryPrefix?: boolean;
+ charset?: "utf-8" | "iso-8859-1";
+ charsetSentinel?: boolean;
+ allowEmptyArrays?: boolean;
+ commaRoundTrip?: boolean;
};
export type StringifyOptions = StringifyBaseOptions;
export type ParseBaseOptions = {
- comma?: boolean;
- delimiter?: string | RegExp;
- depth?: number | false;
- decoder?: (
- str: string,
- defaultDecoder: DefaultDecoder,
- charset: string,
- type: "key" | "value",
- ) => any;
- arrayLimit?: number;
- parseArrays?: boolean;
- plainObjects?: boolean;
- allowPrototypes?: boolean;
- allowSparse?: boolean;
- parameterLimit?: number;
- strictDepth?: boolean;
- strictNullHandling?: boolean;
- ignoreQueryPrefix?: boolean;
- charset?: "utf-8" | "iso-8859-1";
- charsetSentinel?: boolean;
- interpretNumericEntities?: boolean;
- allowEmptyArrays?: boolean;
- duplicates?: "combine" | "first" | "last";
- allowDots?: boolean;
- decodeDotInKeys?: boolean;
+ comma?: boolean;
+ delimiter?: string | RegExp;
+ depth?: number | false;
+ decoder?: (
+ str: string,
+ defaultDecoder: DefaultDecoder,
+ charset: string,
+ type: "key" | "value",
+ ) => any;
+ arrayLimit?: number;
+ parseArrays?: boolean;
+ plainObjects?: boolean;
+ allowPrototypes?: boolean;
+ allowSparse?: boolean;
+ parameterLimit?: number;
+ strictDepth?: boolean;
+ strictNullHandling?: boolean;
+ ignoreQueryPrefix?: boolean;
+ charset?: "utf-8" | "iso-8859-1";
+ charsetSentinel?: boolean;
+ interpretNumericEntities?: boolean;
+ allowEmptyArrays?: boolean;
+ duplicates?: "combine" | "first" | "last";
+ allowDots?: boolean;
+ decodeDotInKeys?: boolean;
};
export type ParseOptions = ParseBaseOptions;
export type ParsedQs = {
- [key: string]: undefined | string | string[] | ParsedQs | ParsedQs[];
+ [key: string]: undefined | string | string[] | ParsedQs | ParsedQs[];
};
// Type to remove null or undefined union from each property
export type NonNullableProperties = {
- [K in keyof T]-?: Exclude;
+ [K in keyof T]-?: Exclude;
};
diff --git a/packages/google-calendar/src/internal/qs/utils.ts b/packages/google-calendar/src/internal/qs/utils.ts
index 42520825..fa40e855 100644
--- a/packages/google-calendar/src/internal/qs/utils.ts
+++ b/packages/google-calendar/src/internal/qs/utils.ts
@@ -5,276 +5,264 @@ const has = Object.prototype.hasOwnProperty;
const is_array = Array.isArray;
const hex_table = (() => {
- const array = [];
- for (let i = 0; i < 256; ++i) {
- array.push("%" + ((i < 16 ? "0" : "") + i.toString(16)).toUpperCase());
- }
+ const array = [];
+ for (let i = 0; i < 256; ++i) {
+ array.push(`%${((i < 16 ? "0" : "") + i.toString(16)).toUpperCase()}`);
+ }
- return array;
+ return array;
})();
-function compact_queue>(
- queue: Array<{ obj: T; prop: string }>,
-) {
- while (queue.length > 1) {
- const item = queue.pop();
- if (!item) continue;
+function compact_queue>(queue: Array<{ obj: T; prop: string }>) {
+ while (queue.length > 1) {
+ const item = queue.pop();
+ if (!item) continue;
- const obj = item.obj[item.prop];
+ const obj = item.obj[item.prop];
- if (is_array(obj)) {
- const compacted: unknown[] = [];
+ if (is_array(obj)) {
+ const compacted: unknown[] = [];
- for (let j = 0; j < obj.length; ++j) {
- if (typeof obj[j] !== "undefined") {
- compacted.push(obj[j]);
- }
- }
+ for (let j = 0; j < obj.length; ++j) {
+ if (typeof obj[j] !== "undefined") {
+ compacted.push(obj[j]);
+ }
+ }
- // @ts-ignore
- item.obj[item.prop] = compacted;
- }
- }
+ // @ts-ignore
+ item.obj[item.prop] = compacted;
+ }
+ }
}
function array_to_object(source: any[], options: { plainObjects: boolean }) {
- const obj = options && options.plainObjects ? Object.create(null) : {};
- for (let i = 0; i < source.length; ++i) {
- if (typeof source[i] !== "undefined") {
- obj[i] = source[i];
- }
- }
-
- return obj;
+ const obj = options?.plainObjects ? Object.create(null) : {};
+ for (let i = 0; i < source.length; ++i) {
+ if (typeof source[i] !== "undefined") {
+ obj[i] = source[i];
+ }
+ }
+
+ return obj;
}
export function merge(
- target: any,
- source: any,
- options: { plainObjects?: boolean; allowPrototypes?: boolean } = {},
+ target: any,
+ source: any,
+ options: { plainObjects?: boolean; allowPrototypes?: boolean } = {},
) {
- if (!source) {
- return target;
- }
-
- if (typeof source !== "object") {
- if (is_array(target)) {
- target.push(source);
- } else if (target && typeof target === "object") {
- if (
- (options && (options.plainObjects || options.allowPrototypes)) ||
- !has.call(Object.prototype, source)
- ) {
- target[source] = true;
- }
- } else {
- return [target, source];
- }
-
- return target;
- }
-
- if (!target || typeof target !== "object") {
- return [target].concat(source);
- }
-
- let mergeTarget = target;
- if (is_array(target) && !is_array(source)) {
- // @ts-ignore
- mergeTarget = array_to_object(target, options);
- }
-
- if (is_array(target) && is_array(source)) {
- source.forEach(function (item, i) {
- if (has.call(target, i)) {
- const targetItem = target[i];
- if (
- targetItem &&
- typeof targetItem === "object" &&
- item &&
- typeof item === "object"
- ) {
- target[i] = merge(targetItem, item, options);
- } else {
- target.push(item);
- }
- } else {
- target[i] = item;
- }
- });
- return target;
- }
-
- return Object.keys(source).reduce(function (acc, key) {
- const value = source[key];
-
- if (has.call(acc, key)) {
- acc[key] = merge(acc[key], value, options);
- } else {
- acc[key] = value;
- }
- return acc;
- }, mergeTarget);
+ if (!source) {
+ return target;
+ }
+
+ if (typeof source !== "object") {
+ if (is_array(target)) {
+ target.push(source);
+ } else if (target && typeof target === "object") {
+ if (
+ (options && (options.plainObjects || options.allowPrototypes)) ||
+ !has.call(Object.prototype, source)
+ ) {
+ target[source] = true;
+ }
+ } else {
+ return [target, source];
+ }
+
+ return target;
+ }
+
+ if (!target || typeof target !== "object") {
+ return [target].concat(source);
+ }
+
+ let mergeTarget = target;
+ if (is_array(target) && !is_array(source)) {
+ // @ts-ignore
+ mergeTarget = array_to_object(target, options);
+ }
+
+ if (is_array(target) && is_array(source)) {
+ source.forEach((item, i) => {
+ if (has.call(target, i)) {
+ const targetItem = target[i];
+ if (targetItem && typeof targetItem === "object" && item && typeof item === "object") {
+ target[i] = merge(targetItem, item, options);
+ } else {
+ target.push(item);
+ }
+ } else {
+ target[i] = item;
+ }
+ });
+ return target;
+ }
+
+ return Object.keys(source).reduce((acc, key) => {
+ const value = source[key];
+
+ if (has.call(acc, key)) {
+ acc[key] = merge(acc[key], value, options);
+ } else {
+ acc[key] = value;
+ }
+ return acc;
+ }, mergeTarget);
}
export function assign_single_source(target: any, source: any) {
- return Object.keys(source).reduce(function (acc, key) {
- acc[key] = source[key];
- return acc;
- }, target);
+ return Object.keys(source).reduce((acc, key) => {
+ acc[key] = source[key];
+ return acc;
+ }, target);
}
export function decode(str: string, _: any, charset: string) {
- const strWithoutPlus = str.replace(/\+/g, " ");
- if (charset === "iso-8859-1") {
- // unescape never throws, no try...catch needed:
- return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
- }
- // utf-8
- try {
- return decodeURIComponent(strWithoutPlus);
- } catch (e) {
- return strWithoutPlus;
- }
+ const strWithoutPlus = str.replace(/\+/g, " ");
+ if (charset === "iso-8859-1") {
+ // unescape never throws, no try...catch needed:
+ return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
+ }
+ // utf-8
+ try {
+ return decodeURIComponent(strWithoutPlus);
+ } catch (e) {
+ return strWithoutPlus;
+ }
}
const limit = 1024;
export const encode: (
- str: any,
- defaultEncoder: DefaultEncoder,
- charset: string,
- type: "key" | "value",
- format: Format,
+ str: any,
+ defaultEncoder: DefaultEncoder,
+ charset: string,
+ type: "key" | "value",
+ format: Format,
) => string = (str, _defaultEncoder, charset, _kind, format: Format) => {
- // This code was originally written by Brian White for the io.js core querystring library.
- // It has been adapted here for stricter adherence to RFC 3986
- if (str.length === 0) {
- return str;
- }
-
- let string = str;
- if (typeof str === "symbol") {
- string = Symbol.prototype.toString.call(str);
- } else if (typeof str !== "string") {
- string = String(str);
- }
-
- if (charset === "iso-8859-1") {
- return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
- return "%26%23" + parseInt($0.slice(2), 16) + "%3B";
- });
- }
-
- let out = "";
- for (let j = 0; j < string.length; j += limit) {
- const segment =
- string.length >= limit ? string.slice(j, j + limit) : string;
- const arr = [];
-
- for (let i = 0; i < segment.length; ++i) {
- let c = segment.charCodeAt(i);
- if (
- c === 0x2d || // -
- c === 0x2e || // .
- c === 0x5f || // _
- c === 0x7e || // ~
- (c >= 0x30 && c <= 0x39) || // 0-9
- (c >= 0x41 && c <= 0x5a) || // a-z
- (c >= 0x61 && c <= 0x7a) || // A-Z
- (format === RFC1738 && (c === 0x28 || c === 0x29)) // ( )
- ) {
- arr[arr.length] = segment.charAt(i);
- continue;
- }
-
- if (c < 0x80) {
- arr[arr.length] = hex_table[c];
- continue;
- }
-
- if (c < 0x800) {
- arr[arr.length] =
- hex_table[0xc0 | (c >> 6)]! + hex_table[0x80 | (c & 0x3f)];
- continue;
- }
-
- if (c < 0xd800 || c >= 0xe000) {
- arr[arr.length] =
- hex_table[0xe0 | (c >> 12)]! +
- hex_table[0x80 | ((c >> 6) & 0x3f)] +
- hex_table[0x80 | (c & 0x3f)];
- continue;
- }
-
- i += 1;
- c = 0x10000 + (((c & 0x3ff) << 10) | (segment.charCodeAt(i) & 0x3ff));
-
- arr[arr.length] =
- hex_table[0xf0 | (c >> 18)]! +
- hex_table[0x80 | ((c >> 12) & 0x3f)] +
- hex_table[0x80 | ((c >> 6) & 0x3f)] +
- hex_table[0x80 | (c & 0x3f)];
- }
-
- out += arr.join("");
- }
-
- return out;
+ // This code was originally written by Brian White for the io.js core querystring library.
+ // It has been adapted here for stricter adherence to RFC 3986
+ if (str.length === 0) {
+ return str;
+ }
+
+ let string = str;
+ if (typeof str === "symbol") {
+ string = Symbol.prototype.toString.call(str);
+ } else if (typeof str !== "string") {
+ string = String(str);
+ }
+
+ if (charset === "iso-8859-1") {
+ return escape(string).replace(
+ /%u[0-9a-f]{4}/gi,
+ ($0) => `%26%23${Number.parseInt($0.slice(2), 16)}%3B`,
+ );
+ }
+
+ let out = "";
+ for (let j = 0; j < string.length; j += limit) {
+ const segment = string.length >= limit ? string.slice(j, j + limit) : string;
+ const arr = [];
+
+ for (let i = 0; i < segment.length; ++i) {
+ let c = segment.charCodeAt(i);
+ if (
+ c === 0x2d || // -
+ c === 0x2e || // .
+ c === 0x5f || // _
+ c === 0x7e || // ~
+ (c >= 0x30 && c <= 0x39) || // 0-9
+ (c >= 0x41 && c <= 0x5a) || // a-z
+ (c >= 0x61 && c <= 0x7a) || // A-Z
+ (format === RFC1738 && (c === 0x28 || c === 0x29)) // ( )
+ ) {
+ arr[arr.length] = segment.charAt(i);
+ continue;
+ }
+
+ if (c < 0x80) {
+ arr[arr.length] = hex_table[c];
+ continue;
+ }
+
+ if (c < 0x800) {
+ arr[arr.length] = hex_table[0xc0 | (c >> 6)]! + hex_table[0x80 | (c & 0x3f)];
+ continue;
+ }
+
+ if (c < 0xd800 || c >= 0xe000) {
+ arr[arr.length] =
+ hex_table[0xe0 | (c >> 12)]! +
+ hex_table[0x80 | ((c >> 6) & 0x3f)] +
+ hex_table[0x80 | (c & 0x3f)];
+ continue;
+ }
+
+ i += 1;
+ c = 0x10000 + (((c & 0x3ff) << 10) | (segment.charCodeAt(i) & 0x3ff));
+
+ arr[arr.length] =
+ hex_table[0xf0 | (c >> 18)]! +
+ hex_table[0x80 | ((c >> 12) & 0x3f)] +
+ hex_table[0x80 | ((c >> 6) & 0x3f)] +
+ hex_table[0x80 | (c & 0x3f)];
+ }
+
+ out += arr.join("");
+ }
+
+ return out;
};
export function compact(value: any) {
- const queue = [{ obj: { o: value }, prop: "o" }];
- const refs = [];
-
- for (let i = 0; i < queue.length; ++i) {
- const item = queue[i];
- // @ts-ignore
- const obj = item.obj[item.prop];
-
- const keys = Object.keys(obj);
- for (let j = 0; j < keys.length; ++j) {
- const key = keys[j]!;
- const val = obj[key];
- if (typeof val === "object" && val !== null && refs.indexOf(val) === -1) {
- queue.push({ obj: obj, prop: key });
- refs.push(val);
- }
- }
- }
-
- compact_queue(queue);
-
- return value;
+ const queue = [{ obj: { o: value }, prop: "o" }];
+ const refs = [];
+
+ for (let i = 0; i < queue.length; ++i) {
+ const item = queue[i];
+ // @ts-ignore
+ const obj = item.obj[item.prop];
+
+ const keys = Object.keys(obj);
+ for (let j = 0; j < keys.length; ++j) {
+ const key = keys[j]!;
+ const val = obj[key];
+ if (typeof val === "object" && val !== null && refs.indexOf(val) === -1) {
+ queue.push({ obj: obj, prop: key });
+ refs.push(val);
+ }
+ }
+ }
+
+ compact_queue(queue);
+
+ return value;
}
export function is_regexp(obj: any) {
- return Object.prototype.toString.call(obj) === "[object RegExp]";
+ return Object.prototype.toString.call(obj) === "[object RegExp]";
}
export function is_buffer(obj: any) {
- if (!obj || typeof obj !== "object") {
- return false;
- }
-
- return !!(
- obj.constructor &&
- obj.constructor.isBuffer &&
- obj.constructor.isBuffer(obj)
- );
+ if (!obj || typeof obj !== "object") {
+ return false;
+ }
+
+ return !!obj.constructor?.isBuffer?.(obj);
}
export function combine(a: any, b: any) {
- return [].concat(a, b);
+ return [].concat(a, b);
}
export function maybe_map(val: T[], fn: (v: T) => T) {
- if (is_array(val)) {
- const mapped = [];
- for (let i = 0; i < val.length; i += 1) {
- mapped.push(fn(val[i]!));
- }
- return mapped;
- }
- return fn(val);
+ if (is_array(val)) {
+ const mapped = [];
+ for (let i = 0; i < val.length; i += 1) {
+ mapped.push(fn(val[i]!));
+ }
+ return mapped;
+ }
+ return fn(val);
}
diff --git a/packages/google-calendar/src/internal/request-options.ts b/packages/google-calendar/src/internal/request-options.ts
index 2a4e8ab3..460052c3 100644
--- a/packages/google-calendar/src/internal/request-options.ts
+++ b/packages/google-calendar/src/internal/request-options.ts
@@ -1,43 +1,43 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-import { NullableHeaders } from "./headers";
+import type { NullableHeaders } from "./headers";
import type { BodyInit } from "./builtin-types";
import type { HTTPMethod, MergedRequestInit } from "./types";
-import { type HeadersLike } from "./headers";
+import type { HeadersLike } from "./headers";
export type FinalRequestOptions = RequestOptions & {
- method: HTTPMethod;
- path: string;
+ method: HTTPMethod;
+ path: string;
};
export type RequestOptions = {
- method?: HTTPMethod;
- path?: string;
- query?: object | undefined | null;
- body?: unknown;
- headers?: HeadersLike;
- maxRetries?: number;
- stream?: boolean | undefined;
- timeout?: number;
- fetchOptions?: MergedRequestInit;
- signal?: AbortSignal | undefined | null;
- idempotencyKey?: string;
+ method?: HTTPMethod;
+ path?: string;
+ query?: object | undefined | null;
+ body?: unknown;
+ headers?: HeadersLike;
+ maxRetries?: number;
+ stream?: boolean | undefined;
+ timeout?: number;
+ fetchOptions?: MergedRequestInit;
+ signal?: AbortSignal | undefined | null;
+ idempotencyKey?: string;
- __binaryResponse?: boolean | undefined;
+ __binaryResponse?: boolean | undefined;
};
export type EncodedContent = { bodyHeaders: HeadersLike; body: BodyInit };
export type RequestEncoder = (request: {
- headers: NullableHeaders;
- body: unknown;
+ headers: NullableHeaders;
+ body: unknown;
}) => EncodedContent;
export const FallbackEncoder: RequestEncoder = ({ headers, body }) => {
- return {
- bodyHeaders: {
- "content-type": "application/json",
- },
- body: JSON.stringify(body),
- };
+ return {
+ bodyHeaders: {
+ "content-type": "application/json",
+ },
+ body: JSON.stringify(body),
+ };
};
diff --git a/packages/google-calendar/src/internal/shim-types.d.ts b/packages/google-calendar/src/internal/shim-types.d.ts
index 53bae3b1..4d278f81 100644
--- a/packages/google-calendar/src/internal/shim-types.d.ts
+++ b/packages/google-calendar/src/internal/shim-types.d.ts
@@ -13,20 +13,18 @@
* presence of `NodeJS.ReadableStream` will fail.
*/
declare namespace NodeJS {
- interface ReadableStream {}
+ type ReadableStream = {};
}
type HasProperties = keyof T extends never ? false : true;
// @ts-ignore
type _ReadableStream =
- // @ts-ignore
- HasProperties extends true
- ? NodeJS.ReadableStream
- : ReadableStream;
+ // @ts-ignore
+ HasProperties extends true ? NodeJS.ReadableStream : ReadableStream;
// @ts-ignore
declare const _ReadableStream: unknown extends typeof ReadableStream
- ? never
- : typeof ReadableStream;
+ ? never
+ : typeof ReadableStream;
export { _ReadableStream as ReadableStream };
diff --git a/packages/google-calendar/src/internal/shims.ts b/packages/google-calendar/src/internal/shims.ts
index 6e0b0551..4736003f 100644
--- a/packages/google-calendar/src/internal/shims.ts
+++ b/packages/google-calendar/src/internal/shims.ts
@@ -7,58 +7,52 @@
* messages in cases where an environment isn't fully supported.
*/
-import { type Fetch } from "./builtin-types";
-import { type ReadableStream } from "./shim-types";
+import type { Fetch } from "./builtin-types";
+import type { ReadableStream } from "./shim-types";
export function getDefaultFetch(): Fetch {
- if (typeof fetch !== "undefined") {
- return fetch as any;
- }
+ if (typeof fetch !== "undefined") {
+ return fetch as any;
+ }
- throw new Error(
- "`fetch` is not defined as a global; Either pass `fetch` to the client, `new GoogleCalendar({ fetch })` or polyfill the global, `globalThis.fetch = fetch`",
- );
+ throw new Error(
+ "`fetch` is not defined as a global; Either pass `fetch` to the client, `new GoogleCalendar({ fetch })` or polyfill the global, `globalThis.fetch = fetch`",
+ );
}
type ReadableStreamArgs = ConstructorParameters;
-export function makeReadableStream(
- ...args: ReadableStreamArgs
-): ReadableStream {
- const ReadableStream = (globalThis as any).ReadableStream;
- if (typeof ReadableStream === "undefined") {
- // Note: All of the platforms / runtimes we officially support already define
- // `ReadableStream` as a global, so this should only ever be hit on unsupported runtimes.
- throw new Error(
- "`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`",
- );
- }
+export function makeReadableStream(...args: ReadableStreamArgs): ReadableStream {
+ const ReadableStream = (globalThis as any).ReadableStream;
+ if (typeof ReadableStream === "undefined") {
+ // Note: All of the platforms / runtimes we officially support already define
+ // `ReadableStream` as a global, so this should only ever be hit on unsupported runtimes.
+ throw new Error(
+ "`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`",
+ );
+ }
- return new ReadableStream(...args);
+ return new ReadableStream(...args);
}
-export function ReadableStreamFrom(
- iterable: Iterable | AsyncIterable,
-): ReadableStream {
- let iter: AsyncIterator | Iterator =
- Symbol.asyncIterator in iterable
- ? iterable[Symbol.asyncIterator]()
- : iterable[Symbol.iterator]();
+export function ReadableStreamFrom(iterable: Iterable | AsyncIterable): ReadableStream {
+ const iter: AsyncIterator | Iterator =
+ Symbol.asyncIterator in iterable ? iterable[Symbol.asyncIterator]() : iterable[Symbol.iterator]();
- return makeReadableStream({
- start() {},
- async pull(controller: any) {
- const { done, value } = await iter.next();
- if (done) {
- controller.close();
- } else {
- controller.enqueue(value);
- }
- },
- async cancel() {
- await iter.return?.();
- },
- });
+ return makeReadableStream({
+ start() {},
+ async pull(controller: any) {
+ const { done, value } = await iter.next();
+ if (done) {
+ controller.close();
+ } else {
+ controller.enqueue(value);
+ }
+ },
+ async cancel() {
+ await iter.return?.();
+ },
+ });
}
/**
@@ -67,33 +61,31 @@ export function ReadableStreamFrom(
*
* This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490
*/
-export function ReadableStreamToAsyncIterable(
- stream: any,
-): AsyncIterableIterator {
- if (stream[Symbol.asyncIterator]) return stream;
+export function ReadableStreamToAsyncIterable(stream: any): AsyncIterableIterator {
+ if (stream[Symbol.asyncIterator]) return stream;
- const reader = stream.getReader();
- return {
- async next() {
- try {
- const result = await reader.read();
- if (result?.done) reader.releaseLock(); // release lock when stream becomes closed
- return result;
- } catch (e) {
- reader.releaseLock(); // release lock when stream becomes errored
- throw e;
- }
- },
- async return() {
- const cancelPromise = reader.cancel();
- reader.releaseLock();
- await cancelPromise;
- return { done: true, value: undefined };
- },
- [Symbol.asyncIterator]() {
- return this;
- },
- };
+ const reader = stream.getReader();
+ return {
+ async next() {
+ try {
+ const result = await reader.read();
+ if (result?.done) reader.releaseLock(); // release lock when stream becomes closed
+ return result;
+ } catch (e) {
+ reader.releaseLock(); // release lock when stream becomes errored
+ throw e;
+ }
+ },
+ async return() {
+ const cancelPromise = reader.cancel();
+ reader.releaseLock();
+ await cancelPromise;
+ return { done: true, value: undefined };
+ },
+ [Symbol.asyncIterator]() {
+ return this;
+ },
+ };
}
/**
@@ -101,15 +93,15 @@ export function ReadableStreamToAsyncIterable(
* See https://undici.nodejs.org/#/?id=garbage-collection
*/
export async function CancelReadableStream(stream: any): Promise {
- if (stream === null || typeof stream !== "object") return;
+ if (stream === null || typeof stream !== "object") return;
- if (stream[Symbol.asyncIterator]) {
- await stream[Symbol.asyncIterator]().return?.();
- return;
- }
+ if (stream[Symbol.asyncIterator]) {
+ await stream[Symbol.asyncIterator]().return?.();
+ return;
+ }
- const reader = stream.getReader();
- const cancelPromise = reader.cancel();
- reader.releaseLock();
- await cancelPromise;
+ const reader = stream.getReader();
+ const cancelPromise = reader.cancel();
+ reader.releaseLock();
+ await cancelPromise;
}
diff --git a/packages/google-calendar/src/internal/to-file.ts b/packages/google-calendar/src/internal/to-file.ts
index e730958e..df6af823 100644
--- a/packages/google-calendar/src/internal/to-file.ts
+++ b/packages/google-calendar/src/internal/to-file.ts
@@ -1,84 +1,75 @@
-import { BlobPart, getName, makeFile, isAsyncIterable } from "./uploads";
+import { type BlobPart, getName, makeFile, isAsyncIterable } from "./uploads";
import type { FilePropertyBag } from "./builtin-types";
import { checkFileSupport } from "./uploads";
-type BlobLikePart =
- | string
- | ArrayBuffer
- | ArrayBufferView
- | BlobLike
- | DataView;
+type BlobLikePart = string | ArrayBuffer | ArrayBufferView | BlobLike | DataView;
/**
* Intended to match DOM Blob, node-fetch Blob, node:buffer Blob, etc.
* Don't add arrayBuffer here, node-fetch doesn't have it
*/
interface BlobLike {
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size) */
- readonly size: number;
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type) */
- readonly type: string;
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text) */
- text(): Promise;
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice) */
- slice(start?: number, end?: number): BlobLike;
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size) */
+ readonly size: number;
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type) */
+ readonly type: string;
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text) */
+ text(): Promise;
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice) */
+ slice(start?: number, end?: number): BlobLike;
}
/**
* This check adds the arrayBuffer() method type because it is available and used at runtime
*/
-const isBlobLike = (
- value: any,
-): value is BlobLike & { arrayBuffer(): Promise } =>
- value != null &&
- typeof value === "object" &&
- typeof value.size === "number" &&
- typeof value.type === "string" &&
- typeof value.text === "function" &&
- typeof value.slice === "function" &&
- typeof value.arrayBuffer === "function";
+const isBlobLike = (value: any): value is BlobLike & { arrayBuffer(): Promise } =>
+ value != null &&
+ typeof value === "object" &&
+ typeof value.size === "number" &&
+ typeof value.type === "string" &&
+ typeof value.text === "function" &&
+ typeof value.slice === "function" &&
+ typeof value.arrayBuffer === "function";
/**
* Intended to match DOM File, node:buffer File, undici File, etc.
*/
interface FileLike extends BlobLike {
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified) */
- readonly lastModified: number;
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name) */
- readonly name?: string | undefined;
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified) */
+ readonly lastModified: number;
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name) */
+ readonly name?: string | undefined;
}
/**
* This check adds the arrayBuffer() method type because it is available and used at runtime
*/
-const isFileLike = (
- value: any,
-): value is FileLike & { arrayBuffer(): Promise } =>
- value != null &&
- typeof value === "object" &&
- typeof value.name === "string" &&
- typeof value.lastModified === "number" &&
- isBlobLike(value);
+const isFileLike = (value: any): value is FileLike & { arrayBuffer(): Promise } =>
+ value != null &&
+ typeof value === "object" &&
+ typeof value.name === "string" &&
+ typeof value.lastModified === "number" &&
+ isBlobLike(value);
/**
* Intended to match DOM Response, node-fetch Response, undici Response, etc.
*/
export interface ResponseLike {
- url: string;
- blob(): Promise;
+ url: string;
+ blob(): Promise;
}
const isResponseLike = (value: any): value is ResponseLike =>
- value != null &&
- typeof value === "object" &&
- typeof value.url === "string" &&
- typeof value.blob === "function";
+ value != null &&
+ typeof value === "object" &&
+ typeof value.url === "string" &&
+ typeof value.blob === "function";
export type ToFileInput =
- | FileLike
- | ResponseLike
- | Exclude
- | AsyncIterable;
+ | FileLike
+ | ResponseLike
+ | Exclude
+ | AsyncIterable;
/**
* Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats
@@ -90,78 +81,76 @@ export type ToFileInput =
* @returns a {@link File} with the given properties
*/
export async function toFile(
- value: ToFileInput | PromiseLike,
- name?: string | null | undefined,
- options?: FilePropertyBag | undefined,
+ value: ToFileInput | PromiseLike,
+ name?: string | null | undefined,
+ options?: FilePropertyBag | undefined,
): Promise {
- checkFileSupport();
+ checkFileSupport();
- // If it's a promise, resolve it.
- value = await value;
+ // If it's a promise, resolve it.
+ value = await value;
- // If we've been given a `File` we don't need to do anything
- if (isFileLike(value)) {
- if (value instanceof File) {
- return value;
- }
- return makeFile([await value.arrayBuffer()], value.name);
- }
+ // If we've been given a `File` we don't need to do anything
+ if (isFileLike(value)) {
+ if (value instanceof File) {
+ return value;
+ }
+ return makeFile([await value.arrayBuffer()], value.name);
+ }
- if (isResponseLike(value)) {
- const blob = await value.blob();
- name ||= new URL(value.url).pathname.split(/[\\/]/).pop();
+ if (isResponseLike(value)) {
+ const blob = await value.blob();
+ name ||= new URL(value.url).pathname.split(/[\\/]/).pop();
- return makeFile(await getBytes(blob), name, options);
- }
+ return makeFile(await getBytes(blob), name, options);
+ }
- const parts = await getBytes(value);
+ const parts = await getBytes(value);
- name ||= getName(value);
+ name ||= getName(value);
- if (!options?.type) {
- const type = parts.find(
- (part) => typeof part === "object" && "type" in part && part.type,
- );
- if (typeof type === "string") {
- options = { ...options, type };
- }
- }
+ if (!options?.type) {
+ const type = parts.find((part) => typeof part === "object" && "type" in part && part.type);
+ if (typeof type === "string") {
+ options = { ...options, type };
+ }
+ }
- return makeFile(parts, name, options);
+ return makeFile(parts, name, options);
}
async function getBytes(
- value: BlobLikePart | AsyncIterable,
+ value: BlobLikePart | AsyncIterable,
): Promise> {
- let parts: Array = [];
- if (
- typeof value === "string" ||
- ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc.
- value instanceof ArrayBuffer
- ) {
- parts.push(value);
- } else if (isBlobLike(value)) {
- parts.push(value instanceof Blob ? value : await value.arrayBuffer());
- } else if (
- isAsyncIterable(value) // includes Readable, ReadableStream, etc.
- ) {
- for await (const chunk of value) {
- parts.push(...(await getBytes(chunk as BlobLikePart))); // TODO, consider validating?
- }
- } else {
- const constructor = value?.constructor?.name;
- throw new Error(
- `Unexpected data type: ${typeof value}${
- constructor ? `; constructor: ${constructor}` : ""
- }${propsForError(value)}`,
- );
- }
-
- return parts;
+ const parts: Array = [];
+ if (
+ typeof value === "string" ||
+ ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc.
+ value instanceof ArrayBuffer
+ ) {
+ parts.push(value);
+ } else if (isBlobLike(value)) {
+ parts.push(value instanceof Blob ? value : await value.arrayBuffer());
+ } else if (
+ isAsyncIterable(value) // includes Readable, ReadableStream, etc.
+ ) {
+ for await (const chunk of value) {
+ parts.push(...(await getBytes(chunk as BlobLikePart))); // TODO, consider validating?
+ }
+ } else {
+ const constructor = value?.constructor?.name;
+ throw new Error(
+ `Unexpected data type: ${typeof value}${
+ constructor ? `; constructor: ${constructor}` : ""
+ }${propsForError(value)}`,
+ );
+ }
+
+ return parts;
}
function propsForError(value: unknown): string {
- if (typeof value !== "object" || value === null) return "";
- const props = Object.getOwnPropertyNames(value);
- return `; props: [${props.map((p) => `"${p}"`).join(", ")}]`;
+ if (typeof value !== "object" || value === null) return "";
+ const props = Object.getOwnPropertyNames(value);
+ return `; props: [${props.map((p) => `"${p}"`).join(", ")}]`;
}
diff --git a/packages/google-calendar/src/internal/types.ts b/packages/google-calendar/src/internal/types.ts
index 7cb3ead7..2541e752 100644
--- a/packages/google-calendar/src/internal/types.ts
+++ b/packages/google-calendar/src/internal/types.ts
@@ -13,28 +13,27 @@ type NotAny = [unknown] extends [T] ? never : T;
* Some environments overload the global fetch function, and Parameters only gets the last signature.
*/
type OverloadedParameters = T extends {
- (...args: infer A): unknown;
- (...args: infer B): unknown;
- (...args: infer C): unknown;
- (...args: infer D): unknown;
+ (...args: infer A): unknown;
+ (...args: infer B): unknown;
+ (...args: infer C): unknown;
+ (...args: infer D): unknown;
}
- ? A | B | C | D
- : T extends {
- (...args: infer A): unknown;
- (...args: infer B): unknown;
- (...args: infer C): unknown;
- }
- ? A | B | C
- : T extends {
- (...args: infer A): unknown;
- (...args: infer B): unknown;
- }
- ? A | B
- : T extends (...args: infer A) => unknown
- ? A
- : never;
+ ? A | B | C | D
+ : T extends {
+ (...args: infer A): unknown;
+ (...args: infer B): unknown;
+ (...args: infer C): unknown;
+ }
+ ? A | B | C
+ : T extends {
+ (...args: infer A): unknown;
+ (...args: infer B): unknown;
+ }
+ ? A | B
+ : T extends (...args: infer A) => unknown
+ ? A
+ : never;
-/* eslint-disable */
/**
* These imports attempt to get types from a parent package's dependencies.
* Unresolved bare specifiers can trigger [automatic type acquisition][1] in some projects, which
@@ -59,72 +58,57 @@ type OverloadedParameters = T extends {
*/
/** @ts-ignore For users with \@types/node */
type UndiciTypesRequestInit =
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny<
- import("../../../../../../../../node_modules/undici-types").RequestInit
- >
- | NotAny<
- import("../../../../../../../../../node_modules/undici-types").RequestInit
- >
- | NotAny<
- import("../../../../../../../../../../node_modules/undici-types").RequestInit
- >;
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny;
/** @ts-ignore For users with undici */
type UndiciRequestInit =
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny<
- import("../../../../../../../../../../node_modules/undici").RequestInit
- >;
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny;
/** @ts-ignore For users with \@types/bun */
type BunRequestInit = globalThis.FetchRequestInit;
/** @ts-ignore For users with node-fetch */
type NodeFetchRequestInit =
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny
- | NotAny<
- import("../../../../../../../../node_modules/node-fetch").RequestInit
- >
- | NotAny<
- import("../../../../../../../../../node_modules/node-fetch").RequestInit
- >
- | NotAny<
- import("../../../../../../../../../../node_modules/node-fetch").RequestInit
- >;
+ | NotAny
+ | NotAny
+ | NotAny
+ | NotAny